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

时间:2019-09-10 13:44:00

标签: kotlin kotlin-native

官方Kotlin / Native documentation指出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后端->本机二进制文件)

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

  

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

此报价正确吗?

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

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

1 个答案:

答案 0 :(得分:7)

  
    

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

  
     

此报价正确吗?

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

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

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

  

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

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

  

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

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