首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin代码是如何编译成本机代码的?

Kotlin代码是如何编译成本机代码的?
EN

Stack Overflow用户
提问于 2019-09-10 13:44:00
回答 1查看 2.1K关注 0票数 11

官方的Kotlin/native文档说Kotlin/Native

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

据我所知:

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

因此,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标准库,还是它是动态链接的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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/本机二进制文件中。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57872167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档