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

Fli*_*mzy 78 go gccgo

两个流行的Go编译器"gc"和"gccgo"之间的主要区别是什么?建立表现?运行时性能?命令行选项?授权?

我不是在寻找最好的意见,只是对他们差异的基本概述,所以我可以决定哪种方法最符合我的需求.

Von*_*onC 94

您可以在" 设置和使用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版本安装go命令,它已经通过-compiler选项支持gccgo : go build -compiler gccgo myprog.


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


但是,正如OneOfOne(来源)所评论那样,gccgo支持go和最新的go版本之间经常会出现异步:

gccgo只支持版本go v1.2,所以如果你需要1.3/1.4(tip)中的任何新东西,gccgo都不能使用.-

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


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

gccgo生成非常好的代码
...但缺少转义分析:使用许多小的alloc +垃圾来杀死性能
...... GC不准确.32位不好.

twotwotwo补充说:

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


正如peterSO 评论,Go 1.5现在(2015年第3季度/第4季度)意味着:

编译器和运行时现在完全用Go编写(带有一点汇编程序).
C不再参与实现,因此构建分发所必需的C编译器已经消失.

"Go in Go"幻灯片确实提到:

C走了.
旁注:gccgo仍然很强劲.

  • https://golang.org/doc/go1.3#gccgo更重要的是gccgo只支持版本go v1.2,所以如果你需要1.3/1.4(tip)中的任何新东西,gccgo都不能使用. (4认同)
  • 我读到gccgo通过给每个goroutine一个专用线程来实现goroutine(而不是将多个goroutine复用到一个线程上).如果这仍然是真的那么这可能是一些人的主要区别. (3认同)
  • @LeoGallucci这个答案的总体思路是Go 1.11(“ gccgo:更多的优化,更多的处理器。”)。您可以在/sf/answers/3287912351/中看到最新的插图。 (2认同)