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


85

两种流行的Go编译器'gc'和'gccgo'之间的主要区别是什么?建立绩效?运行时性能?命令行选项?许可?

我不是在寻找哪种方法最好的意见,而只是对它们之间差异的基本概述,因此我可以决定哪种方法最适合我的需求。


3
随着时间的推移,这种变化如何?现在在2019年
Leo Gallucci

Answers:


108

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

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

如“ GCC 4.7.1中的Gccgo ”(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命令,它已经支持通过gccgo-compiler选项:go build -compiler gccgo myprog


简而言之:gccgo:更多优化,更多处理器


但是,正如OneOfOnesource)所评论那样,gccgo支持的go和最新的go版本之间经常会出现不同步:

gccgo仅支持go v1.2之前的版本,因此,如果您需要1.3 / 1.4(提示)中的新功能,则不能使用gccgo。–

GCC 4.9版将包含gccgo的Go 1.2(而非1.3)版本
GCC和Go项目的发布时间表不一致,这意味着1.3将在开发分支中可用,但下一个GCC版本4.10可能具有gccgo的Go 1.4版本。


twotwotwo提到在评论布拉德·菲茨帕特里克的演讲幻灯片

gccgo生成了非常好的代码
...但是缺少转义分析:使用许多小的allocs +垃圾破坏了性能
... GC不够精确。不适用于32位。

twotwotwo添加:

另一张幻灯片提到,非gccgo ARM代码生成很奇怪。
假设这对您的项目来说是一个有趣的选择,则可以在目标体系结构上比较用例的二进制文件。


正如peterSO所 评论的那样,立即执行1.5(2015年第三季度/第四季度)意味着:

现在,编译器和运行时完全用Go编写(带有一些汇编程序)。
C不再参与实现,因此曾经用于构建发行版的C编译器不见了

“ Go in Go”幻灯片确实提到:

C不见了。
旁注:gccgo仍然很强大。


贝卡特要求在评论是否gccgo就是gc从自举。

JörgW Mittag回答:

不,gccgo出现在之后gc

gc最初是用C编写的。它基于Ken Thompson的C编译器,该C编译器是由Plan9操作系统(由Unix设计的,是Unix的后继产品),由同一个人设计。gc经过迭代重构,使其越来越多地用Go编写。

gccgo由与Go项目无关的GCC黑客Ian Lance Taylor启动。

请注意,第一个完全自托管的Go编译器实际上是Windows的专有商业封闭源代码实现,其名称似乎从我的脑海中消失了,就像从Internet消失一样。他们声称有一个用Go编写的自托管编译器,针对的Windowsgccgo尚不存在,并且gc在Windows上进行安装非常痛苦。(您基本上必须设置一个完整的Cygwin环境,修补源代码并从源代码进行编译。)但是,在公司设法销售该产品之前,该公司似乎已经倒闭了。

Hector Chu确实在2009年11月发布了Windows端口Go。
go-lang.cat-v.org/os-ports页面还提到了Joe / Joseph Poirier的最初工作。在此页面中

有识之士有机会要求参与生产Windows端口的其中一个人(Alex Brainman -Hector Chu-Joseph Poirier)可以制作一个详细说明其构建环境的Wiki条目吗?

另外(在Go编写Web应用程序中!光京(Wei Guangjing)


4
golang.org/doc/go1.3#gccgo更重要的是,gccgo仅支持go v1.2版本,因此,如果您需要1.3 / 1.4(提示)中的新功能,则不能使用gccgo。
OneOfOne 2014年

1
@OneOfOne好点,我在答案中加入了您的评论以提高可见度。
VonC

1
@twotwotwo很好找到。我将其包含在答案中以提高可见性。
VonC 2014年

3
我读到gccgo通过给每个goroutine一个专用线程(而不是将多个goroutine复用到一个线程上)来实现goroutine。如果这仍然是正确的,那对某些人来说可能是一个重大差异。
DragonFax 2015年

2
@LeoGallucci这个答案的总体思路与Go 1.11一致(“ gccgo:更多优化,更多处理器。”)。您可以在stackoverflow.com/a/46970176/6309中看到最新的插图。
VonC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.