两种流行的Go编译器'gc'和'gccgo'之间的主要区别是什么?建立绩效?运行时性能?命令行选项?许可?
我不是在寻找哪种方法最好的意见,而只是对它们之间差异的基本概述,因此我可以决定哪种方法最适合我的需求。
Answers:
您可以在“设置和使用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:更多优化,更多处理器。
但是,正如OneOfOne(source)所评论的那样,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仍然很强大。
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编写的自托管编译器,针对的Windows
gccgo
尚不存在,并且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)。