Go 编译器最初是用 C 编写的,当它达到一定的成熟度后,创建者正在研究如何在 Go 中引导编译器,以便该语言可以继承 Go 的一些优点并能够做一些事情如果仍然基于 C 是不可能的。
该方法在理论上非常出色,有点像这样:
- 使用简单的 yacc 解析器解析 C 代码
- 生成解析树。调整树以修复和重写 C-isms
- 遍历解析树并输出对应的Go代码
- 通过与基于 C 的 Go 编译器进行比较来编译 Go 代码并验证输出
- 重复直到两个编译器生成相同的输出
需要注意的是,步骤 1 中的 C 解析器是一个非常专业的解析器,它是根据原始作者所遵循的非常具体的方言构建的,而不是打算成为一个更大的问题的通用转换器。此外,这不是一个 100% 自动的过程,仍然有一些代码需要手动滚动,但这使得转换工作更容易,否则这将是一项乏味的工作。
一旦转换为 Go,就可以进行重构、分析和重组的过程,以使用 Go 工具链改进代码库。
这就是它的完成方式。