为什么Go使用自己的Code生成器?

时间:2011-06-30 18:53:13

标签: code-generation go elf

Go的当前官方编译器(http://code.google.com/p/go/)目前使用手工制作的,可以说是神秘的代码生成器,其中包括将自定义部分注入ELF二进制文件。

这种方法产生了很多与直接读取和/或写入ELF信息的实用程序相关的错误,例如lddobjdumpstrip

我相信这可以通过使用经过良好测试的跨平台代码生成器(如LLVM)来防止,然后只使用操作系统附带的链接工具,例如Unix / Linux上的ld(或{{1使用Visual Studio在Windows上使用MinGW)或ld.exe

那么为什么Go会使用自己的代码生成器呢?它真的只是重新发明轮子吗?或者背后有更重要的原因?

2 个答案:

答案 0 :(得分:6)

有关如何使用gccgo(使用GCC后端的更传统的编译器)的信息,请参阅Setting up and using gccgo

Go Language Specification与编译器无关。您可以从可用的编译器中进行选择,自己编写一个,或者为LLVM Go frontend项目做出贡献。

有关Go编译器技术的历史观点,请阅读此问题的答案:What compiler technology is used to build the compilers?

答案 1 :(得分:3)

参考编译器(5g,6g和8g,统称为gc)是由Ken Thompson根据他为Plan 9操作系统编写的C编译器编写的。他这样做有几个原因:

  • 他已经熟悉他的C编译器如何工作,所以他更容易调整他现有的工作,而不是学习一个全新的框架。
  • Go的目标之一是快速编译。 gc编译器可能比基于LLVM的编译器更快,因为它没有做那么多的工作。然后,它也没有优化。

正如Peter所说,还有gccgo,它使用gcc作为后端。我怀疑Go编译器最终会有其他选项,特别是考虑到Go库包含一个完整的Go解析器和一个(部分完成的)类型检查器。