独家揭秘:Kotlin K2编译器的前世今生

news2024/10/5 15:35:24

Kotlin

独家揭秘:Kotlin K2编译器的前世今生

也许您已经观看了最近的 KotlinConf 2023 主题演讲,关于 K2 编译器的更新。什么是 K2 编译器?
在搞清楚这个问题之前,我们需要了解Kotlin 使用的不同种类的编译器及其差异,以及编译过程中可能发生的不同种类的数据转换的简要概述。

基础知识

源代码通过Kotlin编译器提交,将可读的人类源代码转换为针对任何指定机器的可执行机器代码。
如果我们粗略地过度简化编译器,我们可以将编译器视为执行两个任务:编译和降级。编译将一种数据格式更改为另一种数据格式,而降级通常简化/优化现有的数据格式。

编译与降级
当 Kotlin 代码编译时,会选择一组配置来运行 Kotlin 编译器,例如决定在哪个环境上运行(如 CLI、Analysis API、处理器选项),选择要连接到编译器的插件,以及选择前端和后端。
Kotlin编译器有两个前端:K1和K2,以及四个后端:JVM、JS、本地和实验性的WASM
Kotlin编译器有两个前端:K1和K2,以及四个后端:JVM、JS、本地和实验性的WASM。

K1/K2前端

Kotlin编译器有两个前端:K1前端(在源代码中用Fe10-表示)和K2前端(有时称为FIR前端,在源代码中有时用Fir-表示)。选择前端决定向后端发送哪些信息以进行IR生成和后续目标生成。

K1和K2前端在开始阶段共享类似的阶段,只不过FIR(前端中间表示)前端在将转换后的代码发送到后端之前,会引入一种附加的数据格式 —— 后端将立即将该数据格式更改为IR(中间表示)以进行进一步处理。

K1前端

K1前端(Fe10-)接受人类可读的源代码,将文本分解为词法令牌,创建PSI树,并进行解析来创建附加的数据结构,如描述符和BindingContext,然后将其发送到后端。
K1 前端数据格式在发送到后端之前先进行了更改:源代码 → tokens → AST/PSI

PSI代表“程序结构接口”,它是在IntelliJ中的层,有助于解析文件,并在编译后创建语法/语义代码模型。
对于K1前端,解析在PSI树上执行以生成描述符和BindingContext,它们全部被发送到后端,以转换为IR

  • 根据元素类型,描述符可能包含上下文,作用域,包含信息,覆盖,伴随对象等等。
  • BindingContext是一个大映射,其中PSI是映射到描述符和其他信息的关键字,以后可用于对代码进行推断。

K1编译器将PSI和BindingContext发送到后端,后端使用Psi2Ir将信息转换为IR以进行进一步处理

然而,像这样发送PSIBindingContext已经导致编译器性能问题。

根据Dmitriy Novozhilov在Kotlinlang的Slack中的解释,解析结果也存储在BindingContext中,因此CPU无法快速缓存对象。所有描述符都是惰性的,这导致编译器在代码不同部分之间跳跃,杀死了许多JIT优化。

K2(FIR)前端编译器

旨在提高编译器性能。JetBrains创建了这个新的编译器前端(有时也称为FIR前端),来替换现有的前端编译器。它不仅仅是将PSI和BindingContext发送到前端,还会生成额外的数据格式,以卸载后端本来要完成的一部分工作。

K2前端将原始PSI作为输入,生成原始FIR,并在不同的阶段对其进行转换,填充语义信息树。然后,解析后的FIR将被发送到后端。
K1前端数据格式在发送到后端之前会发生变化:源代码 → 标记 → AST/PSI → 原始FIR → FIR
FIR是一个可变树,由解析器的结果——生成的PSI树建立而来。建立原始FIR之后,可以通过多个处理器进行操作,这些处理器将解析代码并代表编译器管道的不同阶段。

最后,会运行一个检查器阶段,它会使用FIR并报告警告和错误的不同诊断信息。如果有错误,则编译会停止,因为没有必要将有错误的代码发送到后端。如果没有错误,解析后的FIR将转换为后端IR。
K2编译器将经处理的FIR发送到后端,后端使用Fir2Ir将信息转换为IR以进行进一步的处理

Kotlin编译器后端

我们已经进入后端了!记住,我们可以选择4个后端:JVM、JS、Native和新的实验性WASM。本文将讨论更稳定的后端——JVM、JS和Native。

Sletvana Isavoka的演讲《关于新的Kotlin K2编译器,每个人都必须知道的事情》最好地解释了后端的工作原理:
Kotlin源代码通过前端进行处理。3个箭头指向前端,表示前端输出某种语法树和语义信息,并进入3个可能的选择——JVM IR后端、JS IR后端和Native IR后端
需要注意的重要事项是,无论选择哪个后端,IR生成器和优化器始终是后端处理的相同起点。然后选择的配置将运行所需的代码生成模式:

  • JVM IR 后端使用 JVM 字节码生成器 + 优化器 来生成 .class 文件
  • JS IR 后端使用 JavaScript 生成器 + 优化器 来生成 .js 文件
  • Native IR 后端使用 LLVM 位码生成器 + 优化器 来生成 .so 文件
    假设我们将之前的 K2 示例发送到后端,我们可以继续使用这个示例作为数据格式:

frontend: source code → tokens → AST/PSI → Raw FIR → FIR | backend: IR → Lowered IR → Target Code
前端:源代码 → 令牌 → 抽象语法树/程序结构接口 → 原始 FIR → FIR | 后端:IR → 降级的IR → 目标代码

发送已解决的FIR回到后端后,FIR被转换为IR,即中间表示形式。IR作为CPU级架构的另一种抽象表示形式生成。对IR进行控制流和调用堆栈的分析,并执行机器相关的优化以创建Lowered IR。通常,这意味着简化操作(即3^2可能变为3*3),提高生成的机器码的性能和质量,并做出资源和存储决策。

最终生成目标代码,并对生成的目标代码进行优化,以便将其优化后的目标代码发送到任何机器以执行。这是一个超高层次的概述,但我希望这篇文章对我们继续深入学习Kotlin编译器的速成课程有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python--数据类型

Python--数据类型 <font colorblue >一、数据的分类<font colorblue >二、数值类型<font colorblue >1、整型&#xff1a;int<font colorblue >2、浮点型&#xff1a;float<font colorblue >3、复数类型&#xff1a;complex <font colorblue …

加速应用迭代与更新:Weex与小程序容器的快速开发之道

Weex是一个跨平台的移动应用开发框架&#xff0c;由阿里巴巴旗下的阿里巴巴前端团队开发。它允许开发者使用单一的代码库来构建同时适用于iOS和Android平台的移动应用。Weex使用基于Vue.js的声明式语法来描述应用程序的界面&#xff0c;并通过JavaScript运行时引擎在移动设备上…

中国人民大学与加拿大女王大学金融硕士——人到中年还有必要在职读研吗?

人到中年&#xff0c;深刻的感受到自己能够掌控的事情越来越少&#xff0c;而焦虑越来越多。事业进入瓶颈期&#xff0c;如何开拓进阶呢&#xff0c;如何做更好的自己呢&#xff1f;看到周围有人再提升学历&#xff0c;想想自己的年龄&#xff0c;不禁感叹&#xff0c;到了中年…

牛客网最热门的1000 多Java面试题,20+ 大厂必考点及Java面试框架知识点

Java 面试 “金三银四&#xff0c;金九银十”这个字眼对于程序员应该是再熟悉不过的了&#xff0c;每年的金三银四&#xff0c;金九银十都会有很多程序员找工作、跳槽等一系列的安排。说实话&#xff0c;面试中 7 分靠能力&#xff0c;3 分靠技能&#xff1b;在刚开始的时候介…

免费Midjourney来袭

发现一个镜像站&#xff0c;和之前发的镜像站不一样&#xff0c;这个集成了midjourney和chatgpt&#xff0c;且免翻&#xff0c;相信给很多很多用户都提供了便利吧&#xff01; 先把网站贴出来&#xff0c;有兴趣的伙伴可以玩一玩 关于以图生图&#xff0c;现在网站支持本地上…

好程序员:月薪2万程序员的简历,原来长这个样子!

6月份现在正是招聘季节&#xff0c;不少同学java岗位投递不少&#xff0c;但回复不多&#xff0c;根本原因可能是java面试简历不够吸引人。 你的java简历不会写&#xff1f;看看别人就知道咋写了&#xff0c;这里给大家拆解一份好程序员月薪2万的java简历。 java自我评价模块&a…

ABB CI546 3BSE012545R1 模块

ABB CI546 3BSE012545R1 模块. ABB CI546 3BSE012545R1 模块 电子电工技术的电力系统分析 1电子电工技能特色 电子电工技能是凭仗计算机技能开展起来的&#xff0c;并朝着智能化、网络化的方向开展。随着时代的开展&#xff0c;新式技能不断涌现&#xff0c;使传统电工技能运用…

2.Apollo测试部署-linux

1.创建数据库 1) 由于开发环境,测试环境, 生产环境用的一个portal&#xff0c;所以只需要创建ApolloConfigDB数据库 2) 创建后如下图: 2.部署服务apollo-adminservice,apollo-configservice 1) 分别修改两个服务下的数据库配置文件&#xff1a;/config/application-github.prop…

【Spring】Spring框架介绍,功能模块,容器知识和有关Spring的生态圈的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

停车场一键求助对讲系统

停车场一键求助对讲系统 适用性高&#xff0c;保障性能强 无论是商场的停车场&#xff0c;还是社区的停车场&#xff0c;我们的系统都能轻松应对。此外&#xff0c;可靠的保障性能&#xff0c;更能为车主提供便利的服务保障。 防盗警报&#xff0c;实现车位管理 在停车场内&…

【MySQL】 IS NOT NULL 和 != NULL 的区别?

背景 最近在开发小伙伴的需求&#xff0c;遇到了一个数据库统计的问题&#xff0c; is not null 结果正确 &#xff01;null 结果就不对&#xff0c;然后就激发了获取真理的想法&#xff0c;那必须的查查 咋回事嘞&#xff1f; 开整 在用MySQL的过程中&#xff0c;你是否存…

PMP考试 I 我该如何高效准备?

一&#xff1a;PMP考试的项目生命周期治理 可把PMP考试当成一个项目&#xff0c;先规划出此项目的生命周期&#xff0c;进行严格的生命周期管理和阶段治理工作&#xff0c;可简单分成3个阶段&#xff08;1个月每阶段&#xff09;&#xff1a; 阶段一&#xff1a;找到感觉 第…

Nginx源码部署1.18.0版本

文章目录 一、Nginx源码部署1.18.0版本二、Nginx服务相关参数三、Nginx相关命令四、Nginx启动进程介绍 一、Nginx源码部署1.18.0版本 依赖安装&#xff1a; yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel# gcc: C语言编辑器 nginx是C语言编写的 所以…

Servlet 数据库访问

目录 前言 测试数据 访问数据库 前言 Servlet 数据库访问之前&#xff0c;Java MySQL 连接设置相关驱动及配置。 测试数据 -- 创建表 CREATE TABLE websites ( id INT(11) NOT NULL AUTO_INCREMENT, name CHAR(20) NOT NULL DEFAULT COMMENT 站点名称, url VARCHAR…

松下伺服 报警代码40

伺服型号&#xff1a;MADLN1BE (MINAS A6B系列) 现象&#xff1a;将将编码器线电机之间拔后&#xff0c;报40号故障&#xff0c;断电重启后故障仍然存在。 1.查询松下官网提示&#xff1a; 2.下载PANATERM软件&#xff0c;连USB线&#xff0c;按如下图点警报 出现下图&#x…

mybatis 简单明了

首先定义MapperScan MapperScan会导入MapperScanRegistrar。这个类很重要。这个类注意是把path下的bean扫描的定义definition扫描进来。 这个register方法是什么时候执行的&#xff1f; 由于它是imports进来的&#xff0c;项目启动后configurationclass parse的时候会把import…

Springboot 集成Druid

Springboot 集成Druid Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。本篇主要讲解一下 Springboot中如何集成 Druid &#xff01; ​ 1.添加Druid依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid-s…

【小白向】树莓派连接手机热点后 设置静态IP

树莓派连接手机热点后 设置静态IP 1.连接至手机热点2.查看当前 IP 地址3.修改 dhcpcd.conf 文件4.重启网络服务5.检查网络设置 1.连接至手机热点 在树莓派上打开 Wi-Fi 设置&#xff0c;并选择你要连接的手机热点&#xff0c;输入密码连接热点&#xff0c;确保你已经成功连接至…

十年磨一剑,超级人工智能如果出现,人类将如何应对挑战?

一、前言 创造出ChatGPT的OpenAI公司 CEO&#xff08;Sam&#xff09;称“十年内将出现超级人工智能”&#xff0c;你别不信&#xff0c;这极有可能。 具体来说&#xff0c;我们在人工智能能力方面看到了增长速度。我们现在需要做什么&#xff0c;好为将它们引入世界做好负责任…

开源共建下一代智能终端操作系统根社区 OpenHarmony携手伙伴聚力前行

6月12日,2023开放原子全球开源峰会OpenHarmony 分论坛(以下简称“分论坛”)在北京成功召开。OpenHarmony共建单位、生态伙伴齐聚一堂,共同展现了OpenHarmony在千行百业的落地成果、繁荣生态与最新技术进展。OpenHarmony项目群工作委员会委员、华为终端BG软件部副总裁柳晓见受邀…