Kotlin代码如何编译成本机代码?

And*_*eas 6 kotlin kotlin-native

Kotlin / Native的官方文档指出Kotlin / Native

..是Kotlin编译器基于LLVM的后端。

据我所理解:

  • Kotlin编译器(kotlinc)从您的Kotlin源文件生成.class文件(带有Java字节码)。
  • 通用LLVM后端(与Kotlin不相关)采用LLVM IR并将其转换为二进制代码。

因此,Kotlin / Native是否将Java字节码转换为LLVM IR?如果是这样,声明Kotlin / Native是LLVM后端是否正确?Kotlin代码是否可以编译到LLVM IR中?如果不是,那么每个编译步骤的输入和输出是什么?(例如:Kotlin-(kotlinc)-> Java字节码-(LLVM后端->本机二进制)

这篇博客文章指出Kotlin前端编译器(我认为它是指kotlinc)产生了我从未读过的Kotlin IR。

Kotlin编译器只有一个前端,但有多个后端,具体取决于您用来构建代码的插件。Kotlin / Native插件将Kotlin中间表示(IR)转换为本机代码(即,机器可执行的代码)。

这个报价正确吗?

它告诉您Java字节码,本机代码和JavaScript的编译过程相同。您编译Kotlin代码,然后有3个后端编译器提供预期的输出格式(Java字节码,JavaScript,二进制代码)。

最终平台特定的二进制文件是否包含本地Kotlin标准库,或者它是动态链接的?

hot*_*key 7

Kotlin编译器只有一个前端,但有多个后端,具体取决于您用来构建代码的插件。Kotlin / Native插件将Kotlin中间表示(IR)转换为本机代码(即,机器可执行的代码)。

这个报价正确吗?

是的,这是正确的。中间表示(IR)是一种通用表示Kotlin程序的形式,与平台无关。然后,特定于平台的后端将IR转换为最终的二进制格式-Kotlin / JVM的JVM类文件,LLVM位代码和其他打包到*.klibKotlin / Native的元数据。

因此,Kotlin / Native不会以任何方式处理JVM字节码。

中间表示形式是Kotlin编译器的实现细节,除Kotlin编译器本身以外,其他任何使用者都不会使用它,因此,开发人员不必担心。对于JVM,它甚至保存在内存中,并且永远不会写入二进制文件。对于Kotlin / Native,它实际上已序列化并写入*.klib以便重新使用。

它告诉您Java字节码,本机代码和JavaScript的编译过程相同。您编译Kotlin代码,然后有3个后端编译器提供预期的输出格式(Java字节码,JavaScript,二进制代码)。

实际上,编译过程的一部分是相同的,即前端语言分析,它包括解析,调用解析,类型推断,诊断以及不需要任何特定于平台的代码转换的其他步骤。即便如此,前端部分仍针对每个平台进行了调整,因为这些平台允许使用不同的语言功能集并提供不同的诊断集。

最后一个问题是最终平台特定的二进制文件是否包括本地Kotlin标准库?还是动态链接?

当前,标准库静态链接到生成的Kotlin / Native二进制文件中。