两个流行的 Go 编译器“gc”和“gccgo”之间的主要区别是什么?构建性能?运行时性能?命令行选项?许可?
我不是在寻找关于哪个最好的意见,只是对它们差异的基本概述,所以我可以决定哪个最适合我的需求
您可以在“设置和使用 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 密集型程序通常会运行得更快。
Go 语言一直由规范定义,而不是由实现定义。Go 团队编写了两个不同的编译器来实现该规范:gc 和 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。
如果您从标准 Go 版本安装 go 命令,它已经通过以下-compiler选项支持 gccgo :go build -compiler gccgo myprog。
-compiler
go build -compiler gccgo myprog
简而言之:gccgo:更多优化,更多处理器。
然而,正如所评论的,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 可能会有 Go 1.4 版本的 gccgo。
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 可能会有 Go 1.4 版本的 gccgo。
gccgo 生成非常好的代码 ……但缺乏逃逸分析:用许多小分配+垃圾杀死性能 ……GC不精确。不适合 32 位。
twotwotwo 补充说:
另一张幻灯片提到非 gccgo ARM 代码生成是不稳定的。 假设这对您的项目来说是一个有趣的选项,可能会在您的目标架构上比较您的用例的二进制文件。
Go 1.5 now (Q3/Q4 2015) 意味着:
编译器和运行时现在完全用 Go 编写(带有一个小汇编程序)。 C 不再参与实现,因此曾经用于构建发行版的 C 编译器也消失了。
“Go in Go”幻灯片确实提到:
C没了。 旁注:gccgo 仍然很强大。
Jörg W Mittag回答:
不,gccgo出现在 之后gc。 gc最初是用 C 编写的。它基于 Ken Thompson 来自Plan9 操作系统的 C 编译器,它是Unix 的继承者,由同一个人设计。gc被迭代重构,用 Go 编写越来越多的内容。 gccgo由伊恩·兰斯·泰勒( Ian Lance Taylor) 发起,他是一名与 Go 项目无关的 GCC 黑客。 请注意,第一个完全自托管的 Go 编译器实际上是 Windows 的专有商业闭源实现,它的名字似乎已经从我的脑海中消失了,就像它在互联网上一样。他们声称有一个用 Go 编写的自托管编译器,在当时gccgo还不存在并且gc在 Windows 上设置非常痛苦的 Windows 目标。(您基本上必须设置一个完整的 Cygwin 环境,修补源代码并从源代码编译。)然而,该公司似乎已经倒闭,直到他们成功将产品推向市场。
不,gccgo出现在 之后gc。
gccgo
gc
gc最初是用 C 编写的。它基于 Ken Thompson 来自Plan9 操作系统的 C 编译器,它是Unix 的继承者,由同一个人设计。gc被迭代重构,用 Go 编写越来越多的内容。
gccgo由伊恩·兰斯·泰勒( Ian Lance Taylor) 发起,他是一名与 Go 项目无关的 GCC 黑客。
请注意,第一个完全自托管的 Go 编译器实际上是 Windows 的专有商业闭源实现,它的名字似乎已经从我的脑海中消失了,就像它在互联网上一样。他们声称有一个用 Go 编写的自托管编译器,在当时gccgo还不存在并且gc在 Windows 上设置非常痛苦的 Windows 目标。(您基本上必须设置一个完整的 Cygwin 环境,修补源代码并从源代码编译。)然而,该公司似乎已经倒闭,直到他们成功将产品推向市场。
Hector Chu确实在 2009 年 11 月发布了 Go 的 Windows 端口。 该go-lang.cat-v.org/os-ports页面还提到了Joe/Joseph Poirier 的初始工作。在此页面中:
go-lang.cat-v.org/os-ports
知情人士是否有可能要求参与制作 Windows 端口的其中一个人(Alex Brainman - Hector Chu - Joseph Poirier)制作一个 wiki 条目,详细说明他们的构建环境?