两个流行的Go编译器,'gc'和'gccgo'之间的主要区别是什么?建立表现?运行时性能?命令行选项?授权?
我不是在寻找最好的意见,只是对他们差异的基本概述,所以我可以决定哪种方式最适合我的需要。
答案 0 :(得分:84)
您可以在“Setting up and using gccgo”中看到更多内容:
gccgo,Go语言的编译器。 gccgo编译器是GCC的新前端 请注意,gccgo不是gc编译器
如“Gccgo in GCC 4.7.1”(2012年7月)中所述
Go语言一直由规范定义,而不是实现。 Go团队编写了两个实现该规范的不同编译器:gc和gccgo。
- Gc是原始编译器,go工具默认使用它。
- Gccgo是一个具有不同重点的不同实现
与gc相比,gccgo编译代码的速度较慢,但支持更强大的优化,因此gccgo构建的CPU绑定程序通常运行得更快。
此外:
- gc编译器仅支持最流行的处理器:x86(32位和64位)和ARM。
- 然而,Gccgo支持GCC支持的所有处理器 并非所有这些处理器都经过gccgo的全面测试,但许多处理器包括x86(32位和64位),SPARC,MIPS,PowerPC甚至Alpha。 Gccgo还在gc编译器不支持的操作系统上进行了测试,特别是Solaris。
如果您从标准Go版本安装go命令,它已通过
-compiler
选项支持gccgo:go build -compiler gccgo myprog
。
简而言之: gccgo:更多优化,更多处理器。
但是,作为commented OneOfOne(source)的GCC release 4.9,gccgo支持go和最新的go版本之间经常会出现失步:
gccgo仅支持版本转至v1.2 ,因此如果您需要1.3 / 1.4(tip)中的任何新内容,则无法使用gccgo。 -
twotwotwo将包含gccgo 的Go 1.2(非1.3)版本。
GCC和Go项目的发布时间表并不重合,这意味着1.3将在开发分支中提供,但下一个GCC版本4.10可能会有Gccgo的Go 1.4版本。
in the comments提到slide of Brad Fitzpatrick's presentation peterSO
gccgo生成非常好的代码
...但缺乏逃避分析:用许多小的分配+垃圾来杀死性能 ...... GC不准确。 32位不好。
twotwotwo补充道:
另一张幻灯片提到非gccgo ARM代码生成很不稳定 假设它对您的项目来说是一个有趣的选项,可能会比较目标架构上的用例的二进制文件。
正如comments Go 1.5,The "Go in Go" slide现在(2015年第3季度/第4季度)意味着:
编译器和运行时现在完全用Go编写(带有一点汇编程序) C不再参与实现,因此构建分发所需的C编译器已不复存在。
{{3}}请注意:
C已经不见了 旁注:gccgo仍然很强劲。