GCC vs clang / LLVM - pro e contro di ciascuno [chiuso]


20

Quali sono i pro e i contro di GCC vs clang / LLVM?


3
Pro / Contro per chi? LLVM è chiaramente superiore come backend per i compilatori, tranne se si richiede una quantità ridicola di architetture supportate. Ma suppongo tu stia parlando degli utenti finali.

Risposte:


19

gcc è molto maturo, facile da installare (almeno per la maggior parte dei sistemi) ed è il compilatore predefinito per molti sistemi, quindi in molti casi le persone lo hanno installato quasi senza nemmeno accorgersene. È stato portato su un migliaio di architetture, quindi è molto più probabile che funzioni immediatamente se devi scegliere come target hardware oscuro.

clang è molto più recente. Produce spesso messaggi di errore molto migliori, specialmente per i modelli C ++. In molti casi, funziona molto più velocemente. È costruito principalmente come un insieme di librerie, quindi ci sono molti altri progetti (ad es. Analizzatori di codice) che usano lo stesso front-end, comprendono gli stessi input, ecc. L'uso di llvm come back-end gli conferisce una maggiore flessibilità in come si genera il codice da esso.


17
  1. Clang ha una segnalazione degli errori molto migliore. Ad esempio, se si effettua un refuso nel nome di una funzione chiamata, Clang segnalerà che si tratta probabilmente di un refuso (e suggerisce il nome corretto), mentre GCC si lamenterà del nome della funzione sconosciuta.

  2. GCC di solito produce un codice più veloce se si target x86 / x86-64. Per ARM la situazione è ambigua, spesso Clang ottimizza meglio. Inoltre, AFAIK Clang non supporta l'ottimizzazione per la dimensione del codice.

  3. GCC utilizza molte euristiche. Questo è buono per le prestazioni (in un caso tipico), ma è terribile se si desidera eseguire un'ottimizzazione a livello di sorgente (ad esempio, lo svolgimento di un ciclo). Anche piccole modifiche al codice sorgente possono far sì che GCC generi un output completamente diverso. Clang è più prevedibile e di solito genera il codice che ti aspetti.

  4. A differenza di Jerry Coffin, trovo che costruire GCC dalla fonte sia molto più difficile di Clang. La procedura dalla pagina Guida introduttiva di Clang ha sempre funzionato per me. Manuale simile per GCC non ha mai funzionato al primo tentativo. GCC ha dipendenze da particolari versioni di GMP, MPFR, MPC, Parma Polyhedra Library e CLooG, e ho avuto bisogno di diverse iterazioni per trovare le versioni che funzionerebbero per una particolare versione di GCC (sì, l'uso delle ultime versioni di quelle librerie non funziona ).

  5. Ho la sensazione che Clang sia testato meglio di GCC. Anche se utilizzo solo versioni ufficiali di GCC, a volte produceva codice difettoso. Per Clang di solito uso la versione trunk (di nuovo, perché è facile da costruire), ma non l'ho mai vista generare un output errato.

  6. GCC è quasi standard nel mondo Linux e aggiunge molte funzioni non standard ampiamente utilizzate nel software Linux. Clang cerca di essere compatibile con GCC, ma a volte li ignora tranquillamente. Ancora più importante, Clang non supporta OpenMP. Tuttavia, ha anche estensioni che non sono supportate da GCC, ma possono essere utili (ad esempio funzioni intrinseche add-with-carry __buildin_addc).

  7. Se vuoi fare ricerche sui compilatori, o semplicemente curioso di sapere come funziona, troverai il codice sorgente di Clang / LLVM più accessibile. Il codice Clang / LLVM è leggibile dall'uomo, non solo dal compilatore.

  8. (Si applica la dichiarazione di non responsabilità AINAL) La licenza Clang / LLVM offre maggiore libertà su ciò che è possibile fare con il codice, ad esempio l'utilizzo in prodotti commerciali o di origine chiusa. La licenza per le librerie di runtime GCC aggiunge un altro livello di restrizioni mentre il runtime del compilatore Clang (libreria del compilatore-rt) è sotto licenza MIT permissiva.

Riepilogo: compilare con Clang quando si sviluppa il programma e con GCC per la build finale (ma assicurarsi che sia più veloce e non si rompa). Attenersi a Clang / LLVM se si esegue la ricerca del compilatore.


Interessante, non ho mai saputo che Clang ha intrinseci elementi aggiuntivi. Ma dovrebbe essere __builtin_add, no __buildin_addc. Comunque, Clang è abbastanza intelligente da generare addcquando incontra una grande aggiunta usando il confronto come carry
phuclv

Intendo di __builtin_addcno__buildin_addc
phuclv

I confronti delle prestazioni qui non sono aggiornati. Secondo benchmark più recenti, clang è più veloce di gcc su x86 / 64 in test di poco più della metà (ad esempio openbenchmarking.org/result/1605071-HA-GCCCLANG568 )
Jules

3

Se hai una nuova architettura di CPU o nuove ottimizzazioni e desideri open source sotto GPL, puoi contribuire a gcc. Tuttavia, gcc è meno modulare, quindi ciò potrebbe richiedere più lavoro per aggiungere le proprie modifiche / aggiunte. Se si desidera contribuire con nuove architetture o ottimizzazioni a un progetto open source, ma con una licenza non GPL, è possibile contribuire a LLVM / clang. Esistono società i cui dipartimenti legali consentono solo quest'ultima.


-3

Oggi (8/11/2011), GCC supporta molte più funzionalità di C ++ 0x rispetto a Clang. Se vuoi quelle funzionalità, è un gioco da ragazzi; GCC è la tua opzione.


Questa risposta è accurata e informativa entro i termini indicati dalla mia ricerca.

8
Ma in realtà non è un'ottima risposta, perché da oggi (28/07/2012) il punto non è più valido. Clang supporta più di GCC, se non altro.
DeadMG
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.