'gc'和'gccgo'之间的主要区别是什么?

两个stream行的Go编译器“gc”和“gccgo”之间的主要区别是什么? build立性能? 运行性能? 命令行选项? 授权?

我并不是在寻求最好的意见,只是对其差异的基本概述,所以我可以决定哪一个最适合我的需求。

您可以在“ 设置和使用gccgo ”中看到更多信息:

gccgo,Go语言的编译器。 gccgo编译器是GCC的新前端。
请注意,gccgo不是gc编译器

正如“ GCC 4.7.1中的Gccgo ”(2012年7月)

Go语言一直由规范定义,而不是实现。 Go团队编写了两个不同的编译器来实现这个规范:gc和gccgo。

  • Gc是原始编译器,默认使用go工具。
  • Gccgo是一个不同的重点实施

与gc相比,gccgo编译代码较慢,但支持更强大的优化,所以gccgo构build的CPU绑定程序通常运行得更快。

也:

  • gc编译器仅支持最常用的处理器:x86(32位和64位)和ARM。
  • 但是,Gccgo支持GCC支持的所有处理器。
    并不是所有的处理器都经过了gccgo的全面testing,但许多处理器都有,包括x86(32位和64位),SPARC,MIPS,PowerPC甚至Alpha。
    Gccgo也在gc编译器不支持的操作系统上进行了testing,特别是Solaris。

如果您从标准Go版本安装go命令,则它已通过-compiler选项支持gccgo: go build -compiler gccgo myprog


总之: gccgo:更多的优化,更多的处理器


然而,正如OneOfOne ( source )所评论的那样 ,gccgo和最新的go版本之间经常会有一个不同步:

gccgo只支持版本去v1.2 ,所以如果你需要1.3 / 1.4中的新东西(提示),gccgo无法使用。 –

GCC版本4.9将包含gccgo的Go 1.2(不是1.3)版本
GCC和Go项目的发布时间表并不重合,这意味着开发分支中将有1.3版,但下一版GCC版本4.10可能会有Go 1.4版本的gccgo。


twotwotwo 在评论中提到了Brad Fitzpatrick的演讲幻灯片

gccgo生成非常好的代码
…但缺乏逃生分析:杀死性能很多小的分配+垃圾
GC不精确。 不好的32位。

twotwotwo补充道:

另一张幻灯片提到非gccgo ARM代码生成是不可靠的。
假设您的项目是一个有趣的选项,可能会比较您的目标架构上的用例的二进制文件。


正如peterSO所言 , Go 1.5现在(2015年第三季度)意味着:

编译器和运行时现在完全用Go编写(用一个小汇编)。
C不再参与实现,因此曾经是构build分布所需的C编译器已经不存在了

“进去”幻灯片提到:

C不见了。
附注:gccgo依然强劲。