当kotlin是一种编译语言时,Kotlin笔记本如何工作?

时间:2018-05-08 04:57:44

标签: kotlin jupyter-notebook

我试过the Kotlin notebook extension,我想知道幕后发生了什么 我使用过python的笔记本,因为python是一种解释语言,它在笔记本中起作用似乎很自然。

Kotlin notebook

我的理解是,在编写Kotlin代码之后,我需要在执行它之前编译它(No?)。但是在笔记本中,如果我在一个单元格中创建一个类,我可以在下一个单元格中实例化一个对象,但我无法弄清楚它是如何工作的。

编辑: 对于许多编译语言来说似乎有IPYTHON kernels。然而问题仍然存在"编译的编程语言如何在交互式jupyter笔记本环境中工作"?

2 个答案:

答案 0 :(得分:7)

Kotlin有一种特殊的脚本模式(除了普通的编译模式),我们经常命名一个带有后缀.kts的Kotlin脚本。

您可以使用命令行Kotlin编译器尝试此操作:

  • println("hello world")
  • 中写下a.kts
  • 运行kotlinc -script a.kts

你会在屏幕上看到hello world

如果您有IntelliJ IDEA,请尝试右键单击.kts文件并选择Run选项。你会看到命令行输出。

  

编译的编程语言如何在交互式jupyter笔记本环境中工作?

这里与“编译”无关。这是Kotlin编译器的特殊功能(将kotlin代码作为脚本运行) 并非所有语言都具有此类功能。这不是通用的。

答案 1 :(得分:0)

有人可能会说没有一种解释语言,但我不会走那么远。

解释是一种用于实现编程语言的技术。许多语言都有多种实现,而这些实现经常使用不同的技术。例如,Java有一个ton of implementations,并且它们使用的技术从提前编译+字节码解释,提前编译+ JIT字节码到机器码编译,提前源-机器码的编译和纯解释。一些实现使用混合技术。

Python也有multiple implementations。它们主要基于字节码解释和字节码到机器码的JIT编译。据我所知,没有提前的机器码编译器(创建这样的编译器不是没有可能,但对Python可能并不是很有益)。默认情况下,Python会在首次运行时将源代码编译为内存中的字节码,并将字节码转储到*.pyc文件中。在第二次运行时,它将从磁盘加载字节码。然后,它解释内存中的字节码。因此,Python通常也有一个编译阶段,只是不可见。

那么,人们说“口译语言”是什么意思?通常,这意味着某种语言具有一种实现或一种 Leading 实现,而后者比其他语言(例如CPython)流行得多,并且领先的实现提供了解释器。这并不意味着没有这种语言的提前编译器,或者从概念上讲,不可能创建这种语言。这也不意味着不能解释通常使用提前编译器实现的其他语言。

考虑到任何编程语言和提前编译器形式的实现,您可以通过将编译器调用和程序执行(直接或通过解释器)包装在单个外壳中来创建简单的“解释”实现脚本或简单的帮助程序。例如,您可以将二进制文件/工件保存在/tmp中。如果您可以以库的形式(而不是CLI程序)访问编译器,并且编译器公开了适当的接口,则可以跳过磁盘I / O步骤并将编译器输出写入内存。可能会更快一些,问题也不会那么多,但是从概念上讲,差别并不大。

Kotlin Jupyter内核是通过这种方式实现的。它使用了尚未稳定但有文档记录的解决方案,有时称为"KotlinScript"。我还没有阅读适当的源代码(可以随意阅读),但是正如您已经知道的那样,它唯一要做的就是转换(编译)代码然后执行它(就像在Python中一样) 。 KotlinScript如何实现此目标(无论是通过子进程调用编译器还是使用Java库,是否将输出写入磁盘...)都是实现细节。