Oggi, è necessario un vero compilatore C per essere un compilatore ottimizzante , in particolare perché C non è più un linguaggio vicino all'hardware, poiché i processori attuali sono incredibilmente complessi ( fuori servizio , pipeline , superscalari , con cache complesse e TLB , quindi necessita di programmazione delle istruzioni , ecc ...). I processori x86 di oggi non sono come i processori i386 del secolo precedente, anche se entrambi sono in grado di eseguire lo stesso codice macchina. Vedi che la C non è un linguaggio di basso livello (Il tuo computer non è un PDP-11 veloce) di David Chisnall.
Poche persone usano ingenui compilatori C non ottimizzanti come tinycc o nwcc , poiché producono codice che è molte volte più lento di quello che l'ottimizzazione dei compilatori può dare.
Codificare un compilatore ottimizzante è difficile. Si noti che sia GCC che Clang stanno ottimizzando alcune rappresentazioni di codice "neutre dal linguaggio di origine" (Gimple per GCC, LLVM per Clang). La complessità di un buon compilatore C non è nella fase di analisi!
In particolare, la creazione di un compilatore C ++ non è molto più difficile della creazione di un compilatore C: l'analisi del C ++ e la sua trasformazione in una rappresentazione del codice interno è complessa (perché la specifica C ++ è complessa), ma è ben compresa, ma le parti di ottimizzazione sono ancora di più complesso (all'interno di GCC: le ottimizzazioni di fascia media, neutre nella lingua di origine e nel processore di destinazione, formano la maggior parte del compilatore, con il resto bilanciato tra front-end per diverse lingue e back-end per diversi processori). Quindi la maggior parte dei compilatori C ottimizzanti sono anche in grado di compilare alcuni altri linguaggi, come C ++, Fortran, D, ... Le parti specifiche di C ++ di GCC sono circa il 20% del compilatore ...
Inoltre, C (o C ++) è così ampiamente usato che le persone si aspettano che il loro codice sia compilabile anche quando non segue esattamente gli standard ufficiali, che non definiscono abbastanza precisamente la semantica del linguaggio (quindi ogni compilatore può avere una propria interpretazione di esso). Guarda anche il compiler C comprovato CompCert e l' analizzatore statico Frama-C , che si preoccupano della semantica più formale di C.
E le ottimizzazioni sono un fenomeno long tail : implementare alcune semplici ottimizzazioni è facile, ma non renderanno competitivo un compilatore! È necessario implementare molte ottimizzazioni diverse e organizzarle e combinarle in modo intelligente per ottenere un compilatore del mondo reale competitivo. In altre parole, un compilatore per l'ottimizzazione del mondo reale deve essere un software complesso. A proposito, sia GCC che Clang / LLVM hanno diversi generatori di codice interni C / C ++ specializzati. Ed entrambi sono bestie enormi (diversi milioni di righe di codice sorgente, con un tasso di crescita di diversi percento ogni anno) con una grande comunità di sviluppatori (poche centinaia di persone, che lavorano principalmente a tempo pieno o almeno a metà tempo).
Si noti che non esiste un compilatore C multi-thread (per quanto ne so), anche se alcune parti di un compilatore potrebbero essere eseguite in parallelo (ad es. Ottimizzazione intra-procedurale, allocazione dei registri, pianificazione delle istruzioni ...). E la costruzione parallela con make -j
non è sempre abbastanza (specialmente con LTO ).
Inoltre, è difficile ottenere finanziamenti per la codifica di un compilatore C da zero, e tale sforzo deve durare diversi anni. Infine, oggi la maggior parte dei compilatori C o C ++ sono software gratuiti (non esiste più un mercato per i nuovi compilatori proprietari venduti dalle startup) o almeno sono prodotti monopolistici (come Microsoft Visual C ++ ), ed è quasi necessario essere un software gratuito per i compilatori ( perché hanno bisogno di contributi da molte organizzazioni diverse).
Sarei felice di ottenere finanziamenti per lavorare da zero su un compilatore C come software libero, ma non sono abbastanza ingenuo da credere che sia possibile oggi!