Quali sono le principali differenze tra "gc" e "gccgo"?


88

Quali sono le principali differenze tra i due popolari compilatori Go, "gc" e "gccgo"? Costruire le prestazioni? Prestazioni in fase di esecuzione? Opzioni della riga di comando? Licenze?

Non cerco opinioni su quale sia la migliore, ma solo una panoramica di base delle loro differenze, così posso decidere quale è la migliore per le mie esigenze.


3
Come è cambiato nel tempo? Ora nel 2019
Leo Gallucci

Risposte:


110

Puoi vedere di più in " Configurazione e utilizzo di 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 da un'implementazione. Il team di Go ha scritto due diversi compilatori che implementano queste specifiche: gc e gccgo.

  • Gc è il compilatore originale e lo strumento go lo utilizza per impostazione predefinita.
  • Gccgo è un'implementazione diversa con un focus diverso

Rispetto a gc, gccgo è più lento nella compilazione del codice ma supporta ottimizzazioni più potenti, quindi un programma vincolato alla CPU creato da gccgo di solito verrà eseguito più velocemente.

Anche:

  • Il compilatore gc supporta solo i processori più diffusi: 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, già supporti gccgo tramite l' -compileropzione di: go build -compiler gccgo myprog.


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


Tuttavia, come commentato da OneOfOne ( fonte ), c'è spesso una desincronizzazione tra go supportato da gccgo e l'ultima versione di go:

gccgo supporta solo fino alla versione go v1.2 , quindi se hai bisogno di qualcosa di nuovo nella 1.3 / 1.4 (suggerimento) gccgo non può essere usato. -

La versione 4.9 di GCC 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 il prossimo rilascio di GCC, 4.10, avrà probabilmente la versione Go 1.4 di gccgo.


twotwotwo menziona nei commenti la diapositiva della presentazione di Brad Fitzpatrick

gccgo genera un codice molto buono
... ma manca di analisi di fuga: uccide le prestazioni con molti piccoli allocs + spazzatura
... GC non è preciso. Male per 32 bit.

twotwotwo aggiunge:

Un'altra diapositiva menziona che la generazione di codice ARM non gccgo è instabile.
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 commenta peterSO , Go 1.5 ora (Q3 / Q4 2015) significa:

Il compilatore e il runtime sono ora scritti interamente in Go (con un piccolo assemblatore).
C non è più coinvolto nell'implementazione, quindi il compilatore C che una volta era necessario per costruire la distribuzione è sparito .

La diapositiva "Go in Go" menziona:

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


Berkant chiede nei commenti se gccgoè da cosa è gcstato avviato il bootstrap.

Jörg W Mittag risponde:

No, è gccgoapparso dopo gc.

gcè stato originariamente scritto in C. Si basa sul compilatore C di Ken Thompson dal sistema operativo Plan9 , il successore di Unix, progettato dalle stesse persone. gcè stato modificato in modo iterativo per avere sempre più di se stesso scritto in Go.

gccgoè stato avviato da Ian Lance Taylor , un hacker di GCC non affiliato al progetto Go.

Si noti che il primo compilatore Go completamente auto-ospitato era in realtà un'implementazione commerciale proprietaria closed-source per Windows il cui nome sembra essere svanito dal mio cervello nello stesso modo in cui ha fatto da Internet. Affermavano di avere un compilatore self-hosted scritto in Go, mirato a Windows in un momento in cui gccgonon esisteva ancora ed gcera estremamente doloroso da configurare su Windows. (Fondamentalmente dovevi configurare un ambiente Cygwin completo, patchare il codice sorgente e compilare dal sorgente.) La società sembra aver abbandonato, tuttavia, prima di riuscire a commercializzare il prodotto.

Hector Chu ha rilasciato un port di Go per Windows nel novembre 2009.
E la go-lang.cat-v.org/os-portspagina menziona anche il lavoro iniziale di Joe / Joseph Poirier . In questa pagina :

C'è qualche possibilità che qualcuno che sappia possa richiedere che uno dei ragazzi ( Alex Brainman - Hector Chu - Joseph Poirier) coinvolti nella produzione del port di Windows possa creare una voce wiki che dettaglia il proprio ambiente di compilazione?

Aggiungete a ciò (in Writing Web Apps in Go ) ! 光 京 (Wei Guangjing) .


4
golang.org/doc/go1.3#gccgo E, cosa più importante, gccgo supporta solo fino alla versione v1.2, quindi se hai bisogno di qualcosa di nuovo nella 1.3 / 1.4 (tip) gccgo non può essere usato.
OneOfOne

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

1
@twotwotwo buona scoperta. L'ho incluso nella risposta per una maggiore visibilità.
VonC

3
Ho letto che gccgo implementa le goroutine dando a ciascuna goroutine un thread dedicato (al contrario del multiplexing di molte goroutine su un thread). Se questo è ancora vero, può essere una grande differenza per alcune persone.
DragonFax

2
@LeoGallucci L'idea generale in questa risposta sta con Go 1.11 ("gccgo: più ottimizzazione, più processori."). Puoi vedere un'illustrazione più recente in stackoverflow.com/a/46970176/6309 .
VonC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.