Domanda

Lingue preferite:C/C++, Java e Ruby.

Sto cercando alcuni libri di utile/tutorial su come scrivere il proprio compilatore semplicemente per scopi didattici.Io sono più familiarità con C/C++, Java, Ruby, quindi preferisco risorse che coinvolgono uno di quei tre, ma ogni buona risorsa è accettabile.

È stato utile?

Soluzione

Grande Elenco di Risorse:

Legenda:

  • ¶ Collegamento ad un file PDF
  • $ Link a un libro stampato

Altri suggerimenti

Questa è una bella domanda vaga, penso;proprio a causa della profondità dell'argomento coinvolti.Un compilatore può essere scomposto in due parti distinte, tuttavia;una parte superiore e una inferiore-one.La parte superiore, generalmente, la lingua di origine e lo converte in una rappresentazione intermedia, e la metà inferiore si prende cura di specifiche piattaforme di generazione del codice.

Tuttavia, un'idea, un modo semplice per avvicinarsi a questo argomento (quello che abbiamo usato nel mio compilatori di classe, almeno) è quello di costruire il compilatore in due pezzi sopra descritti.In particolare, si otterrà una buona idea di tutto il processo da costruire nella parte superiore.

Solo facendo la parte superiore consente di ottenere l'esperienza di scrivere l'analizzatore lessicale e il parser e andare per la generazione di alcuni "codice" (che intermedi di rappresentanza che ho citato).Quindi ci vorrà del programma sorgente e la conversione a un'altra rappresentazione e fare qualche ottimizzazione (se volete), che è il cuore di un compilatore.La metà inferiore avrà quindi che la rappresentazione intermedia e generare i byte necessari per eseguire il programma su una specifica architettura.Per esempio, la metà inferiore prenderà il tuo rappresentazione intermedia e generare un PE eseguibile.

Alcuni libri su questo argomento che ho trovato particolarmente utile è stato I compilatori di Principi e Tecniche di (o il Drago Libro, grazie per il simpatico drago in copertina).Ha una grande teoria e sicuramente copre Context-Free Grammars davvero accessibile.Inoltre, per la costruzione di un analizzatore lessicale e parser, che utilizzerai *nix strumenti di lex e yacc.E uninterestingly abbastanza, il libro intitolato "lex e yacc"raccolse dove il Drago Libro lasciato per questa parte.

Penso Moderno Implementazione del Compilatore in ML è il miglior introduttivo del compilatore la scrittura del testo.C'è un La versione di Java e un Versione C troppo, uno dei quali potrebbe essere più accessibile dato il tuo lingue sfondo.Il libro racchiude un sacco di utile materiale di base (acquisizione e l'analisi, analisi semantica, record di attivazione, di istruzione, di selezione, RISC e la generazione di codice nativo x86) e le varie "avanzate" argomenti (la compilazione OO e linguaggi funzionali, polimorfismo, raccolta rifiuti, ottimizzazione e unico statica modulo di assegnazione) in uno spazio relativamente piccolo (~500 pagine).

Io preferisco Moderna Implementazione del Compilatore per il Drago libro, poiché i Moderni implementazione del Compilatore indagini meno del campo--invece ha davvero solida la copertura di tutti gli argomenti che si avrebbe bisogno di scrivere un serio, dignitoso compilatore.Dopo il lavoro, attraverso questo libro, sarete pronti per affrontare documenti di ricerca direttamente per più di profondità, se ne avete bisogno.

Devo confessare che ho un serio debole per Niklaus Wirth Compilatore Di Costruzione. È disponibile online come un PDF.Trovo Wirth programmazione estetica semplicemente bella, tuttavia alcune persone trovano che il suo stile troppo minimale (per esempio Wirth favorisce la discesa ricorsiva parser, ma la maggior parte di CS corsi di concentrarsi sul generatore di parser strumenti;Wirth lingua disegni sono abbastanza conservativo.) Il compilatore è una Costruzione molto succinta distillazione di Wirth idee di base, quindi se ti piace il suo stile o non o non, vi consiglio vivamente la lettura di questo libro.

Sono d'accordo con il Drago Libro di riferimento;IMO, è la guida definitiva al compilatore di costruzione.Ottenere pronto per alcuni hardcore teoria, però.

Se volete un libro che è più leggero di teoria, Gioco Di Scripting Padronanza potrebbe essere un libro migliore per voi.Se sei un newbie totale al compilatore teoria, fornisce una dolce introduzione.Non più concreti, metodi di analisi (optando per non predittivo ricorsiva discendente senza discutere LL o LR analisi), e mi sembra di ricordare, non ha nemmeno discutere di qualsiasi tipo di ottimizzazione teoria.Inoltre, invece di compilazione in codice macchina, si compila in un bytecode che deve essere eseguito su una macchina virtuale che scrivere anche voi.

E ' ancora una buona lettura, in particolare se si può ritirare a buon mercato su Amazon.Se si desidera solo un semplice introduzione compilatori, Gioco di Scripting Padronanza non è un brutto modo di andare.Se si vuole andare hardcore di fronte, quindi si dovrebbe accontentarsi di niente di meno che il Drago Libro.

"Costruiamo un Compilatore" è impressionante, ma è un po ' obsoleto.(Non sto dicendo che lo rende anche un po ' meno validi).

O del check-out SLANG.Questo è simile a "costruiamo un Compilatore", ma è molto migliore risorsa, soprattutto per i principianti.Questo viene fornito con un file pdf tutorial che prende un 7 passo approccio all'insegnamento è un compilatore.L'aggiunta di quora link in quanto sono i link a tutte le varie porte di SLANG, in C++, Java, JS, anche interpreti in python e java, originariamente scritto in C# e il .Piattaforma rete.

Se si sta cercando di utilizzare potente, di livello superiore, strumenti, piuttosto che costruire tutto voi stessi, passando attraverso i progetti e le letture per questo corso è una scelta abbastanza buona.Si tratta di un corso di lingue da parte dell'autore del parser Java motore di ANTLR.È possibile ottenere il libro per il corso di PDF da il Pragmatico Programmatori.

Il corso va oltre gli standard del compilatore compilatore cose che si vedono altrove:l'analisi, i tipi e il tipo di controllo, polimorfismo, le tabelle di simboli, e la generazione del codice.Praticamente l'unica cosa che non è coperto è ottimizzazioni.Il progetto finale è un programma che compila un sottoinsieme di C.Perché si utilizzano strumenti come ANTLR e LLVM, è possibile scrivere il compilatore in un solo giorno (ho una esistenza a prova di questo, anche se mi significano ~24 ore).E 'pesante sulle pratiche di ingegneria con strumenti moderni, un po' più leggero teoria.

LLVM, tra l'altro, è semplicemente fantastico.Molte le situazioni in cui si potrebbe normalmente compilare giù per il montaggio, devi essere molto meglio per la compilazione LLVM Intermedie di Rappresentanza invece.E ' di livello superiore, cross-platform, e LLVM è molto bravo a generare ottimizzato assemblea da esso.

Se avete poco tempo, mi raccomando Niklaus Wirth "Compilatore di Costruzione" (Addison-Wesley.1996), un piccolo libretto che si può leggere in un giorno, ma spiega le nozioni di base (tra cui come implementare lexers, recursive descent parser, e il tuo stack-based virtual machine).Dopo di che, se si desidera che l'immersione profonda, non c'è alcun modo per aggirare il Drago libro, come altri commentatori suggeriscono.

Si potrebbe desiderare di guardare in Lex/Yacc (o Flex/Bison, qualsiasi cosa tu voglia chiamarli).Flex è un analizzatore lessicale, che sarà analizzare e identificare i componenti semantici ("token") della tua lingua, e Bison verrà utilizzato per definire ciò che accade quando ogni token viene analizzato.Questo potrebbe essere, ma sicuramente non limitato a, la stampa di codice C, per un compilatore che sarebbe compilare in C, o in modo dinamico l'esecuzione di istruzioni.

Questa FAQ dovrebbe aiutare, e questo tutorial sembra molto utile.

In generale, c'è a cinque minuti di tutorial per i compilatori, perché è un argomento complicato e di scrivere un compilatore può richiedere mesi.Si dovrà fare la propria ricerca.

Python e Ruby sono normalmente interpretati.Forse si vuole iniziare con un interprete così.È generalmente più facile.

Il primo passo è quello di scrivere un linguaggio formale descrizione, la grammatica del linguaggio di programmazione.Quindi è necessario trasformare il codice sorgente che si desidera compilare o interpretare secondo la grammatica in un albero di sintassi astratta, una forma interna del codice sorgente che il computer capisce e può funzionare su.Questo passo è di solito chiamato l'analisi e il software che analizza il codice sorgente è chiamato un parser.Spesso il parser generato da un generatore di parser che trasformano una grammatica formale in origine oder codice macchina.Per una buona, camere non-spiegazione matematica di analisi mi consiglia di Analisi Tecniche - Una Guida Pratica.Wikipedia è un confronto di generatori di parser da cui è possibile scegliere quello che è adatto per voi.A seconda del generatore di parser si è scelto, potrete trovare tutorial su Internet e molto popolare generatori di parser (come GNU bison) ci sono anche dei libri.

Scrivere un parser per la lingua può essere molto duro, ma questo dipende dalla tua grammatica.Quindi suggerisco di mantenere la vostra grammatica semplice (a differenza di C++);un buon esempio di questo è il LISP.

Nella seconda fase l'albero di sintassi astratta è trasformata da una struttura ad albero in modo lineare rappresentazione intermedia.Come un buon esempio per questo il Lua bytecode che viene spesso citata.Ma la rappresentazione intermedia davvero dipende dal linguaggio.

Se si sta costruendo un interprete, non dovrete far altro che interpretare la rappresentazione intermedia.Si potrebbe anche just-in-time-compilazione.Mi raccomando LLVM e libjit per just-in-time-compilazione.Per rendere il linguaggio utilizzabile si dovrà includere anche alcune funzioni di input e output e, forse, una piccola libreria standard.

Se avete intenzione di compilare la lingua, sarà più complicato.Scrivi backend per le diverse architetture di sistema e generare codice macchina dalla rappresentazione intermedia in quei backend.Mi raccomando LLVM per questo compito.

Ci sono un paio di libri su questo argomento, ma mi raccomando che nessuno di loro per uso generale.La maggior parte di loro sono troppo accademici, o troppo pratico.Non c'è modo di Insegnare a te stesso compilatore di scrittura in 21 giorni" e, quindi, sarà necessario acquistare diversi libri per ottenere una buona comprensione di questo argomento.Se si cerca in Internet, ci si imbatte in alcuni online di libri e appunti.Forse c'è una biblioteca universitaria, nelle vicinanze, dove è possibile prendere in prestito i libri su compilatori.

Consiglio anche una buona conoscenza di base in informatica teorica e la teoria dei grafi, se avete intenzione di rendere il vostro progetto serio.Una laurea in informatica sarà anche utile.

Un libro non ancora suggerito, ma molto importante è "Linker e Loader" da John Levine.Se non si utilizza un esterno assemblatore, avrete bisogno di un modo per l'output di un file oggetto che può essere collegato nel programma finale.Anche se si sta utilizzando un esterno assemblatore, avrete probabilmente bisogno di capire le delocalizzazioni e come tutto il programma di caricamento processo di lavori per rendere uno strumento di lavoro.Questo libro raccoglie un sacco di casuale lore intorno a questo processo per i diversi sistemi, tra cui Win32 e Linux.

Il Drago Libro è sicuramente la "costruzione di compilatori" libro, ma se la tua lingua non è poi così complicato come l'attuale generazione di lingue, si potrebbe voler guardare l'Interprete modello da Modelli Di Progettazione.

L'esempio nel libro di disegni di una espressione regolare-come la lingua ed è ben pensato, ma, come si dice nel libro, è buono per pensare attraverso il processo, ma è davvero efficace solo su piccole lingue.Tuttavia, è molto più veloce a scrivere un Interprete per un linguaggio con questo modello di dover conoscere tutti i diversi tipi di parser, yacc e lex, et cetera...

Se siete disposti a utilizzare LLVM, controllare questo fuori: http://llvm.org/docs/tutorial/.Ti insegna come scrivere un compilatore da zero, con LLVM quadro, e non si supponga di disporre di alcuna conoscenza sull'argomento.

Il tutorial consigliamo di scrivere il proprio parser e lexer ecc, ma vi consiglio di guardare nel bison e flex, una volta che si ottiene l'idea.Essi rendono la vita molto più facile.

Ho trovato il Drago libro troppo difficile da leggere con troppa attenzione sulla teoria del linguaggio, che non è davvero necessario scrivere un compilatore in pratica.

Vorrei aggiungere il Oberon libro che contiene il sorgente completo di un incredibilmente semplice e veloce Oberon compilatore Progetto Oberon.

Alt text

Ricordo di aver chiesto a questa domanda circa sette anni fa, quando ero piuttosto nuovo per la programmazione.

Sono stato molto attento quando io ho chiesto e sorprendentemente non ho avuto molto critica, come hai trovato qui.Hanno fatto però mi punto nella direzione della "Dragon Libro"che è, a mio parere, un ottimo libro che spiega tutto ciò che è necessario sapere per scrivere un compilatore (naturalmente, sarà necessario padroneggiare una lingua o due.Più lingue si conoscono, meglio è.).

E sì, molte persone dicono che la lettura di quel libro è pazzo e non impari nulla, ma io non sono d'accordo completamente con che.

Molte persone anche dire che scrivere compilatori è stupido e inutile.Beh, ci sono un certo numero di motivi per cui il compilatore di sviluppo sono utili:

  • Perché è divertente.
  • È educativo, quando imparare a scrivere compilatori si impara molto su di informatica e altre tecniche che sono utili durante la scrittura di altre applicazioni.
  • Se nessuno ha scritto compilatori esistenti lingue non ottenere qualsiasi meglio.

Non ho scritto la mia compilatore subito, ma dopo aver chiesto sapevo da dove cominciare.E ora, dopo aver imparato molte lingue diverse, e la lettura dei Drago Libro, la scrittura non è che molto di un problema.(Anche io sto studiando ingegneria informatica bancomat, ma la maggior parte delle cose che so su di programmazione è autodidatta.)

In conclusione, Il Drago è un Libro di grande "tutorial".Ma il trascorrere del tempo la conoscenza di una lingua o due prima di tentare di scrivere un compilatore.Non aspettatevi di essere un compilatore guru entro il prossimo decennio o giù di lì, però.

Il libro è anche un bene se si vuole imparare a scrivere parser/interpreti.

"...Costruiamo un Compilatore ..."

Mi piacerebbe seconda http://compilers.iecc.com/crenshaw/ da @sasb.Dimenticate l'acquisto di libri per il momento.

Perché?Strumenti e linguaggio.

La lingua è il Pascal e se non ricordo male è basato su Turbo Pascal.Così succede se si va a http://www.freepascal.org/ e scaricare il compilatore Pascal, tutti gli esempi di lavoro direttamente dalla pagina ~ http://www.freepascal.org/download.var La beaut cosa su Free Pascal è che si può usare quasi qualsiasi processore o del sistema operativo che si può curare.

Una volta che hai imparato la lezione prova più avanzate "Dragon Libro" ~ http://en.wikipedia.org/wiki/Dragon_book

Sto guardando il concetto è lo stesso, e ho trovato questo promettente articolo di Joel Pobar,

Creare un Compilatore di Linguaggio per l' .NET Framework - non so dove questo è andato

Creare un Compilatore di Linguaggio per l' .NET Framework - copia in formato pdf dell'originale doc

egli parla di un alto livello di concetto di un compilatore e proventi inventare la sua propria lingua per l' .Net framework.Anche se il suo volto al .Net Framework, molti dei concetti dovrebbero essere in grado di essere riprodotto.L'Articolo comprende:

  1. Lingua di definizione
  2. Scanner
  3. Parser (il bit im principalmente interessati)
  4. Targeting .Net Framework
  5. Generatore Di Codice

ci sono altri argomenti, ma si ottiene il giusto.

È rivolto a persone di partire, scritto in C# (non abbastanza Java)

HTH

ossa

Un modo semplice per creare un compilatore è quello di utilizzare bison e flex (o simili), per costruire un albero (AST) e generare il codice in C.Con la generazione di codice C di essere il passo più importante.Tramite la generazione di codice C, il linguaggio funziona automaticamente su tutte le piattaforme che hanno un compilatore C.

La generazione di codice C è così facile come la generazione di HTML (basta usare la stampa, o equivalente), che a sua volta è molto più facile che scrivere un C parser o HTML parser.

Dal comp.compilatori FAQ:

"La programmazione di un Personal Computer" Per Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

Questo, purtroppo,-il libro dal titolo omonimo spiega la progettazione e la realizzazione di un utente singolo ambiente di programmazione per micros, utilizzando un Pascal come linguaggio chiamato Edison.L'autore presenta tutto il codice sorgente e le spiegazioni per il passo-passo l'attuazione di un Edison compilatore e semplice sistema operativo di supporto, tutti scritti in Edison stesso (tranne che per un piccolo sostegno kernel scritto in un simbolico assembler per PDP 11/23;il sorgente completo può essere ordinato anche per IBM PC).

Le cose più interessanti di questo libro sono:1) la sua capacità di viene illustrato come creare un completo, autonomo, auto-mantenimento, utile del compilatore e del sistema operativo, e 2) l'interessante discussione linguaggio di design e delle specifiche, problemi e compromessi, nel Capitolo 2.

"Brinch Hansen su Compilatori Pascal" di Per Brinch Hansen Prentice-Hall, 1985 ISBN 0-13-083098-4

Un'altra luce-su-teoria pesante-sul-pragmatica ecco-come-al-codice-libro di informatica.L'autore presenta il progettazione, realizzazione, e il codice sorgente completo per un compilatore e del codice di p interprete per Pascal- (Pascal "meno"), una Pascal sottoinsieme con l'operatore booleano e i tipi interi (ma non i personaggi, reali, subranged o tipi enumerati), costante e definizioni di variabili e array e tipi di record (ma non imballato, variante, set, puntatore, senza nome, rinominato, o tipi di file), le espressioni, istruzioni di assegnazione, annidati procedura definizioni di valore e variabile parametri di istruzioni if, while, e inizio-fine blocchi (ma non definizioni di funzione, procedurali parametri, goto e le etichette, dichiarazione di caso, ripetere affermazioni, dichiarazioni, e con le dichiarazioni).

Il compilatore e l'interprete sono scritti in Pascal* (Pascal "star"), un Pascal sottoinsieme estesa con alcuni Edison-caratteristiche di stile per la creazione di sistemi di sviluppo software.Un Pascal* compilatore per il PC IBM è venduto da l'autore, ma è facile porta il libro di Pascal - compilatore per qualsiasi comodo Pascal piattaforma.

Questo libro rende la progettazione e l'implementazione di un compilatore sembrare facile.Io piace particolarmente il modo in cui l'autore in questione è la qualità, affidabilità e test.Il compilatore e l'interprete può essere facilmente utilizzato come base per una più coinvolti lingua o del compilatore del progetto, in particolare se hai premuto per ottenere rapidamente qualcosa e in esecuzione.

Si dovrebbe verificare Dario Bacon "ichbins"che è un compilatore per un piccolo Lisp dialetto, targeting C, in poco più di 6 pagine di codice.Il vantaggio è la maggior parte del giocattolo compilatori è che il linguaggio è abbastanza completo che il compilatore è scritto in esso.(L'archivio comprende anche un interprete per il bootstrap la cosa).

C'è più roba di quello che ho trovato utile per imparare a scrivere un compilatore sul mio Ur-Schema Di pagina web.

Python viene fornito in bundle con un compilatore python scritto in Python.Si può vedere il codice sorgente, e comprende tutte le fasi, dall'analisi, albero di sintassi astratta, con l'emissione di codice, etc.Inciderlo.

Il compilatore LCC (wikipedia) (home page del progetto) di Fraser e Hanson è descritto nel suo libro "Una nuova destinazione Compilatore C:Progettazione e Realizzazione".È abbastanza leggibile e spiega tutto il compilatore, giù per la generazione del codice.

Scusa, è in spagnolo, ma questa è la bibliografia di un corso denominato "Compiladores e Intérpretes" (Compilatori e Interpreti) in Argentina.

Il corso è stato dalla teoria dei linguaggi formali al compilatore di costruzione, e questi sono gli argomenti di cui hai bisogno per costruire, almeno, un semplice compilatore:

  • I compilatori di Design in C.
    Allen I.Holub

    Prentice-Hall.1990.

  • Compiladores.Teoría y Costruzione.
    Sanchís Llorca, F. J., Galán Pascual, C.Editoriale La Scuola Paraninfo.1988.

  • Compilatore Di Costruzione.
    Niklaus Wirth

    Addison-Wesley.1996.

  • Lenguajes, Gramáticas y Autómatas.Onu enfoque práctico.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán.Addison-Wesley Iberoamericana (España).1997.

  • L'arte del compilatore design.La teoria e la pratica.
    Thomas Pittman, James Peters.

    Prentice-Hall.1992.

  • Object-Oriented Compilatore Costruzione.
    Jim Holmes.
    Prentice Hall, Englewood Cliffs, N. J.1995

  • Compiladores.Conceptos Fundamentales.
    B.Teufel, S.Schmidt, T.Teufel.

    Addison-Wesley Iberoamericana.1995.

  • Introduzione alla Teoria degli Automi, Linguaggi e di Calcolo.

    John E.Hopcroft.Jeffref D.Ullman.
    Addison-Wesley.1979.

  • Introduzione ai linguaggi formali.
    György E.Révész.

    Mc Graw Hill.1983.

  • L'Analisi Tecniche.Una Guida Pratica.
    Cazzo Grune, Ceriel Jacobs.
    Impreso por los autores.1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc:Ancora Un Altro Compiler-Compiler.
    Stefano C.Johnson
    Informatica Relazione Tecnica Nº 32, 1975.Bell I laboratori.Murray Hill, New
    Jersey.

  • Lex:Un Generatore Di Analizzatori Lessicali.
    M.E.Lesk, E.Schmidt.Di Informatica Tecnico Report Nº 39, 1975.I Bell Laboratories.Murray Hill, New Jersey.

  • lex & yacc.
    John R.Levine, Tony Mason, Doug Marrone.
    O'Reilly & Associates.1995.

  • Elementi di teoria della computazione.
    Harry R.Lewis, Christos H.Papadimitriou.Segunda Edición.Prentice Hall.1998.

  • Onu Algoritmo Efficacia para la Costruzione del Grafo de Dependencia de Control.
    Salvador V.Cavadini.
    Trabajo Finale de Grado para obtener el Título de Ingeniero en Computación.
    Facultad de Matematica Aplicada.U. C. S. E.2001.

  1. Questo è un argomento molto vasto.Non sottovalutare questo punto.E non sottovalutare il mio punto di non sottovalutare.
  2. Ho sentito il Dragon Libro è un (il?) punto di partenza, insieme con la ricerca.:) Sempre meglio per la ricerca, alla fine sarà la tua vita.
  3. Costruire il proprio linguaggio di programmazione è assolutamente un buon esercizio!Ma sappiamo che non potrà mai essere utilizzato per qualsiasi scopo pratico, alla fine.Le uniche eccezioni sono poche e molto lontani tra loro.

Non un libro, ma una relazione tecnica e un'enorme divertente esperienza di apprendimento se vuoi sapere di più su compilatori (e metacompilers)...Questo sito vi guiderà attraverso la costruzione di un completamente autonomo compilatore sistema che può compilare e le altre lingue:

Tutorial:Metacompilers Parte 1

Questo è tutto basato su un sorprendente piccolo di 10 pagina carta tecnica:

Val Schorre META II:Una Sintassi Orientata Compilatore Lingua Di Scrittura

da onesto a dio 1964.Ho imparato a costruire i compilatori da questa nel 1970.C'è un mind-blowing momento in cui finalmente capire come il compilatore è in grado di rigenerare se stessa.....

So che il sito web autore, con i miei tempi del college, ma non ho nulla a che fare con il sito.

C'è un sacco di buone risposte qui, così ho pensato di basta aggiungere un altro alla lista:

Ho un libro che si chiama Progetto Oberon più di un decennio fa, che ha alcuni molto ben scritto, il testo del compilatore.Il libro si distingue nel senso che la fonte e le spiegazioni molto con le mani e leggibile.Il testo completo (edizione 2005) è stato reso disponibile in formato pdf, in modo che si può scaricare in questo momento.Il compilatore è discusso nel capitolo 12:

http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Niklaus Wirth, Jürg Gutknecht

(Il trattamento non è così esteso come il suo libro su compilatori)

Ho letto diversi libri su compilatori, e posso secondo il drago libro, il tempo trascorso su questo libro è molto utile.

Se siete interessati a scrivere un compilatore per un linguaggio funzionale (piuttosto che procedurale) Simon Peyton-Jones e David Lester,"L'implementazione di linguaggi funzionali:un tutorial"è un'ottima guida.

Il concettuale di basi di come la valutazione funzionale opere è guidata da esempi in un semplice ma potente linguaggio funzionale chiamato "Core".Inoltre, ogni parte del Nucleo compilatore di linguaggio è spiegato con esempi di codice in Miranda (un puro linguaggio funzionale, molto simile a Haskell).

Diversi tipi di compilatori sono descritte, ma anche se è solo seguire il cosiddetto modello compilatore per il Core e avrà un'ottima conoscenza di ciò che rende la programmazione funzionale tick.

Mi è piaciuto il Crenshaw tutorial troppo, perché rende assolutamente chiaro che un compilatore è solo un altro programma che legge in ingresso e scrive un po ' fuori posto.

Leggere.

Lavoro, se vuoi, ma poi a guardare un altro riferimento come più grande e più completo compilatori sono veramente scritto.

E leggere Fiducia Fiducia, per ottenere un indizio circa la non appariscente cose che possono essere fatte in questo dominio.

È possibile utilizzare BCEL dalla Apache Software Foundation.Con questo strumento è possibile generare assembler come codice, ma è Java con le BCEL API.Si può imparare come si può generare un codice di linguaggio intermedio (in questo caso byte di codice).

Semplice esempio

  1. Creare una classe Java con questa funzione:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

Ora eseguire BCELifier con questa classe

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

Potete vedere il risultato in console per tutta la classe (come costruire byte di codice MyClass.java).Il codice per la funzione è questa:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

Non incluso nell'elenco, finora, è questo libro:

Nozioni di base per la Progettazione di compilatori (Torben Mogensen) (dal dip.di informatica, Università di Copenhagen)

Anche io sono interessato a conoscere i compilatori e piano per entrare in quel settore nel prossimo paio di anni.Questo libro è l'ideale teoria libro per iniziare ad imparare compilatori, per quanto posso vedere.È LIBERO di copiare e riprodurre in maniera pulita e scritto con cura e dà in un inglese semplice, senza alcun codice, ma presenta ancora la meccanica di istruzioni e diagrammi etc.La pena dare un'occhiata imo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top