Was sind die Hauptunterschiede zwischen 'gc' und 'gccgo'?

85

Was sind die Hauptunterschiede zwischen den beiden beliebten Go-Compilern 'gc' und 'gccgo'? Leistung aufbauen? Laufzeitleistung? Befehlszeilenoptionen? Lizenzierung?

Ich suche nicht nach Meinungen, die am besten sind, sondern nur nach einem grundlegenden Überblick über ihre Unterschiede, damit ich entscheiden kann, welche für meine Bedürfnisse am besten geeignet sind.

Schwach
quelle
3
Wie hat sich das im Laufe der Zeit verändert? Jetzt im Jahr 2019
Leo Gallucci

Antworten:

107

Weitere Informationen finden Sie unter " Einrichten und Verwenden von gccgo ":

gccgo, ein Compiler für die Go-Sprache. Der gccgo-Compiler ist ein neues Frontend für GCC.
Beachten Sie, dass gccgo nicht der gc-Compiler ist

Wie in " Gccgo in GCC 4.7.1 " (Juli 2012) erläutert

Die Go-Sprache wurde immer durch eine Spezifikation definiert, nicht durch eine Implementierung. Das Go-Team hat zwei verschiedene Compiler geschrieben, die diese Spezifikation implementieren: gc und gccgo.

  • Gc ist der ursprüngliche Compiler, und das go-Tool verwendet ihn standardmäßig.
  • Gccgo ist eine andere Implementierung mit einem anderen Fokus

Im Vergleich zu gc ist gccgo langsamer beim Kompilieren von Code, unterstützt jedoch leistungsfähigere Optimierungen, sodass ein von gccgo erstelltes CPU-gebundenes Programm normalerweise schneller ausgeführt wird.

Ebenfalls:

  • Der gc-Compiler unterstützt nur die gängigsten Prozessoren: x86 (32-Bit und 64-Bit) und ARM.
  • Gccgo unterstützt jedoch alle von GCC unterstützten Prozessoren.
    Nicht alle diese Prozessoren wurden gründlich auf gccgo getestet, aber viele, einschließlich x86 (32-Bit und 64-Bit), SPARC, MIPS, PowerPC und sogar Alpha.
    Gccgo wurde auch auf Betriebssystemen getestet, die der GC-Compiler nicht unterstützt, insbesondere auf Solaris.

Wenn Sie den Befehl go von einer Standardversion von Go installieren, wird gccgo bereits über die -compilerOption unterstützt : go build -compiler gccgo myprog.


Kurzum: gccgo: mehr Optimierung, mehr Prozessoren .


Wie von OneOfOne ( Quelle ) kommentiert , gibt es jedoch häufig eine Desynchronisation zwischen dem von gccgo unterstützten go und der neuesten go-Version:

gccgo unterstützt nur bis zur Version go v1.2 . Wenn Sie also etwas Neues in 1.3 / 1.4 (Tipp) benötigen, kann gccgo nicht verwendet werden. - -

GCC Release 4.9 wird die Go 1.2 (nicht 1.3) Version von gccgo enthalten .
Die Release-Zeitpläne für die GCC- und Go-Projekte stimmen nicht überein, was bedeutet, dass 1.3 im Entwicklungszweig verfügbar sein wird, aber dass die nächste GCC-Version 4.10 wahrscheinlich die Go 1.4-Version von gccgo enthalten wird.


Zwei erwähnen in den Kommentaren die Folie von Brad Fitzpatricks Präsentation

gccgo generiert sehr guten Code
... aber es fehlt eine Escape-Analyse: Beeinträchtigt die Leistung mit vielen kleinen Zuordnungen + Müll
... GC ist nicht präzise. Schlecht für 32-Bit.

twotwotwo fügt hinzu:

Eine andere Folie erwähnt, dass die Generierung von ARM-Code ohne gccgo wackelig ist.
Angenommen, es ist eine interessante Option für Ihr Projekt, vergleichen Sie wahrscheinlich die Binärdateien für Ihren Anwendungsfall in Ihrer Zielarchitektur.


Wie peterSO kommentiert , bedeutet Go 1.5 now (Q3 / Q4 2015):

Der Compiler und die Laufzeit sind jetzt vollständig in Go geschrieben (mit einem kleinen Assembler).
C ist nicht mehr an der Implementierung beteiligt, sodass der C-Compiler, der einst zum Erstellen der Distribution erforderlich war, nicht mehr vorhanden ist .

Die Folie "Go in Go" erwähnt:

C ist weg.
Randnotiz: gccgo ist immer noch stark.


Berkant fragt in den Kommentaren, ob gccgowas was istgc gebootet wurde.

Jörg W Mittag antwortet:

Nein, gccgoerschien danachgc .

gcwurde ursprünglich in C geschrieben. Es basiert auf Ken Thompsons C-Compiler aus dem Betriebssystem Plan9 , dem Nachfolger von Unix, der von denselben Personen entwickelt wurde.gcwurde iterativ überarbeitet, um mehr und mehr von sich in Go zu schreiben.

gccgowurde von Ian Lance Taylor gestartet , einem GCC-Hacker, der nicht mit dem Go-Projekt verbunden ist.

Beachten Sie, dass der erste vollständig selbst gehostete Go-Compiler tatsächlich eine proprietäre kommerzielle Closed-Source-Implementierung für Windows war, deren Name aus meinem Gehirn genauso verschwunden zu sein scheint wie aus dem Internet. Sie behaupteten, einen selbst gehosteten Compiler in Go geschrieben zu haben, der auf Windows zu einer Zeit abzielte, als gccgoes noch nicht existierte undgc die Einrichtung unter Windows war äußerst schmerzhaft. (Sie mussten im Grunde eine vollständige Cygwin-Umgebung einrichten, den Quellcode patchen und aus dem Quellcode kompilieren.) Das Unternehmen scheint jedoch zusammengebrochen zu sein, bevor es jemals gelungen ist, das Produkt zu vermarkten.

Hector Chu hat im November 2009 einen Windows-Port von Go veröffentlicht. Auf
der go-lang.cat-v.org/os-portsSeite werden auch die ersten Arbeiten von Joe / Joseph Poirier erwähnt . Auf dieser Seite :

Jede Chance, dass jemand, der Bescheid weiß, einen der Jungs ( Alex Brainman) darum bitten könnte - Hector Chu - Joseph Poirier), die an der Erstellung des Windows-Ports beteiligt sind, einen Wiki-Eintrag erstellt, in dem die Build-Umgebung aufgeführt ist?

Fügen Sie dazu hinzu (beim Schreiben von Web-Apps in Go ) ! 光 京 (Wei Guangjing) .

VonC
quelle
4
golang.org/doc/go1.3#gccgo Und was noch wichtiger ist, gccgo unterstützt nur die Version go v1.2. Wenn Sie also etwas Neues in 1.3 / 1.4 (Tipp) benötigen, kann gccgo nicht verwendet werden.
OneOfOne
1
@OneOfOne guter Punkt, ich habe Ihren Kommentar in die Antwort für mehr Sichtbarkeit aufgenommen.
VonC
1
@twotwotwo guter Fund. Ich habe es in die Antwort für mehr Sichtbarkeit aufgenommen.
VonC
3
Ich habe gelesen, dass gccgo Goroutinen implementiert, indem jeder Goroutine ein dedizierter Thread zugewiesen wird (im Gegensatz zum Multiplexen vieler Goroutinen auf einen Thread). Wenn dies immer noch zutrifft, kann dies für manche Menschen ein großer Unterschied sein.
DragonFax
2
@LeoGallucci Die allgemeine Idee in dieser Antwort steht für Go 1.11 ("gccgo: mehr Optimierung, mehr Prozessoren."). Eine neuere Abbildung finden Sie unter stackoverflow.com/a/46970176/6309 .
VonC