compiler-go/README.md

80 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 环境
- `x86` Debian GNU/Linux 12
- Python 3.11.2
- gcc version 12.2.2
- openJDK version "17.0.12"
- NASM version 2.16.01
- antlr complete & runtime Version: 4.9.3
- glog
- `请使用C++17以上标准`
# 构建
```shell
mkdir build && cd build
cmake ..
make -j4
```
# 批量执行
```shell
bash test_all.sh
```
# 详细说明
- 可执行文件 `LiteGoCompiler`
- 用法
```shell
./LiteGoCompiler /path/to/gofile
```
- 所需库 `print.o` 负责向标准输出打印结果
- 源文件同级文件夹下生成中间产物
- out.asm 三地址中间代码
- out.o 二进制编译产物
- 目标可执行文件 out.bin
# 文件结构
```
.
├── antlr -------------------------- 存放 antlr jar 包和 runtime
│ └── antlr4-runtime
├── grammar ------------------------ 存放 Go 语言语法文件和 antlr 针对 Cpp 的解析结果
│ └── cpp
├── include ------------------------ 代码头文件
│ ├── ICG
│ ├── Public
│ └── TCG
├── src ----------------------------- 源代码
│ ├── ICG ------------------------- 中间代码生成相关,对接 antlr
│ ├── Public ---------------------- 定义了一些公共宏,三地址操作,符号解析和管理
│ └── TCG ------------------------- 目标代码生成相关
└── test ---------------------------- 测试文件
```
# 代码架构
![code](./assest/code.jpg)
# 原理概述
1. ANTLR的工作流程大致如下
- 定义语法规则使用ANTLR的语法描述语言来定义语言的语法规则。
- 生成解析器和词法分析器ANTLR根据这些语法规则自动生成源代码这些源代码可以构建出解析器和词法分析器。
- 词法分析词法分析器lexer将输入的源代码文本分解成一系列的标记tokens这些标记是语法分析的基本单位。
- 语法分析解析器parser使用这些标记和定义的语法规则来构建解析树这个树结构表示了源代码的语法结构。
- 树的遍历ANTLR还支持遍历解析树这可以通过定义访问者visitors和监听器listeners来实现它们可以在遍历过程中执行特定的操作如语义分析、代码转换等。(在这里实现三地址代码生成)
2. 三地址转汇编
- 指令选择Instruction Selection根据三地址代码的指令和操作数选择相应的汇编指令。例如如果三地址代码是ADD R1, R2, R3那么对应的汇编指令可能是add R1, R2, R3。
- 寄存器分配Register Allocation将三地址代码中的虚拟寄存器映射到实际的物理寄存器或内存位置。这通常涉及到寄存器分配算法如贪心算法、图着色算法等。
- 指令调度Instruction Scheduling调整指令的顺序以提高执行效率这可能包括延迟分支、指令重排等。