Kotlin如何专门编译?

Ale*_*sso 4 compilation kotlin kotlin-native kotlin-js

我正在尝试理解Kotlin源代码在编译时经历的旅程.文件说明

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

我的理解是,当Kotlin瞄准JVM时,代码被编译/转换为字节码,然后JVM将其解释为机器代码.这是JIT(及时)编译的一个例子吗?

当定位javascript时,使用单词"transpiles".编译到底的代码究竟是什么,并且在任何步骤中进一步解释或编译?

当定位本机时,代码是直接编译到机器代码吗?LLVM采取了哪些步骤?

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

hot*_*key 11

<...>将代码编译/转换为字节码,然后JVM将其解释为(机器代码).这是JIT(及时)编译的一个例子吗?

是的,当针对JVM时,Kotlin被编译为JVM *.class文件,这是一种字节码格式,以后可以由JVM解释,也可以在程序运行期间由JVM编译为机器代码,或者甚至是在前面编译-of-time(AOT)到机器代码.在这里,Kotlin编译器不需要知道如何使用字节码.

当定位javascript时,使用单词"transpiles".编译到底的代码究竟是什么,并且在任何步骤中进一步解释或编译?

Kotlin/JS的目标格式是JavaScript源代码.您可以尝试构建任何Kotlin/JS示例,并检查*.js包含Kotlin代码转换为的JS源代码输出文件.我相信在这里使用transpile(translate + compile)这个词来强调目标格式是源代码而不是二进制,而编译器仍然执行大量的转换和优化.

JavaScript源代码也可以解释或JIT编译,这取决于用于运行程序的JavaScript引擎.

当定位本机时,代码是直接编译到机器代码吗?LLVM采取了哪些步骤?

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

  • 一个*.klib可以在另一个科特林/本地项目被重用库.这是一个ZIP存档,包含LLVM bitcode以及一些特定于Kotlin的元数据.
  • 特定于平台的二进制文件,采用多种格式之一,包括静态和动态库以及可执行文件.实际上,这是特定目标平台的机器代码,如果它是库,可以用于链接,如果它是可执行文件,则可以直接运行.在这种情况下,Kotlin编译器调用LLVM链接器lld来链接LLVM bitcode中的二进制文件.