Skip to content

Commit

Permalink
[docs] update IR introduction
Browse files Browse the repository at this point in the history
  • Loading branch information
floatshadow committed Apr 29, 2024
1 parent c358131 commit 9dba785
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions docs/middle-ir-gen.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

正如课上可能提到过的,如果没有中间表示 (Intermediate Representation,简称 IR),n 门语言 m 种硬件平台各自写编译器,就可能需要 n * m 种编译器,但是 n 门语言的前端编译到一个统一的 IR 然后再由 IR 编译到不同的后端,这样只需要 n + m 个“编译器”.

但是,IR 的作用并不仅限于减少编译器开发的工作量,在现代编译器架构下,具体体现在 IR 所指代的对象宽泛化了,现在 IR 通常可以用于泛指“源代码”与“目标平台汇编”之间的各种表示形式,例如抽象语法树、目标无关的中间代码、三地址码风格的类机器代码层等,从中间代码所在的编译器层级来看
但是,IR 的作用并不仅限于减少编译器开发的工作量,在现代编译器架构下,具体体现在 IR 所指代的对象宽泛化了,现在 IR 通常可以用于泛指“源代码”与“目标平台汇编”之间的各种表示形式,例如抽象语法树、目标无关的中间代码、三地址码风格的类机器代码层等,从中间代码所在的抽象层次来看

- **抽象语法树 AST(高层 IR)**:树形结构,贴近源代码层,适合做语法糖的展开、构建符号表、类型检查等靠近编程语言的高层级抽象的任务.
它们和程序语言的设计风格息息相关,因此能够做一些更抽象、更高级的优化.
Expand All @@ -18,16 +18,29 @@
这一层非常靠近硬件,优化需要考虑不同指令的延迟、吞吐量、流水线、ABI 等,许多问题是 NP-Hard 的.

我们可以看到,实际上每一层“中间表示”都有各自的特点,依次从高抽象走向低级,适合做的任务也不同,每一层都是一个小型的“编译系统”,因此现代编译器通常会采用多层 IR.
此外,由于涉及的任务不同,不同层的 IR 所使用的数据结构也有所不同
此外,由于涉及的任务不同,IR 也有不同的结构结构特征

- **树或者图结构**:使用图(graph)来表示程序的信息,用节点表示程序里的对象,用边表示关系,此类结构一般能详尽准确地描述程序内的各类信息. 抽象语法树(AST)是一种典型的树形 IR.
- **线型结构**例如我们经常使用的 C 语言、汇编语言中语句和语句之间就是线型关系。你可以将这种中间代码看成是某种抽象计算机的一个简单的指令集。
- **线型结构**例如汇编语言中指令之间就是线型关系。你可以将这种中间代码看成是某种抽象计算机的一个简单的指令集。
- **混合型**:混合了图和线性两种中间代码风格,例如本实验所使用的 Accipit IR. Accipit IR 将代码组织成许多基本块,块内部采用线型表示,块与块之间采用图表示.

Rust 就曾经在前端增加了一层图结构 [MIR](https://blog.rust-lang.org/2016/04/19/MIR.html),borrow checker 就在 MIR 层上进行分析:

![Introducing MIR](images/flow.svg)

当然,并不是说抽象层级越高,相应地结构特征就会越复杂.
例如,C 语言的源码是线型的字符串,语句与语句之间也线型的;WASM 汇编可以使用类似树形的 SExpr 格式嵌套表示.

```wasm title="add.wast"
(func (export "add") (param $x i32) (param $y i32)
(result i32)
(i32.add
(local.get $x)
(local.get $y)
)
)
```


## 中间代码的定义

Expand Down

0 comments on commit 9dba785

Please sign in to comment.