LLVM vs clang su OS X


133

Ho una domanda su llvm, clang e gcc su OS X.

Qual è la differenza tra llvm-gcc 4.2, llvm 2.0 e clang? So che si basano tutti su llvm ma come sono diversi?

Oltre alla compilazione più veloce, qual è il vantaggio di llvm rispetto a gcc?


9
llvm è solo un backend, non può esserci un compilatore llvm autonomo ... ci sono solo frontend diversi per questo, come gcc e clang.
smerlin,

4
@smerlin: "compilatore llvm" è il nome commerciale di Apple per clang + llvm: developer.apple.com/technologies/tools/…
Stephen Canon,

Risposte:


201

Originariamente LLVM stava per "macchina virtuale di basso livello", anche se ora si distingue solo per essere diventata qualcosa di diverso da una macchina virtuale tradizionale. È un insieme di librerie e strumenti, nonché una rappresentazione intermedia standardizzata, che può essere utilizzata per creare compilatori e compilatori just-in-time. Non può compilare altro che la propria rappresentazione intermedia da solo; ha bisogno di un frontend specifico per la lingua per farlo. Se le persone fanno semplicemente riferimento a LLVM, probabilmente intendono solo la libreria e gli strumenti di basso livello. Alcune persone potrebbero riferirsi erroneamente a Clang o llvm-gcc come "LLVM", il che potrebbe causare confusione.

llvm-gcc è una versione modificata di GCC, che utilizza LLVM come backend invece che proprio GCC. Ora è deprecato, a favore di DragonEgg, che utilizza il nuovo sistema di plugin GCC per fare la stessa cosa senza biforcarsi GCC.

Clang è un compilatore C / C ++ / Objective-C completamente nuovo, che usa il proprio frontend e LLVM come backend. I vantaggi che offre sono messaggi di errore migliori, tempi di compilazione più rapidi e un modo più semplice per altri strumenti di collegarsi al processo di compilazione (come il debugger LLDB e l' analizzatore statico Clang ). È anche ragionevolmente modulare e quindi può essere utilizzato come libreria per altri software che devono analizzare il codice C, C ++ o Objective-C.

Ognuno di questi approcci (GCC, GCC + LLVM e Clang) presenta i suoi vantaggi e svantaggi. Le ultime serie di benchmark che ho visto hanno mostrato che GCC produce codice leggermente più veloce nella maggior parte dei casi di test (anche se LLVM ha avuto un leggero vantaggio in alcuni), mentre LLVM e Clang hanno dato tempi di compilazione significativamente migliori. Le combinazioni GCC e GCC / LLVM hanno il vantaggio di aver testato molto più codice e di lavorare sul sapore GCC di C; ci sono alcune estensioni specifiche del compilatore che solo GCC ha, e alcuni luoghi in cui lo standard consente di variare l'implementazione ma il codice dipende da una particolare implementazione. È molto più probabile se ottieni una grande quantità di codice C legacy che funzionerà in GCC rispetto a quello che funzionerà in Clang, anche se questo sta migliorando nel tempo.


13
Per aggiungere a questa meravigliosa risposta: clang è anche un insieme di librerie (chiamate libclang) che puoi usare per cose come l'analisi del codice, il completamento automatico, l'evidenziazione della sintassi, ecc ... Questo è molto utile per gli IDE.

5
Quando costruisci per MacOS X o iOS, considera che Clang è il software che Apple utilizza per costruire tutto il loro software MacOS X e iOS compreso il sistema operativo, e che Clang è ciò che ottieni automaticamente, senza sforzo e ciò che tutti avresti mai chiedere aiuto sta usando. Apple non ha mai supportato gcc oltre gcc 4.2 e non fornisce più alcuna versione di gcc.
gnasher729,

1
@ gnasher729 Sì, questa risposta è stata scritta 3 anni fa, quando Apple stava ancora spedendo sia llvm-gcc che Clang, con llvm-gcc come compilatore predefinito. I tempi sono cambiati da allora.
Brian Campbell,

54

Ci sono 2 cose diverse qui.

LLVM è un compilatore di back-end pensato per costruire compilatori su di esso. Si occupa di ottimizzazioni e produzione di codice adattato all'architettura di destinazione.

CLang è un front-end che analizza il codice C, C ++ e Objective C e lo traduce in una rappresentazione adatta per LLVM.

llvm gcc era una versione iniziale di un compilatore C ++ basato su llvm basato su gcc 4.2, che ora è deprecato dal momento che CLang può analizzare tutto ciò che potrebbe analizzare, e altro ancora.

Infine, la differenza principale tra CLang e gcc non sta nel codice prodotto ma nell'approccio. Mentre gcc è monolitico, CLang è stato creato come una suite di librerie. Questo design modulare offre grandi opportunità di riutilizzo per IDE o strumenti di completamento, ad esempio.

Al momento, il codice prodotto da gcc 4.6 è generalmente un po 'più veloce, ma CLang sta colmando il gap.


5

llvm-gcc-4.2 utilizza il front-end GCC per analizzare il codice, quindi genera l'output compilato utilizzando LLVM.

Il "compilatore llvm 2.0" utilizza il front-end clang per analizzare il codice e genera l'output compilato utilizzando LLVM. "clang" è in realtà solo il nome di questo front-end, ma è spesso usato casualmente come nome per il compilatore nel suo insieme.

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.