2009-07-06 2 views
33

Dopo oltre un decennio di codifica C/C++, ho notato il seguente schema: i programmatori molto bravi tendono ad avere una conoscenza dettagliata delle interiora del compilatore.Come funzionano i compilatori C/C++?

Sono un programmatore ragionevolmente buono, e ho una collezione ad hoc di "superstizioni" del compilatore, quindi mi piacerebbe riavviare le mie conoscenze e partire dalle basi.

Qualcuno può consigliare collegamenti a risorse online o libri preferiti? Sono particolarmente interessato alla compilazione, ottimizzazione, GCC e LLVM di C/C++.

+4

Dai un'occhiata qui per le risorse: http://stackoverflow.com/questions/1669/learning-to-write-a-compiler –

risposta

28

Inizia con il libro del drago .... (stress in modo più sull'ottimizzazione del codice e generazione di codice)

Vai su scrittura di un compilatore giocattolo per un linguaggio di programmazione educativa come decaffeinato o cool .., è possibile utilizzare i generatori di parser (lex e yacc) per il tuo front end (per semplificarti la vita e concentrarti su altre cose) ....

Poi leggi il libro di gcc internals insieme al codice sorgente di gcc.

+2

Grazie, bella sequenza. Prendo il libro del drago: http://en.wikipedia.org/wiki/index.html?curid=188976 – Justicle

+2

Sì, questo è il libro del drago. Ho letto la prima edizione. Aveva un drago molto più semplice ... – RBerteig

+2

Gah. La gente continua a raccomandarlo. Non me. Inizia con un'introduzione casuale --- dì "Costruiamo un compilatore" --- poi guarda un riferimento di Computer Science con tutta la matematica e la teoria. – dmckee

2

A seconda di ciò che si desidera sapere esattamente, si dovrebbe dare un'occhiata al pattern di filtri dei tubi &, perché per quanto ne so questo (o qualcosa di simile) è usato in molti compilatori negli ultimi anni.

Quando la mia conoscenza compilatore non è troppo obsoleto funziona così:

Parse codice sorgente nella rappresentazione simbolica

Pulire rappresentazione simbolica, fare un po 'la normalizzazione

Ottimizzazione della struttura simbolica sulla base di determinati regole

scrivere fuori codice eseguibile sulla base di albero simbolico

Ovviamente anche le dipendenze, ecc. Devono essere risolte.

E, naturalmente, dare un'occhiata a gcc o javac codice sorgente può aiutare a ottenere una comprensione più dettagliata.

1

Può anche essere utile per raccogliere e leggere il codice sorgente di un compilatore. Dubito che GCC sia la migliore prima scelta, poiché è gravata da piena compatibilità con oltre 20 anni di evoluzione della lingua. Ma sono anche sicuro che una lettura della sua fonte, guidata da uno dei manuali di riferimento interni, sarebbe educativa.

Considerare seriamente l'origine di un linguaggio di scripting compilato internamente in un bytecode per una macchina virtuale. Diverse lingue corrispondono a quella descrizione, ma vorrei iniziare con Lua. La lingua è piccola e la VM è nuova. Anche lo source code è piccolo e le parti che ho visto sono state molto chiare anche se leggermente commentate.

11

Il testo del compilatore è buono, ma è un po 'pesante per insegnare a te stesso. Jack Crenshaw ha un "Libro" che era una serie di articoli che puoi scaricare e leggere "Chiama Costruisci un compilatore". Ne consegue una metodologia di "Learn By Doing" che è ottima se non hai ottenuto nulla dal prendere lezioni formali sull'argomento, o è STATO MODO troppi anni da quando lo ha preso (è il mio caso). Ti tiene per mano e ti guida a scrivere un compilatore invece di farti saltare in aria con il Lambda Calculus e le profonde questioni teoriche a cui solo l'accademia si preoccupa. Era un buon modo per stimolare quelle cellule cerebrali che avevano solo una confusa memoria di scrivere qualcosa sul Vax (YEAH, che era proprio un VAX!) Molte molte lune fa a scuola. È scritto in modo molto colloquiale e facile da sedersi e leggere, a differenza della maggior parte dei libri di testo che richiedono diversi tipi di caffè solo per superare il primo capitolo. Una volta che hai una base per la comprensione, i testi più tradizionali come il libro del Drago sono ottimi riferimenti per ampliare la tua comprensione. (E personalmente mi piacciono le versioni Dead Tree, ho stampato Jack's, è molto più facile da leggere in una posizione comoda rispetto a un laptop.E i lettori di Ebook sono troppo costosi per qualcosa che in realtà non sembra di leggere un vero libro.)

Ciò che alcuni potrebbero chiamare un "svantaggio" è che è scritto in Pascal, ma pensavo che mi facesse pensare a questo più che se qualcuno mi avesse dato un programma C funzionante per iniziare. A partire da questo, è stato scritto pensando al 68000, che è usato solo nei sistemi embedded in questo momento. Ancora una volta per me questo non era un problema, sapevo che 68000 asm e 68000 asm sono più facili da leggere rispetto ad altri asm.

4

Come notato da Pete Eddy, il tutorial di Jack Crenshaw è eccellente per i principianti. Ma se volete vedere come un vero e proprio, la produzione di C   compilatore funziona — uno che era progettata da ingegneri brillanti invece creato lanciando il codice contro il muro fino a quando qualcosa bloccato — farti una copia di Fraser e Hanson A Retargetable C Compiler: Design and Implementation , che contiene il codice sorgente per il compilatore molto pulito lcc. Le spiegazioni sulla progettazione e implementazione sono mescolate con il codice. Non è un primo libro per un principiante, ma ripaga lo studio attento, e puoi ottenere una copia usata per   $ 35.

Per una descrizione più lunga su lcc, vedere Compile C Faster on Linux.

Anche la pagina Web di lcc contiene collegamenti a numerosi buoni libri di testo. Non conosco un testo introduttivo che mi piace davvero, comunque.

P.S. Mi dispiace che tu sia stato fregato da Uni.

+0

Grazie per il suggerimento - controllerò lcc out – Justicle

+0

Brillant Engineers? Jack Crenshaw progettava parti della navetta spaziale, e i computer fatti in casa erano un HOBBY dei suoi. Non per disputare l'intelletto delle persone che hanno scritto lcc, ma non devi essere brillante per progettare un compilatore. Non è davvero così difficile. – NoMoreZealots

+1

Il riferimento non era a Crenshaw ma a gcc. RMS è molte cose, ma ingegnere geniale non è uno di loro. Quindi aggiungi 1000 scimmie e mescola bene ... –

0

uno sguardo su Kaleidoscope. Puoi scrivere il tuo compilatore in pochi giorni con LLVM.