我试图了解Kotlin源代码在编译时所经历的过程。 The documentation状态
针对JVM时,Kotlin会生成Java兼容的字节码。当针对JavaScript时,Kotlin会转换为ES5.1并生成与包括AMD和CommonJS在内的模块系统兼容的代码。当定位到本机时,Kotlin将通过LLVM生成特定于平台的代码。
我的理解是,当Kotlin针对JVM时,代码被编译/翻译成字节码,然后JVM将其解释(?)成机器码。这将是JIT(及时)编译的示例吗?
定位javascript时,会使用单词“ transpiles”。到底是什么代码被编译成什么,并且在任何步骤都被进一步解释或编译?
以本机为目标时,代码是否直接编译为机器代码? LLVM需要采取什么步骤?
最后,这是否意味着Kotlin既是编译语言又是解释语言?
答案 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。lld
来链接LLVM位代码中的二进制文件。