官方的Kotlin/native文档说Kotlin/Native
。。是用于Kotlin编译器的基于LLVM的后端。
据我所知:
因此,Kotlin/本机是否将Java字节码转换为LLVM IR?如果是这样的话,说明Kotlin/原住民是LLVM后端是正确的吗?Kotlin代码被编译成LLVM IR吗?如果没有,那么每个编译步骤的输入和输出是什么?(例如: Kotlin -(kotlinc)-> Java字节码-(LLVM后端->本机二进制)
这博客文章指出,Kotlin前端编译器(我认为它指的是kotlinc)生成Kotlin IR,我从未读过。
Kotlin编译器有一个前端,但多个后端,这取决于您用于构建代码的插件。Kotlin /本机插件将Kotlin中间表示(IR)转换为本机代码(即机器可执行代码)。
这句话对吗?
它告诉您,对于Java字节码、本机代码和JavaScript,编译过程是相同的。您可以编译Kotlin代码,然后有3个后端编译器提供预期的输出格式(Java字节码、JavaScript、二进制代码)。
最终平台特定的二进制文件是否包含本机Kotlin标准库,还是它是动态链接的?
发布于 2019-09-10 14:47:10
Kotlin编译器有一个前端,但多个后端,这取决于您用于构建代码的插件。Kotlin /本机插件将Kotlin中间表示(IR)转换为本机代码(即机器可执行代码)。这句话对吗?
是的,非常正确。中间表示(IR)是一种普遍表示Kotlin程序的形式,而不管平台如何。然后,特定于平台的后端将IR转换为最终的二进制形式-- Kotlin/JVM、LLVM bitcode和其他元数据打包到Kotlin/ *.klib中的JVM类文件。
因此,Kotlin/本机不以任何方式处理JVM字节码。
中间表示是Kotlin编译器的实现细节,除了Kotlin编译器本身之外,其他任何使用者都不会使用它,所以开发人员不应该关心它。对于JVM,它甚至保存在内存中,从未写入二进制文件。对于Kotlin/本机,它实际上是序列化的,并写入到*.klib中以供重用。
它告诉您,对于Java字节码、本机代码和JavaScript,编译过程是相同的。您可以编译Kotlin代码,然后有3个后端编译器提供预期的输出格式(Java字节码、JavaScript、二进制代码)。
实际上,编译过程的一部分是相同的,即前端语言分析,包括解析、调用解析、类型推断、诊断和其他不需要任何特定于平台的代码转换的步骤。即便如此,前端部分还是会针对每个平台进行调优,因为这些平台允许不同的语言特性集,并提供不同的诊断集。
最后一个问题是,最终平台特定的二进制文件是否包括本地的Kotlin标准库?或者它是动态链接的?
目前,标准库静态地链接到生成的Kotlin/本机二进制文件中。
https://stackoverflow.com/questions/57872167
复制相似问题