579 lines
4.2 KiB
Markdown
579 lines
4.2 KiB
Markdown
# NGRA → HIR → SSA → LLVM 设计笔记
|
||
|
||
## 当前结论
|
||
|
||
NGRA 不应直接承担完整 SSA 构建与数据流分析职责。
|
||
|
||
NGRA 的职责是:
|
||
|
||
* Token 分析
|
||
* 岛屿压缩(Island Compression)
|
||
* 结构识别
|
||
* 局部语义绑定
|
||
* 元数据传播
|
||
* AST 构建
|
||
|
||
SSA 的职责是:
|
||
|
||
* CFG 构建
|
||
* Def-Use 分析
|
||
* Phi 插入
|
||
* Value Versioning
|
||
* 全局优化
|
||
|
||
---
|
||
|
||
# 总体架构
|
||
|
||
推荐架构:
|
||
|
||
```text
|
||
Source Code
|
||
↓
|
||
NGRA
|
||
↓
|
||
五角星AST
|
||
↓
|
||
HIR(寄存器式)
|
||
↓
|
||
CFG
|
||
↓
|
||
SSA
|
||
↓
|
||
LLVM IR
|
||
↓
|
||
LLVM Backend
|
||
↓
|
||
Native Code / SPIR-V / CUDA
|
||
```
|
||
|
||
而不是:
|
||
|
||
```text
|
||
AST
|
||
↓
|
||
直接LLVM IR
|
||
```
|
||
|
||
原因:
|
||
|
||
LLVM IR 过于底层。
|
||
|
||
NGRA 与语言语义高度相关。
|
||
|
||
中间需要一个:
|
||
|
||
```text
|
||
Language HIR
|
||
```
|
||
|
||
作为桥梁。
|
||
|
||
---
|
||
|
||
# 五角星AST职责
|
||
|
||
五角星AST承担:
|
||
|
||
```text
|
||
Syntax
|
||
+
|
||
Metadata
|
||
+
|
||
Partial Semantic
|
||
```
|
||
|
||
信息。
|
||
|
||
节点包含:
|
||
|
||
```csharp
|
||
Parent
|
||
Prev
|
||
Next
|
||
Left
|
||
Right
|
||
```
|
||
|
||
同时可附带:
|
||
|
||
```csharp
|
||
Type
|
||
Symbol
|
||
Attribute
|
||
SourceSpan
|
||
Flags
|
||
```
|
||
|
||
因此无需再构造独立 Bound AST。
|
||
|
||
---
|
||
|
||
# SCG(Semi Context Grammar)
|
||
|
||
SCG 不等于 SSA。
|
||
|
||
SCG 只负责:
|
||
|
||
## 1. 声明语义
|
||
|
||
例如:
|
||
|
||
```csharp
|
||
class Foo : Bar
|
||
```
|
||
|
||
直接得到:
|
||
|
||
```text
|
||
Foo
|
||
Bar
|
||
Inheritance
|
||
```
|
||
|
||
---
|
||
|
||
## 2. Token级语义
|
||
|
||
例如:
|
||
|
||
```csharp
|
||
123
|
||
```
|
||
|
||
立即得到:
|
||
|
||
```text
|
||
Int32
|
||
```
|
||
|
||
例如:
|
||
|
||
```csharp
|
||
int a = "abc";
|
||
```
|
||
|
||
立即报错。
|
||
|
||
---
|
||
|
||
## 3. 局部表达式语义
|
||
|
||
例如:
|
||
|
||
```csharp
|
||
int + float
|
||
```
|
||
|
||
归约时:
|
||
|
||
```text
|
||
Implicit Conversion
|
||
Operator Resolution
|
||
```
|
||
|
||
直接完成。
|
||
|
||
---
|
||
|
||
## 4. 上下文元数据
|
||
|
||
允许读取:
|
||
|
||
```text
|
||
当前岛屿
|
||
父岛屿
|
||
全局声明表
|
||
```
|
||
|
||
中的信息。
|
||
|
||
例如:
|
||
|
||
```csharp
|
||
namespace A
|
||
{
|
||
class B
|
||
}
|
||
```
|
||
|
||
Class Island 自动继承:
|
||
|
||
```text
|
||
CurrentNamespace=A
|
||
```
|
||
|
||
---
|
||
|
||
# SCG边界
|
||
|
||
SCG允许:
|
||
|
||
```text
|
||
当前节点
|
||
当前归约栈
|
||
当前岛屿元数据
|
||
父岛屿元数据
|
||
全局声明表
|
||
```
|
||
|
||
SCG禁止:
|
||
|
||
```text
|
||
CFG
|
||
Phi
|
||
Def-Use
|
||
Alias Analysis
|
||
Call Graph
|
||
Loop Analysis
|
||
```
|
||
|
||
这些属于 SSA 阶段。
|
||
|
||
---
|
||
|
||
# HIR设计
|
||
|
||
最终决定:
|
||
|
||
不采用栈机IR。
|
||
|
||
原因:
|
||
|
||
AST 已经表达了操作数关系。
|
||
|
||
如果先降成:
|
||
|
||
```text
|
||
load
|
||
load
|
||
add
|
||
store
|
||
```
|
||
|
||
属于:
|
||
|
||
```text
|
||
丢失结构
|
||
再恢复结构
|
||
```
|
||
|
||
没有意义。
|
||
|
||
---
|
||
|
||
# HIR采用寄存器式设计
|
||
|
||
推荐形式:
|
||
|
||
```text
|
||
%0 = const 2
|
||
%1 = mul c, %0
|
||
%2 = add b, %1
|
||
|
||
a := %2
|
||
```
|
||
|
||
而不是:
|
||
|
||
```text
|
||
load b
|
||
load c
|
||
push 2
|
||
mul
|
||
add
|
||
store a
|
||
```
|
||
|
||
---
|
||
|
||
# Value模型
|
||
|
||
HIR中的表达式全部返回 Value。
|
||
|
||
例如:
|
||
|
||
```csharp
|
||
HirValue EmitExpr(AstNode node)
|
||
```
|
||
|
||
返回:
|
||
|
||
```csharp
|
||
ValueId
|
||
```
|
||
|
||
---
|
||
|
||
# Symbol与Value分离
|
||
|
||
保留:
|
||
|
||
```text
|
||
SymbolId
|
||
ValueId
|
||
```
|
||
|
||
两套体系。
|
||
|
||
例如:
|
||
|
||
```text
|
||
a
|
||
b
|
||
c
|
||
```
|
||
|
||
属于:
|
||
|
||
```text
|
||
SymbolId
|
||
```
|
||
|
||
表达式结果:
|
||
|
||
```text
|
||
%0
|
||
%1
|
||
%2
|
||
```
|
||
|
||
属于:
|
||
|
||
```text
|
||
ValueId
|
||
```
|
||
|
||
---
|
||
|
||
# Assignment处理
|
||
|
||
例如:
|
||
|
||
```csharp
|
||
a = b + c;
|
||
```
|
||
|
||
生成:
|
||
|
||
```text
|
||
%0 = add b,c
|
||
|
||
a := %0
|
||
```
|
||
|
||
此时:
|
||
|
||
```text
|
||
a
|
||
```
|
||
|
||
仍不是 SSA。
|
||
|
||
只是:
|
||
|
||
```text
|
||
Symbol → Current Value
|
||
```
|
||
|
||
映射。
|
||
|
||
---
|
||
|
||
# SSA阶段
|
||
|
||
SSA阶段负责:
|
||
|
||
```text
|
||
a
|
||
↓
|
||
a_0
|
||
a_1
|
||
a_2
|
||
...
|
||
```
|
||
|
||
版本化。
|
||
|
||
例如:
|
||
|
||
```csharp
|
||
a = 1;
|
||
a = 2;
|
||
```
|
||
|
||
变:
|
||
|
||
```text
|
||
a_0 = 1
|
||
a_1 = 2
|
||
```
|
||
|
||
---
|
||
|
||
# CFG构建
|
||
|
||
真正的分界线
|
||
|
||
不是:
|
||
|
||
```text
|
||
AST
|
||
↓
|
||
HIR
|
||
```
|
||
|
||
而是:
|
||
|
||
```text
|
||
HIR
|
||
↓
|
||
CFG
|
||
```
|
||
|
||
因为:
|
||
|
||
```text
|
||
树
|
||
↓
|
||
图
|
||
```
|
||
|
||
在这里发生。
|
||
|
||
例如:
|
||
|
||
```csharp
|
||
if(cond)
|
||
{
|
||
}
|
||
else
|
||
{
|
||
}
|
||
```
|
||
|
||
生成:
|
||
|
||
```text
|
||
BB0
|
||
br cond
|
||
|
||
BB1
|
||
...
|
||
|
||
BB2
|
||
...
|
||
|
||
BB3
|
||
```
|
||
|
||
---
|
||
|
||
# LLVM IR定位
|
||
|
||
LLVM IR不是语言IR。
|
||
|
||
LLVM IR是:
|
||
|
||
```text
|
||
SSA Optimization IR
|
||
```
|
||
|
||
职责:
|
||
|
||
```text
|
||
跨平台
|
||
优化
|
||
后端接口
|
||
```
|
||
|
||
不负责:
|
||
|
||
```text
|
||
泛型
|
||
属性
|
||
高级语义
|
||
```
|
||
|
||
---
|
||
|
||
# 最终路线
|
||
|
||
```text
|
||
NGRA
|
||
↓
|
||
SCG
|
||
↓
|
||
五角星AST
|
||
↓
|
||
寄存器式HIR
|
||
↓
|
||
CFG
|
||
↓
|
||
SSA
|
||
↓
|
||
LLVM IR
|
||
↓
|
||
x86/ARM
|
||
|
||
或
|
||
|
||
SPIR-V
|
||
|
||
或
|
||
|
||
CUDA/NVVM
|
||
```
|
||
|
||
---
|
||
|
||
# 对蓝图系统的启发
|
||
|
||
SSA最重要的启发:
|
||
|
||
程序可以拆成:
|
||
|
||
```text
|
||
Control Flow Graph
|
||
+
|
||
Data Flow Graph
|
||
```
|
||
|
||
两张图。
|
||
|
||
因此未来节点管线系统可考虑:
|
||
|
||
```text
|
||
State Graph
|
||
+
|
||
Value Graph
|
||
```
|
||
|
||
双图结构。
|
||
|
||
从:
|
||
|
||
```text
|
||
DAG
|
||
```
|
||
|
||
演化为:
|
||
|
||
```text
|
||
Parallel State Machine
|
||
+
|
||
Data Dependency Graph
|
||
```
|
||
|
||
这样能够自然支持:
|
||
|
||
```text
|
||
Branch
|
||
Loop
|
||
Coroutine
|
||
Async
|
||
Event
|
||
```
|
||
|
||
等复杂控制流。
|