GO语言采用什么编译器技术来构建它的编译器?|Go主题月

1,107 阅读2分钟

现在市场上有几种针对Go的编译器,和还有许多针对各种平台的开发中的编译器。

包含在Go发行版中的默认的编译器gc,被作为对go命令的支持的一部分。 Gc最初是用C语言编写的,原因是引导过程很困难-您需要Go编译器来设置Go环境。 但是时代已经进步了,自从Go 1.5版本发布后,编译器就成了Go程序。编译器是使用自动翻译工具从C语言转换为Go语言的,在这个设计文档和talk中都有描述。因此编译器现在是 "自托管",这意味着我们需要面对引导问题。解决的办法是已经有一个工作的Go安装,就像通常有一个工作的C安装一样。关于如何从源码引入一个新的Go环境的故事,在这里和这里都有描述。

Gc是用Go编写的,它有一个递归下降解析器,并使用一个也是用Go编写的,自定义的加载器,但基于Plan 9加载器,来生成ELF/Mach-O/PE二进制文件。

在项目之初,我们考虑过使用LLVM来做gc,但认为它太大、太慢,无法满足我们的性能目标。回想起来更重要的是,从LLVM开始会使我们更难引入一些ABI和相关的变化,比如堆栈管理,这些都是Go需要的,但不是标准C设置的一部分。不过,现在一个新的LLVM实现开始出现了。

Gccgo编译器是一个用C++编写的前端,有一个递归下降解析器,耦合到标准的GCC后端。

Go原来是一种很好的语言,用它来实现Go编译器,虽然这不是它最初的目标。从一开始就不是自托管的,这使得 Go 的设计能够专注于它最初的用例,即网络服务器。如果我们一开始就决定Go应该自编译,那么我们最终可能会得到一个更多针对编译器构造的语言,这是一个有价值的目标,但不是我们最初的目标。

虽然gc没有使用它们(还没有?),但go包里有一个原生的词典和解析器,还有一个原生的类型检查器。

尽管gc尚未使用它们(还?),但是go包中提供了本机词法分析器和解析器,并且还提供了本机类型检查器。

Golang 外文翻译golang.org/doc/faq#Doe…