Go的当前官方编译器(http://code.google.com/p/go/)目前使用手工制作的,可以说是神秘的代码生成器,其中包括将自定义部分注入ELF二进制文件。
这种方法产生了很多与直接读取和/或写入ELF信息的实用程序相关的错误,例如ldd
,objdump
或strip
。
我相信这可以通过使用经过良好测试的跨平台代码生成器(如LLVM)来防止,然后只使用操作系统附带的链接工具,例如Unix / Linux上的ld
(或{{1使用Visual Studio在Windows上使用MinGW)或ld.exe
。
那么为什么Go会使用自己的代码生成器呢?它真的只是重新发明轮子吗?或者背后有更重要的原因?
答案 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编译器编写的。他这样做有几个原因:
正如Peter所说,还有gccgo,它使用gcc作为后端。我怀疑Go编译器最终会有其他选项,特别是考虑到Go库包含一个完整的Go解析器和一个(部分完成的)类型检查器。