Google抛弃C语言,采用Go语言重写Go编译器

jopen 10年前

Go 语言是 Google 开发的新型编程语言,将动态语言易于编写的特性和静态语言的高效性相结合,具备良好的易用性和极佳的执行效率。目前该语言已经发布了 1.2 正式版本。

        Go 语言开发者 Russ Cox 近日透露,在 Go 1.3 版本之后,该语言的编译器将会使用 Go 语言重写。

Google抛弃C语言,采用Go语言重写Go编译器

        目前的 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

来自: www.iteye.com