Kotlin具体是如何编译的?

How is Kotlin specifically compiled?

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

When targeting the JVM, Kotlin produces Java compatible bytecode. When targeting JavaScript, Kotlin transpiles to ES5.1 and generates code which is compatible with module systems including AMD and CommonJS. When targeting native, Kotlin will produce platform-specific code (via LLVM).

我的理解是,当 Kotlin 以 JVM 为目标时,代码 compiled/translated 到字节码,然后 JVM 将其解释(?)到机器码。这会是 JIT(及时)编译的一个例子吗?

定位 javascript 时使用 "transpiles" 一词。代码到底被编译成什么,在任何一步都被解释或进一步编译?

针对本机时,代码是否直接编译为机器码? LLVM 经历了哪些步骤?

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

<...> the code is compiled/translated down to bytecode and then the JVM interprets(?) it down to machine code. Would this be an example of JIT(Just in time) compilation?

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

When targeting javascript the word "transpiles" is used. What exactly is the code compiled down to and is it interpreted or compiled further down at any step?

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

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

When targeting native, is code compiled directly to machine code? What steps does LLVM take it through?

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

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