Musys-IR 设计思路与使用说明 00: 前言
我写 Musys 的想法是在 8 月一个闷热的上午诞生的。当此之时,我参与的编译器实现赛项目刚刚结束,我所在的组甚至连最后一个提交的机会都赶不上。在这场比赛中,除了过度设计带来的实现困难以外,我可受够了该死的 C++ ——总有从不知道哪个角落冒出来的特性绊我一脚,轻则编译不通过,重则推翻重写,甚至让我不得不就此换个思路重来。
看着 3 万多行的屎山, 我决定换一门语言重写一遍我趟了无数次坑的编译器项目。这一次效率要越高越好,操心的东西越少越好…就这样,我打算继续借鉴 LLVM, 使用 Vala 语言重新写一个编译器框架, 前后端都包下的那种——名字就脸滚键盘随便敲一敲,叫 Musys 也不赖。就这样, Musys 编译器框架诞生了.
现在, Musys 编译器框架是一个类 LLVM 的中间代码系统, 具有一些基本的优化功能. 我把它开源到了 GitHub 上, 下面是它的几个下载链接:
- GitHub:
https://github.com/medihbt/musys-ir
- Codeberg (只读镜像):
https://codeberg.org/medihbt/musys-ir
现在 Musys 可以构建, 但构建下来只能用来测试. 这是因为我只写了中间代码部分, 现在它没有任何后端、甚至连个靠谱点的前端都没有;要验证测试的正确性, 只能把它内部的结点树打印成类似 LLVM-IR 的文本格式, 然后让 LLVM 验证正确性. 没有前端不是因为我懒,而是 SysY 的语法分析太乱了,所以我正在酝酿一种新的编程语言, 它语义足够清晰、语法足够简单, 比 SysY 更适合用于简易前端的编写. 没有后端…那是因为我太菜了, 还没领略到 LLVM Selection DAG 的真谛,这玩意不好写.
基础
在这一节, 我们将了解 Musys-IR 的架构与实现。
- 学习-测试环境搭建:怎么启动一个 Musys 前端
- 值与类型(初步): 基础类型、值的运算
- 值与存储器(初步) & 认识一些存储器
- 认识全局量: 全局变量、函数
- 控制流、基本块与跳转
写一个 Musys-Lang 编译器
这一节会实现 Musys-Lang 编程语言, 并把它和 Musys-IR 对接起来.
- Musys-Lang 介绍: 一门为 Musys-IR 开发的简易编程语言
- Musys-Lang 文法展示(1): 类型、字面量
- Musys-Lang 文法展示(2): 函数、变量定义
- Musys-Lang 文法展示(3): 表达式语句、表达式
- Musys-Lang 文法展示(4): 语句块、语句、标签
- Musys-Lang 前端语法树设计
- Musys-Lang 前端实现
- 对接 Musys-IR(1): 类型翻译
- 对接 Musys-IR(2): 符号翻译
- 对接 Musys-IR(3): 表达式翻译
- 对接 Musys-IR(4): 控制流翻译
实现一些 Musys-IR 优化器
- Musys 的基本块与控制流简析
- …(还没想出来)
…(未完待续)…
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Medi Inside Out!