useIR 的用途是什么?

sno*_*lax 18 android gradle kotlin

当我使用 android studio canary 时,我在 build.gradle 中注意到了一些事情。

它的具体用途是什么?

kotlinOptions.useIR = true 
Run Code Online (Sandbox Code Playgroud)

Som*_*boy 21

这是 Kotlin 编译器的一个选项,如果您计划使用多平台,则该选项非常有用。今年早些时候,新的 Kotlin 编译器宣布稳定并可供使用。看这个帖子

现在,什么是IR?

编译器通常主要有两个组件:

  • 一个前端
  • 一个后端

编译器前端会通过执行一些语法和语法验证来检查您的程序是否有效且有意义。

在前端确定您编写的程序正确之后,它会继续从源文件生成派生语法树之类的东西。

关于我要描述的任务是由前端还是由称为“中端”的第三个模块执行,存在一些讨论。

除了这些数据结构之外,编译器前端(或中间端)还可以输出称为 IR 的东西,它代表(中间表示或内部表示),它基本上是程序的简化(使用不太复杂的指令)版本。

编译器后端稍后会采用此中间表示来生成目标代码:

  • Kotlin/JS 后端输出 JavaScript 代码
  • Kotlin/Native 后端输出 llvm 代码
  • Kotlin/JVM 后端输出 Java 字节码

这是一个图表

在此输入图像描述

忘记将其添加到图中,但最后三个框都是编译器后端

现在; 伴随着所有这些喋喋不休:

该选项有什么useIR作用?本质上使用中间表示来生成适合您平台的目标代码

  • 实际上已经不再是实际的了。“从 Kotlin 1.5.0 开始,JVM IR 是默认后端,因此 useIR = true 不再有任何效果。我们应该在 1.5 中弃用此选项,并在未来版本中将其删除。” - https://youtrack.jetbrains.com/issue/KT-45504 (6认同)
  • 对用户来说有什么好处?性能提升? (4认同)