最近给领导报告研制捣鼓的AI编译器,里边有一个东西很吊炸天,研制天天说自己搞了个自研很牛逼的IR。
我给领导一报告,就被领导刁飞了,IR、IR,IR有啥用,能节省我的研制成本吗?IR能解决啥问题?我真的想知道,AI编译器中的IR是什么?
最近给领导报告研制捣鼓的AI编译器,里边有一个东西很吊炸天,研制天天说自己搞了个自研很牛逼的IR。
我给领导一报告,就被领导刁飞了,IR、IR,IR有啥用,能节省我的研制成本吗?IR能解决啥问题?我真的想知道,AI编译器中的IR是什么?
IR 中心表明
- 什么是IR
IR(Intermediate Representation)中心表明,是编译器中很重要的一种数据结构。编译器在完成前端作业今后,首要生成其自界说的 IR,并在此基础上履行各种优化算法,最终再生成方针代码。
从广义上看,编译器的运转过程中,中心节点的表明,都能够统称为 IR。从狭义上讲编译器的 IR,是指该编译器清晰界说的一种详细的数据结构,这个数据结构一般还随同着一种言语来表达程序,这个言语程序用来完成这个清晰界说的 IR。大部分时间,不太严厉区别这个清晰界说的 IR 以及其随同的言语程序,将其统称为 IR。
如图所示,在编译原理中,一般将编译器分为前端和后端。其间,前端会对所输入的程序进行词法剖析、语法剖析、语义剖析,然后生成中心表达形式 IR。后端会对 IR 进行优化,然后生成方针代码。
例如:LLVM 把前端和后端给拆分出来,在中心层清晰界说一种笼统的言语,这个言语就叫做 IR。界说了 IR 今后,前端的使命便是担任最终生成 IR,优化器则是担任优化生成的IR,而后端的使命便是把 IR 给转化成方针渠道的言语。LLVM 的 IR 运用 LLVM assembly language 或称为 LLVM language 来完成 LLVM IR的类型体系,就指的是 LLVM assembly language 中的类型体系。
因而,编译器的前端,优化器,后端之间,仅有交换的数据结构类型便是 IR,经过 IR 来完成不同模块的解耦。有些IR还会为其专门起一个名字,比如:Open64的IR一般叫做WHIRL IR,方舟编译器的IR叫做MAPLE IR,LLVM则一般就称为LLVM IR。
- IR的界说
IR 在一般情况下有两种用途,1)一种是用来做剖析和变换,2)一种是直接用于解释履行。
编译器中,根据 IR 的剖析和处理作业,前期阶段能够根据一些笼统层次比较高的语义,此刻所需的 IR 更挨近源代码。而在编译器后期阶段,则会运用低层次的、愈加挨近方针代码的语义。根据上述从高到低的层次笼统,IR 能够归结为三层:高层 HIR、中心层 MIR 和 底层 LIR。
- HIR
HIR(High IR)高层 IR,其主要担任根据源程序言语履行代码的剖析和变换。假设要开发一款 IDE,主要功能包含:发现语法错误、剖析符号之间的依赖联系(以便进行跳转、判别方法的重载等)、根据需要自动生成或修正一些代码(供给重构才能)。此刻对 IR 的需求是能够精确表达源程序言语的语义即可。
其实,AST 和符号表就能够满足上述需求。也便是说,AST 也能够算作一种特殊的 IR。如果要开发 IDE、代码翻译东西(从一门言语翻译到另一门言语)、代码生成东西、代码统计东西等,运用 AST(加上符号表)即可。根据 HIR,能够履行高层次的代码优化,比如常数折叠、内联相关等。在 Java 和 Go 的编译器中,有不少根据 AST 履行的优化作业。
- MIR
MIR(Middle IR),独立于源程序言语和硬件架构履行代码剖析和详细优化。大量的优化算法是通用的,没有必要依赖源程序言语的语法和语义,也没有必要依赖详细的硬件架构。这些优化包含部分算术优化、常量和变量传播、死代码删去等,完成剖析和优化功能。
由于 MIR 跟源程序代码和方针程序代码都无关,所以在编译优化算法(Pass)过程中,一般是根据 MIR,比如三地址代码(Three Address Code,TAC)。
三地址代码 TAC 的特点:最多有三个地址(也便是变量),其间赋值符号的左面是用来写入,右边最多能够有两个地址和一个操作符,用于读取数据并计算。
- LIR
LIR(Low IR),依赖于底层详细硬件架构做优化和代码生成。其指令一般能够与机器指令一一对应,比较简单翻译成机器指令或汇编代码。由于 LIR 体现了详细硬件(如 CPU)架构的底层特征,因而能够履行与详细 CPU 架构相关的优化。
多层 IR 和单层 IR 比较起来,具有较为显着的长处:
- 能够供给更多的源程序言语的信息
- IR表达上愈加地灵敏,愈加方便优化
- 使得优化算法和优化Pass履行愈加高效
如在 LLVM 编译器里,会根据笼统层次从高到低,采用了前后端别离的三段结构,这样在为编译器增加新的言语支撑或许新的方针渠道支撑的时候,就十分方便,大大减小了工程开销。而 LLVM IR 在这种前后端别离的三段结构之中,主要分开了三层 IR,IR 在整个编译器中则起着重要的承上启下作用。从便于开发者编写程序代码的了解到便于硬件机器的了解。