官方Kotlin / Native documentation指出Kotlin / Native
..是Kotlin编译器的基于LLVM的后端。
据我了解:
因此,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标准库,或者它是动态链接的?
答案 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二进制文件中。