2014-09-12 21 views
53

Quali sono le differenze principali tra i due popolari compilatori Go, 'gc' e 'gccgo'? Costruire prestazioni? Prestazioni run-time? Opzioni della riga di comando? Licensing?Quali sono le principali differenze tra "gc" e "gccgo"?

Non sono in cerca di opinioni su quale sia il migliore, solo una panoramica di base delle loro differenze, quindi posso decidere quale sia il migliore per le mie esigenze.

risposta

64

Si può vedere di più nel "Setting up and using gccgo":

gccgo, un compilatore per il linguaggio Go. Il compilatore gccgo è un nuovo frontend per GCC.
Nota che gccgo non è il compilatore gc

come spiegato in "Gccgo in GCC 4.7.1" (luglio 2012)

Il linguaggio Go è sempre stato definito da una specifica, non un'implementazione. Il team di Go ha scritto due compilatori diversi che implementano le specifiche: gc e gccgo.

  • Gc è il compilatore originale e lo strumento Vai lo utilizza per impostazione predefinita.
  • gccgo è un'implementazione diverso con una diversa attenzione

comparazione con GC, gccgo è più lento di compilare il codice, ma supporta le ottimizzazioni più potenti, per cui un programma CPU-bound costruito da gccgo solito correre più veloce.

anche:

  • Il compilatore gc supporta solo i processori più popolari: x86 (32-bit e 64-bit) e ARM.
  • Gccgo, tuttavia, supporta tutti i processori supportati da GCC.
    Non tutti questi processori sono stati accuratamente testati per gccgo, ma molti lo hanno, inclusi x86 (32-bit e 64-bit), SPARC, MIPS, PowerPC e persino Alpha.
    Gccgo è stato testato anche su sistemi operativi che il compilatore gc non supporta, in particolare Solaris.

se si installa il comando go da una versione standard di Go, supporta già gccgo tramite l'opzione -compiler: go build -compiler gccgo myprog.


In breve: gccgo: più ottimizzazione, più processori.


Tuttavia, come commented da OneOfOne (source), v'è spesso una desincronizzazione tra andare supportato da gccgo, e l'ultima versione di Go:

gccgo supporta solo fino alla versione andare v1. 2, quindi se avete bisogno di qualcosa di nuovo in 1.3/1.4 (tip) gccgo non può essere utilizzato.-

GCC release 4.9 conterrà la versione Go 1.2 (non 1.3) di gccgo.
I programmi di rilascio per i progetti GCC e Go non coincidono, il che significa che 1.3 sarà disponibile nel ramo di sviluppo ma che la prossima versione di GCC, 4.10, avrà probabilmente la versione Go 1.4 di gccgo.


twotwotwo menzioni in the comments il gccgo slide of Brad Fitzpatrick's presentation

genera molto buon codice
... ma manca sfuggire analisi: uccide le prestazioni con molti piccoli Allocati + spazzatura
... GC isn è preciso Cattivo per 32-bit.

twotwotwo aggiunge:

Un'altra diapositiva menziona che non gccgo generazione di codice ARM è wonky.
Supponendo che sia un'opzione interessante per il tuo progetto, probabilmente confronta i binari per il tuo caso d'uso sull'architettura di destinazione.


Come peterSOcomments, Go 1.5 ora (Q3/Q4 2015) significa:

Il compilatore e runtime sono ora scritto interamente in Go (con un po 'assemblatore).
C non è più coinvolto nell'implementazione, quindi il compilatore C che era necessario per la creazione della distribuzione è scomparso.

The "Go in Go" slide menzionano:

C è andato.
Nota a margine: gccgo sta ancora andando forte.

+4

https://golang.org/doc/go1.3#gccgo E, soprattutto, gccgo supporta solo fino alla versione go v1.2, quindi se avete bisogno di qualcosa di nuovo in 1.3/1.4 (suggerimento) gccgo non può essere Usato. – OneOfOne

+1

@OneOfOne buon punto, ho incluso il tuo commento nella risposta per maggiore visibilità. – VonC

+0

bradfitz's [slide on it] (http://talks.golang.org/2014/gocon-tokyo.slide#54) afferma che manca l'analisi di escape, dove il compilatore capisce che alcune cose possono essere allocate nello stack, e che il suo GC non è preciso. Un'altra diapositiva menziona che la generazione di codice ARM non gccgo è stupefacente. Supponendo che sia un'opzione interessante per il tuo progetto, probabilmente confronta i binari per il tuo caso d'uso sulla tua architettura di destinazione. – twotwotwo

Problemi correlati