Kotlin是如何专门编译的?

时间:2018-11-25 22:36:41

标签: kotlin compilation kotlin-native kotlin-js

我试图了解Kotlin源代码在编译时所经历的过程。 The documentation状态

  

针对JVM时,Kotlin会生成Java兼容的字节码。当针对JavaScript时,Kotlin会转换为ES5.1并生成与包括AMD和CommonJS在内的模块系统兼容的代码。当定位到本机时,Kotlin将通过LLVM生成特定于平台的代码。

我的理解是,当Kotlin针对JVM时,代码被编译/翻译成字节码,然后JVM将其解释(?)成机器码。这将是JIT(及时)编译的示例吗?

定位javascript时,会使用单词“ transpiles”。到底是什么代码被编译成什么,并且在任何步骤都被进一步解释或编译?

以本机为目标时,代码是否直接编译为机器代码? LLVM需要采取什么步骤?

最后,这是否意味着Kotlin既是编译语言又是解释语言?

1 个答案:

答案 0 :(得分:11)

  

<...>代码被编译/翻译为字节码,然后JVM将其解释(?)为机器码。这将是JIT(及时)编译的示例吗?

是的,当以JVM为目标时,Kotlin会编译为JVM *.class文件,该文件是字节码格式,以后可以由JVM解释,也可以由JVM在程序运行期间编译为机器代码。 (JIT),甚至提前编译为机器代码。在这里,Kotlin编译器不需要知道字节码的使用方式。

  

定位javascript时,会使用单词“ transpiles”。到底是什么代码被编译成什么,并且在任何步骤都被进一步解释或编译?

Kotlin / JS的目标格式是JavaScript源代码。您可以尝试构建任何Kotlin / JS示例和examine the *.js output files,其中包含Kotlin代码被转换为的JS源代码。我相信 transpile translate + compile )一词在这里用来强调目标格式是源代码,而不是二进制,而编译器仍然执行许多转换和优化。

同样,JavaScript源代码是经过解释的或JIT编译的,这取决于用于运行该程序的JavaScript引擎。

  

以本机为目标时,代码是否直接编译为机器代码? LLVM需要采取什么步骤?

Kotlin / Native有两种可能的目标形式:

  • 一个*.klib库,可以在另一个Kotlin / Native项目中重用。这是a ZIP archive containing LLVM bitcode along with some Kotlin-specific metadata
  • 特定于平台的二进制文件,采用多种格式之一,包括静态和动态库以及可执行文件。实际上,这是用于特定目标平台的机器代码,如果它是一个库,则可以用于链接;如果它是可执行文件,则可以直接运行。在这种情况下,Kotlin编译器会调用the LLVM linker lld来链接LLVM位代码中的二进制文件。