Benutzer-Werkzeuge

Webseiten-Werkzeuge


compilerbau:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
compilerbau:start [2021/10/29 07:42] – [Fertiges Programm zum Ausprobieren] Martin Pabstcompilerbau:start [2022/05/19 08:10] (aktuell) – [Fertiges Programm zum Ausprobieren] Martin Pabst
Zeile 1: Zeile 1:
 ====== Compilerbau (Einführung) ====== ====== Compilerbau (Einführung) ======
-Ein Schüler (Lukas) bat um eine Erklärung, wie ein Compiler (z.B. [[https://www.pabst-software.de/doku.php?id=programme:eos:start|EOS]] oder die [[https://www.online-ide.de|Online-IDE]]) programmiert wird. Leider pflegen alle Artikel, die ich dazu im Internet finde, einen recht theoretischen Zugang zum Thema. Daher möchte ich die Sache im Folgenden so erklären, wie ich sie (damals als Schüler in der 12. Jahrgangsstufe) an einem einfachen, in Pascal geschriebenen Compiler gelernt habe. \\ +<WRAP center round tip 80%> 
 +Wenn Du Dich für Compilerbau interessierst, solltest Du unbedingt das Buch [[https://craftinginterpreters.com/|"Crafting Interpreters"]] von Robert Nystrom lesen. Es ist sehr kurzweilig und äußerst anschaulich geschrieben. Für alle, die sich das Buch nicht leisten können, hat der Autor es [[https://craftinginterpreters.com/contents.html|hier kostenlos in Html-Form]] veröffentlicht. 
 +</WRAP> 
 + 
 +Ein Schüler von mir (Lukas) fragte mich, wie ein Compiler (z.B. [[https://www.pabst-software.de/doku.php?id=programme:eos:start|EOS]] oder die [[https://www.online-ide.de|Online-IDE]]) programmiert wird. Leider pflegen alle Artikel, die ich dazu im Internet finde, einen recht theoretischen Zugang zum Thema. Daher möchte ich die Sache im Folgenden so erklären, wie ich sie (damals als Schüler in der 12. Jahrgangsstufe) an einem einfachen, in Pascal geschriebenen Compiler gelernt habe. \\  
 + 
 +<WRAP center round info 80%> 
 +Ein **Compiler** ist ein Computerprogramm, das einen in einer Programmiersprache verfassten Programmtext einliest und in eine andere Programmiersprache umwandelt oder direkt ausführt. Er arbeitet üblicherweise in drei Schritten, die nacheinander ausgeführt werden: 
 +  - **Lexer**: Der Lexer zerlegt den Programmtext in die kleinsten syntaktisch sinnvollen Einheiten ("Tokens").  
 +  - **Parser**: Der Parser analysiert die Liste der Tokens und erstellt daraus eine strukturelle Repräsentation des Programms, üblicherweise einen Baum ("Syntaxbaum" oder "abstract syntax tree" oder kurz: AST) 
 +  - **Interpreter/Codegenerator**: Ein Interpreter kann das als AST übergebene Programm direkt ausführen. Ein Codegenerator kann es in eine andere Programmiersprache (z.B. Maschinensprache) umwandeln. 
 +</WRAP>
  
-Ein Compiler ist ein Computerprogramm, das einen in einer Programmiersprache verfassten Programmtext einliest und in eine andere Programmiersprache umwandelt oder direkt ausführt. Er arbeitet üblicherweise in drei Schritten, die nacheinander ausgeführt werden: 
-  - Lexer: Der Lexer zerlegt den Programmtext in die kleinsten syntaktisch sinnvollen Einheiten ("Tokens").  
-  - Parser: Der Parser analysiert die Liste der Tokens und erstellt daraus eine strukturelle Repräsentation des Programms, üblicherweise einen Baum ("Syntaxbaum" oder "abstract syntax tree" oder kurz: AST) 
-  - Interpreter/Codegenerator: Ein Interpreter kann das als AST übergebene Programm direkt ausführen. Ein Codegenerator kann es in eine andere Programmiersprache (z.B. Maschinensprache) umwandeln. 
  
 Im Folgenden wird die Funktionsweise eines Compilers vorgestellt, der mathematische Terme (z.B. ''2 * (3 + a) - b'' ) mit gegebenen Variablenbelegungen zur Laufzeit auswerten kann. In einem zweiten Schritt wird dieser Compiler zu einer einfachen Programmiersprache [[.erweiterung:start|erweitert]], die Wiederholungen, Zuweisungen und eine einfach Print-Anweisung enthält. Im Folgenden wird die Funktionsweise eines Compilers vorgestellt, der mathematische Terme (z.B. ''2 * (3 + a) - b'' ) mit gegebenen Variablenbelegungen zur Laufzeit auswerten kann. In einem zweiten Schritt wird dieser Compiler zu einer einfachen Programmiersprache [[.erweiterung:start|erweitert]], die Wiederholungen, Zuweisungen und eine einfach Print-Anweisung enthält.
  
 +====== Inhalt dieses Tutorials ======
   * [[.lexer:start|a) Lexer]] \\    * [[.lexer:start|a) Lexer]] \\ 
   * [[.parser:start|b) Parser]] \\    * [[.parser:start|b) Parser]] \\ 
Zeile 18: Zeile 26:
  
 ====== Fertiges Programm zum Ausprobieren ====== ====== Fertiges Programm zum Ausprobieren ======
-Der Compiler unten bekommt ein kleines Testprogramm übergeben. Er verarbeitet es in drei Schritten:+Ihr wollt sicher sehen, was der Compiler kann, der im Rahmen dieses Tutorials erstellt wird, daher hier gleich ein Blick auf das fertige Programm. \\ \\  
 +Unser Compiler unten bekommt ein kleines Testprogramm übergeben. Er verarbeitet es in drei Schritten:
   - Der Lexer zerlegt das Programm in einzelne Tokens.   - Der Lexer zerlegt das Programm in einzelne Tokens.
   - Der Parser bekommt die Tokenliste und baut daraus den AST (abstract syntax tree) auf.   - Der Parser bekommt die Tokenliste und baut daraus den AST (abstract syntax tree) auf.
   - Der Interpreter führ das Testprogramm aus, indem er den AST geeignet traversiert.   - Der Interpreter führ das Testprogramm aus, indem er den AST geeignet traversiert.
  
-Hier das Testprogramm:+Hier das Testprogramm, das unser Compiler übersetzen wird.:
 <code java> <code java>
 a = 1; a = 1;
Zeile 33: Zeile 42:
 } }
 </code> </code>
 +
 +
 +<WRAP center round tip 80%>
 +Schreibe weitere Testprogramme mit der oben angegebenen Syntax, füge sie unten ein und lasse sie vom Compiler übersetzen und ausführen!
 +</WRAP>
  
  
Zeile 42: Zeile 56:
  * Der Text wird hier Stringkonstante definiert. Er könnte ebenso  * Der Text wird hier Stringkonstante definiert. Er könnte ebenso
  * gut gerade vom Benutzer eingegeben worden sein. Wichtig ist: Der  * gut gerade vom Benutzer eingegeben worden sein. Wichtig ist: Der
- * Java-Compiler compiliert hier nichts. Es wird alles durch Lexer, + * Java-Compiler compiliert hier nichts. Es wird alles durch unseren 
- * Parser und Interpreter erledigt.+ selbstprogrammierten Compiler (Lexer, Parser und Interpreter
 + * übersetzt und ausgeführt.
  */  */
-String text =  +String text = """ 
-   "a = 1;\n" +  +a = 1; 
-   "b = 2; \n" +  +b = 2;  
-   "while(a < 10) { \n" +  +while(a < 10) {  
-   "  a = a + 1; \n" +  +  a = a + 1;  
-   "  b = b * 2; \n" +  +  b = b * 2;  
-   "  print(b); \n" +  +  print(b);  
-    }";+
 +""";
  
 println("Eingabetext:\n" + text); println("Eingabetext:\n" + text);
compilerbau/start.1635486154.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki