2012-01-12 11 views
6

Recentemente sono stato molto interessato ai compilatori e al loro funzionamento. Dato che gcc ha la sua fonte disponibile, ho pensato che sarebbe stato il materiale migliore da studiare.Learning gcc internals

La prima cosa che ho capito è che sarebbe inutile studiare gcc se non avessi una comprensione di base dei semplici principi di progettazione del compilatore. Da allora ho letto diligentemente il "Libro del Drago" che, da quello che ho visto, è il libro di fatto sull'implementazione del compilatore.

Nondimeno, la lettura di quel libro non ha fatto altro che approfondire il mio desiderio di conoscere i compilatori come gcc.

Inoltre, trovo pertinente dire che ho una conoscenza intermedia di c/C++ (alias, non sto provando a studiare gcc senza conoscere c). Spero che lo studio di gcc mi aiuti a migliorare anche su questo.

Ho scaricato l'ultima build che ho trovato; tuttavia, mi perdo quando si esamina il codice sorgente.

Quello che sto cercando sono suggerimenti su come procedere. C'è un progetto simile, che non è così massiccio, che potrei usare come trampolino di lancio per gcc? Esiste un particolare modulo di gcc che si consiglia di studiare prima? Ci sono libri che entrano nell'implementazione di gcc, piuttosto che in uso? Forse dovrei smettere di piagnucolare e continuare a leggere la fonte finché non fa clic?

Qualsiasi e tutti i feedback saranno molto apprezzati.

EDIT: Se pensi che dovrei studiare un compilatore/interprete diverso, apprezzerei molto i suggerimenti su quali.

+3

Si dovrebbe leggere il libro del drago quindi scrivere il proprio compilatore. Aiuta tremendamente. –

+2

Ho sentito che GCC è un dolore da hackerare. Forse LLVM sarebbe un'alternativa? – Blender

+0

1. Dovresti capire la lingua completamente a livello di esperti 2. Scrivi il tuo compilatore per una lingua piccola prima 3. GCC è un casino. Ci sono alternative molto migliori – Pubby

risposta

6

Se si desidera visualizzare un compilatore molto piccolo, si consiglia di Fabrizio Bellard Tiny C Compiler.

Anche degno di nota, Fabrice Bellard ha vinto il concorso di codice c offuscato con il suo Obfuscated Tiny C Compiler. Esiste anche una versione deobfuscata e si adatta a single c file.

Questi dovrebbero essere grandi se si desidera qualcosa di piccolo e maneggevole da cui imparare.

+0

'8c' di plan9 è anche facile da leggere. – Dave

5

Vorrei assolutamente dare un'occhiata a clang/LLVM. Penso che la base del codice sia molto leggibile. Un'opzione molto valida che avresti è di usare LLVM come back-end e scrivere il tuo semplice lexer e parser.

+2

Sono d'accordo, LLVM è molto meglio per l'apprendimento/hacking di gcc. Nella scuola di specializzazione, il corso di compilatore ha utilizzato LLVM per progetti. – TJD

+1

Disclaimer: Sono un po 'prevenuto. Il mio progetto di compilatore sta usando LLVM: http://ellcc.org :-) –

0

Penso che sia bello leggere il libro "ruby al microscopio" e fare pratica con lo sviluppo del core rubino, prima di leggere il codice di gcc. Ma dovresti aver bisogno di conoscenza sulla programmazione di ruby. Si tratta di rubini interni.

Come so che il miglior libro su gcc è "la guida definitiva a gcc" https://www.amazon.com/Definitive-Guide-GCC-Guides-Paperback/dp/1590595858. Anche se è un po 'vecchio, penso che dovresti leggerlo.

0

Appassionata di compilatori, ho imparato molto dal libro di Niklaus Wirth Algorithms + Data Structures = Programs. Uno degli ultimi capitoli ha descritto le lingue Pascal-0 e i capitoli precedenti mostrano come analizzare e compilare un linguaggio molto minimalista. Pascal-0, PL/0 sono compilatori a due fasi, generano p-code, che è 'codice macchina' per una macchina virtuale minimalista (non diversamente da Java).

This page describes a PL/0 virtual machine instruction set e, alla fine, collegamenti a un compilatore PL/0 e altre informazioni interessanti.

Niklaus Wirth has always had a knack per scrivere codice leggibile e ben strutturato.Ecco la definizione della lingua e molti altri link interessanti.

Il vantaggio di studiare e utilizzare Pascal è che il linguaggio è molto strutturato e non un'evoluzione da Assembler (come C). Rende la compilazione molto più semplice. Non è nemmeno necessario fare diversi passaggi ...