2010-10-15 19 views
10

Eventuali duplicati:
Learning to write a compilerCome scrivere un semplice compilatore in C/++?

Hi Stack Overflow, ora non fraintendetemi, non ho intenzione di scrivere un compilatore per C++ (anche se ho intenzione di scriverlo in C++) o Java o qualche altro linguaggio di programmazione complesso di alto livello. Voglio solo imparare le basi della conversione di un set di istruzioni di base in un eseguibile di Windows (per esempio, solo un semplice linguaggio con 5-6 funzioni, completamente personalizzato). Inoltre non voglio scaricare alcuna libreria o file di intestazione. Se potessi collegarmi a qualsiasi sorgente di esempio o tutorial di base, sarebbe molto apprezzato!

+0

questo è qualcosa che non sono mai stato veramente in grado di trovare qualcosa di spiegare. Scusa se ho causato un facepalm = ( – Cr15py

+2

Versione primordiale [Imparare a scrivere un compilatore] (http://stackoverflow.com/q/1669/2509). Per semplicità vuoi il tutorial di Crenshaw, ma per semplicità anche tu * non * voglio fare C++ ... – dmckee

+0

@dmckee +1 su non volere C++ - i compilatori che sono abbastanza sofisticati da richiedere un albero di analisi richiedono molte manipolazioni di alberi e C++ (e Java, e praticamente qualsiasi linguaggio al di fuori di ML/Haskell la famiglia e le lingue ispirate allo stesso modo come Scala) puzza davvero alle manipolazioni degli alberi –

risposta

6

Jack Crenshaw's Let's Build a Compiler è un buon tutorial per iniziare. È un bravo scrittore e rende l'argomento facile da capire.

4

Ecco cosa è necessario scrivere un compilatore di base:

  1. Parser. Dovrai analizzare la tua lingua e creare un Abstract Syntax Tree. Potresti voler imparare a scrivere parser. È possibile eseguire il codice a mano con il parser oppure utilizzare i generatori di parser, ad esempio lex/yacc.
  2. Assemblaggio. Dovrai generare istruzioni di assemblaggio dal Syntax Tree.
  3. Set di istruzioni. È necessario convertire l'assembly in codice macchina, in un set di istruzioni specifico (la CPU tipica di Intel e AMD utilizza il set di istruzioni x86, in alternativa è possibile utilizzare il set di istruzioni della VM Java o l'IL di .NET).
+2

-1 Lex non è un parser – alternative

+0

@mathepic: Non l'ho fatto affermare che era un parser. –

+0

Intendevo dire generatore di parser. – alternative

4

per analizzare l'input, si dovrebbe leggere su recursive descent parsing (questi sono probabilmente i parser più facili da implementare a mano), anche se sarà necessario anche un lexer di qualche tipo per la produzione di gettoni per il parser. Possono essere codificati a mano (l'ho fatto), anche se è più facile usare un generatore di lexer come lex o flex.

Dopo aver analizzato l'input, sarà necessario trasformarlo in output appropriato. Non posso aiutarti molto, dato che non conosco molto bene la toolchain di Windows. Il modo "facile" è generare assembly ed eseguirlo tramite NASM, MASM o qualsiasi altro assemblatore fornito con l'ambiente del compilatore. Se la tua lingua è sufficientemente semplice, puoi semplicemente generare l'assembly mentre vai nel codice parser.

+0

Grazie amico, personalmente la ragione per cui sto cercando di imparare questo (e il motivo per cui odio le biblioteche), è perché amo scrivere le cose da solo, e questo è un argomento che voglio capire. Il lexing e così capisco, è quel punto mistificato in cui il testo passa dal testo al codice eseguibile. D'altra parte vorrei ringraziarvi per il link. – Cr15py

0

Consiglierei www.antlr.org. Ho lavorato in C#, ma ha supporto per C, Java, Python e altro ancora.

2

In realtà, la cosa più importante è necessario è quello di capire il formato binario di file .exe (A meno che non si prevede di utilizzare un linker esistente, a quel punto penso che è necessario per i file di output obj che hanno anche un binario formato).

È inoltre necessario gestire un sacco di assemblaggio, a meno che non si abbia già MOLTO familiarità con il set di istruzioni x86, proverei qualcos'altro.

Qui ci sono alcune possibilità:

  • Ci deve essere utilizzato una cosa chiamata "Piccolo C" - Sto indovinando questo è: http://bellard.org/tcc. Tiny C è un compilatore abbastanza buono da costruire da solo, ma non così complesso da essere difficile da capire. È una lezione "How-to build a compiler" in una scatola. Incasinato con l'8088.

  • Uscita per una CPU "Embedded". Tendono ad avere linguaggi di assemblaggio semplici e formati eseguibili chiaramente definiti. Questo sarebbe un buon punto di partenza.

  • Uscita codice C anziché binario. Questo è sicuramente un trucco, ma puoi concentrarti sulla tua lingua e non preoccuparti troppo del linguaggio dell'assemblaggio.

  • Infine, se si desidera creare direttamente un file .exe, innanzitutto scrivere un'app che produca un exe "Hello world". Non preoccuparti di averlo "Compilare" qualsiasi cosa, basta modificare il codice manualmente, inserirlo nel formato exe ed eseguirlo - in questo modo saprai che hai tutti i tuoi pezzi allineati e nei punti giusti, allora tu può iniziare su un compilatore con una certa sicurezza.

Dopo questo, creando poi la lingua può essere fatto attraverso un sacco di procedure qui riportati - ma se si desidera solo per vedere come funziona il tutto, mi piacerebbe sicuramente fare alcune piccole iterazioni prima, non preoccuparti di cosa ti imbatterai fino a quando non lo incontrerai.

0

Per sapere come la compilazione di un compilatore è diversa in C++ rispetto a, ad esempio, in C o in Pascal, provare il framework del parser Boost Spirit.

Questo presuppone la familiarità con C++.

Per informazioni sulla creazione di un compilatore, suggerisco di utilizzare un linguaggio più semplice rispetto al C++, quindi avanzare al C++.

Acclamazioni & hth.,

Problemi correlati