1 个不稳定版本
0.1.0 | 2021 年 4 月 1 日 |
---|
1434 在 开发工具 中
260KB
5K SLoC
🦉 yair
Yet Another Intermediate Representation (发音为 Ya! IR) 是一个完全用 Rust 编写的编译器中间表示。关键的设计决策使该表示具有独特性
- 单静态赋值表示 [1]。
- 没有 Φ (phi) 节点,基本块接受参数而不是 [2]。
- 指针是无类型的 - 它们只是内存中的地址 [3]。
- 无目标的表示,用于解耦组件。
- 库组件之间的强分离(你不需要构建、链接或使用不需要的组件)。
待办事项
- 核心
- 添加每个域的函数和函数多版本。
- 验证器
- 当有每个域的函数时(例如仅 CPU)检查
- 递归。
- 在冲突域中调用函数(从 CPU 调用 GPU)。
- 当有每个域的函数时(例如仅 CPU)检查
- 添加 cranelift 代码生成库。
- 添加优化器!
功能
以下功能包含在 yaircrate 中。
io
'io' 功能是 yaircrate 的一个 默认 功能。它允许您从 yair 消费和生成二进制或文本中间表示文件。这允许对中间表示进行检查、测试和序列化。
当此功能启用时,将生成两个额外的二进制文件,与库crate一起生成 - yair-as
和 yair-dis
,允许在人类可读的文本形式和二进制形式之间汇编和反汇编中间表示。
此外,还有一个 yair::io
模块,允许用户将文本或二进制表示写入 yair Library
,他们可以与之一起工作。
.ya 文件
yair 的人类可读表示是 .ya 文件。一个示例文件是
mod "😀" {
fn foo(a : i64, b : i64) : i64 {
bar(a : i64, b : i64):
r = or a, b
ret r
}
}
.ya 文件中的常量有些奇怪 - 在 Library
对象中使用的常量是唯一的,根据该常量的值和类型组合。但在中间表示中,常量被当作基本块体内的任何其他值来处理。
mod "😀" {
fn foo(a : i64) : i64 {
bar(a : i64):
b = const i64 4
r = or a, b
ret r
}
}
这意味着在中间表示中,常量的行为类似于常规的 SSA 笔记。
参考文献
参考文献 1
参考文献 2
这种做法在某些方面与 Swift 中间语言的方法相似 - Swift 的高级 IR:补充 LLVM IR 的语言特定优化案例研究。
参考文献 3
这类似于 2015 年为 LLVM 提出的一项提案,但截至 2021 年 1 月尚未实施 - 迈向单一指针类型。
依赖关系
~1.1–9.5MB
~79K SLoC