一尘不染

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

go

两个流行的 Go 编译器“gc”和“gccgo”之间的主要区别是什么?构建性能?运行时性能?命令行选项?许可?

我不是在寻找关于哪个最好的意见,只是对它们差异的基本概述,所以我可以决定哪个最适合我的需求


阅读 646

收藏
2021-12-01

共1个答案

一尘不染

您可以在“设置和使用 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:更多优化,更多处理器


然而,正如所评论的,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 生成非常好的代码
……但缺乏逃逸分析:用许多小分配+垃圾杀死性能
……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 环境,修补源代码并从源代码编译。)然而,该公司似乎已经倒闭,直到他们成功将产品推向市场。

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

知情人士是否有可能要求参与制作 Windows 端口的其中一个人(Alex Brainman - Hector Chu - Joseph Poirier)制作一个 wiki 条目,详细说明他们的构建环境?

2021-12-01