我写 Musys 的想法是在 8 月一个闷热的上午诞生的。当此之时,我参与的编译器实现赛项目刚刚结束,我所在的组甚至连最后一个提交的机会都赶不上。在这场比赛中,除了过度设计带来的实现困难以外,我可受够了该死的 C++ ——总有从不知道哪个角落冒出来的特性绊我一脚,轻则编译不通过,重则推翻重写,甚至让我不得不就此换个思路重来。

看着 3 万多行的屎山, 我决定换一门语言重写一遍我趟了无数次坑的编译器项目。这一次效率要越高越好,操心的东西越少越好…就这样,我打算继续借鉴 LLVM, 使用 Vala 语言重新写一个编译器框架, 前后端都包下的那种——名字就脸滚键盘随便敲一敲,叫 Musys 也不赖。就这样, Musys 编译器框架诞生了.

现在, Musys 编译器框架是一个类 LLVM 的中间代码系统, 具有一些基本的优化功能. 我把它开源到了 GitHub 上, 下面是它的几个下载链接:

现在 Musys 可以构建, 但构建下来只能用来测试. 这是因为我只写了中间代码部分, 现在它没有任何后端、甚至连个靠谱点的前端都没有;要验证测试的正确性, 只能把它内部的结点树打印成类似 LLVM-IR 的文本格式, 然后让 LLVM 验证正确性. 没有前端不是因为我懒,而是 SysY 的语法分析太乱了,所以我正在酝酿一种新的编程语言, 它语义足够清晰、语法足够简单, 比 SysY 更适合用于简易前端的编写. 没有后端…那是因为我太菜了, 还没领略到 LLVM Selection DAG 的真谛,这玩意不好写.

基础

在这一节, 我们将了解 Musys-IR 的架构与实现。

  1. 学习-测试环境搭建:怎么启动一个 Musys 前端
  2. 值与类型(初步): 基础类型、值的运算
  3. 值与存储器(初步) & 认识一些存储器
  4. 认识全局量: 全局变量、函数
  5. 控制流、基本块与跳转

写一个 Musys-Lang 编译器

这一节会实现 Musys-Lang 编程语言, 并把它和 Musys-IR 对接起来.

  1. Musys-Lang 介绍: 一门为 Musys-IR 开发的简易编程语言
  2. Musys-Lang 文法展示(1): 类型、字面量
  3. Musys-Lang 文法展示(2): 函数、变量定义
  4. Musys-Lang 文法展示(3): 表达式语句、表达式
  5. Musys-Lang 文法展示(4): 语句块、语句、标签
  6. Musys-Lang 前端语法树设计
  7. Musys-Lang 前端实现
  8. 对接 Musys-IR(1): 类型翻译
  9. 对接 Musys-IR(2): 符号翻译
  10. 对接 Musys-IR(3): 表达式翻译
  11. 对接 Musys-IR(4): 控制流翻译

实现一些 Musys-IR 优化器

  1. Musys 的基本块与控制流简析
  2. …(还没想出来)

…(未完待续)…