Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin代码是如何编译成本机代码的?_Kotlin_Kotlin Native - Fatal编程技术网

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

Kotlin代码是如何编译成本机代码的?,kotlin,kotlin-native,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/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/本机插件将Kotlin中间表示(IR)转换为本机代码(即机器可执行的代码)

这个报价正确吗

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

最终的特定于平台的二进制文件是否包含本机Kotlin标准库,还是动态链接

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

这个报价正确吗

是的,非常正确。中间表示法(IR)是一种通用表示Kotlin程序的形式,而不考虑平台。然后,特定于平台的后端将IR转换为最终的二进制形式–Kotlin/JVM的JVM类文件、LLVM位代码和其他元数据,打包成Kotlin/Native的
*.klib

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

中间表示是Kotlin编译器的一个实现细节,除Kotlin编译器本身外,其他任何使用者都不使用它,因此开发人员不应该关心它。对于JVM,它甚至保存在内存中,从不写入二进制文件。对于Kotlin/Native,它实际上是序列化并写入
*.klib
重复使用

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

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

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


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

如果我理解正确,那么基本上是这样,即使前端编译器在3个编译目标(JVM、JS和本机)中非常相似,并不是只有一个工具可以将Kotlin转换为IR,对吗?每个编译目标都有自己的前端编译器,但如果代码相同,则其特定前端进程的输出将产生相同的IR?那么klib中的IR是LLVM IR或Kotlin特定的IR?对于JVM,编译过程非常清楚:kotlinc do我想Kotlin/JS和kotlin2js都是一样的。但是kotlinc在里面做什么?它的步骤是什么?Kotlin/Native的前端和后端编译器是什么?