### 目前的Go编译器 ###
目前Go编译器gc基于C语言,是从Plan 9的C编译器衍生出来的,其中保持了原有的汇编程序、C编译器和链接器,而部分针对Go的编译器(gc/6g/8g/5g)使用C语言进行了重写。
### 为何要采用Go语言实现 ###
Russ Cox指出,采用Go语言来实现编译器相比C语言的优势在于:
- 编写正确的Go代码要比编写正确的C代码容易
- 调试不正确的Go代码要比调试不正确的C代码容易
- Go编译器必然需要对Go有个很好的了解,而使用C语言实现则增加了一个不必要的二次需求
- 与C相比,Go语言对并行程序执行得更好
- 对于模块化、自动重写、单元测试以及分析,Go比C有更好的标准支持
- 使用Go比使用C更加有趣
### 计划 ###
Russ Cox表示,将编译器从C实现转变为Go实现的过程,主要是通过自动翻译程序来进行。这一过程将分阶段进行:
- 第1阶段:开发和调试翻译程序。
- 第2阶段:使用翻译程序将编译器从C转换成Go,并删除部分C语言副本。该阶段可能会在Go 1.3版本中实现,可能仍会需要一些C代码。
- 第3阶段:使用一些工具将编译器分割成包,并清理部分代码、添加文档、添加集成测试等。这个阶段将在Go 1.4中实现,会将编译器彻底转换成为一个Go程序。
- 第4阶段:通过标准的分析和测量技术对编译器的内存和CPU占用率进行优化,可能会引入并行处理。该阶段将在Go 1.4中实现,部分特性可能会在Go 1.5中实现。
- 第5阶段:使用最新版本的Go解析器和类型替换编译器前端。
### 舍弃的方案 ###
对于为何不从头编写一个新的编译器,Russ Cox表示,从头编写是一个愚蠢的行为,这意味着要抛弃之前很多人很多年以来的工作成果。
Go语言开发团队还尝试了手动将C代码翻译为Go代码,但是在翻译了几个小型的C/C++程序之后,他们发现这种方式比较繁琐,且容易出错,而且错误都非常隐蔽,不易发现。因此,他们决定首先开发出一个自动编译器,通过这种方式,出现的错误将会是一致的,容易查找。
原文:[Go 1.3+ Compiler Overhaul](https://docs.google.com/document/d/1P3BLR31VA8cvLJLfMibSuTdwTuF7WWLux71CYD0eeD8)
有疑问加站长微信联系(非本文作者)