Tüftelnde Dolmetscher

Größe: px
Ab Seite anzeigen:

Download "Tüftelnde Dolmetscher"

Transkript

1 20 So funktionieren Compiler Tüftelnde Dolmetscher Compiler übersetzen Quellcode in lauffähige Programme und Bibliotheken. Das klingt simpel, ist es aber nicht: Im Inneren moderner Compilersuiten analysiert ein mehrstufiger Prozess die Sourcen, weist auf Fehler hin, erzeugt Zwischencodes und Tabellen, sortiert viel um und macht sich über den Zielprozessor Gedanken. Tim Schürmann besjunior, 123RF Unter ihrem Blech arbeitet die vermeintlichen Blackbox Compiler komplexe Prozesse ab, deren Implementierung gute Kenntnisse in Automatentheorie und formalen Sprachen verlangt. Es verwundert also nicht, wenn Compilerbau als Lehrinhalt für angehende Informatiker oder Automatisierungstechniker Standard ist. Wer nicht in einer solchen Vorlesung saß oder eine Auffrischung brauchen könnte, für den fasst dieser Artikel die Grundlagen zusammen. Als Ideengeber diente ein Vorlesungsskript (siehe Kasten Lehrstoff Compilerbau ). Grob vereinfacht durchläuft ein Compiler drei Schritte: Er liest zunächst den Quellcode ein, analysiert ihn und synthetisiert das fertige Programm (Abbildung 1). Im ersten Schritt liest der Compiler den Quellcode zeichenweise ein und versucht Schlüsselwörter, Variablennamen, Zahlen, Strings und alle weiteren Bestandteile zu identifizieren. Um diese lexikalische Analyse kümmert sich der Scanner. Er überliest zudem alle Kommentare. Syntax In der zweiten Phase prüft eine weitere Komponente die Syntax und die Semantik des Programms. Ihr fällt beispielsweise auf, wenn ein Programmierer eine Variable nutzt, die er noch gar nicht deklariert hat, oder wenn ein Semikolon am Ende eines Ausdrucks fehlt. Moderne Compiler trennen dabei noch einmal zwischen syntaktischer und semantischer Analyse: Die als Parser bezeichnete Komponente des Compilers versucht die Syntaxelemente zu erkennen. Ist dies geglückt, ruft sie eine entsprechende Funktion auf, die semantische Routine. Diese prüft beispielsweise, ob der Programmierer die Variable auch tatsächlich deklariert hat. Diese Trennung erlaubt es, Aufgaben besser zu optimieren und den Quellcode effizienter zu analysieren. Zudem lassen sich die beiden Komponenten so besser warten und portieren. Die Syntax- und Semantik-Analyse entpuppt sich aber als nicht-triviale Aufgabe, wie ein simples Beispiel zeigt: Der Compiler für einen dummen Taschenrechner soll eine Textdatei mit einem Rechenausdruck einlesen. Der Taschenrechner kann nur Zahlen addieren und multiplizieren, Punkt- geht vor Strichrechnung. Im Zweifel geben die Klammern die Reihenfolge vor. Erlaubt ist etwa (1+3)*(4+5) aber nicht: (1+)*4 Der Compiler muss in diesem Fall verstehen, welcher der beiden Ausdrücke gültig ist und welcher nicht. Grammatik Damit der Compiler den zweiten Ausdruck als fehlerhaft erkennt, teilt der Compilerbauer ihm zunächst mit, wie der korrekte Quellcode aufgebaut ist. Das geschieht über Regelsätze. Ähnlich wie bei regulären Ausdrücken prüft der Compiler dann, ob der Quellcode diese Regeln einhält. Im Beispiel ist eine einzelne Zahl Lehrstoff Compilerbau Wollen (und müssen) Informatikstudenten lernen, was die Programmiersprachen-Welt im Innersten zusammenhält, besuchen sie am besten eine Vorlesung zum Thema Compilerbau. So eine hielt auch Mathematik-Professor Peter Köhler im Sommersemester 2016 an der Uni Gießen [1]. Mit seiner freundlichen Genehmigung hat sich das Linux-Magazin durch die Aufzeichnungen gearbeitet und fasst die wichtigsten Punkte zusammen.

2 offensichtlich ein gültiger Ausdruck. Liegen zwei Ausdrücke»x«und»y«vor, dann Quellcode sind auch»x + y«,»x * y«und»(x)«gültige Ausdrücke. Die Regeln lassen sich auch formal in Kurzschreibweise notieren. Durchaus beliebt ist die Backus-Naur- Form (BNF). Für das Beispiel ergibt sich damit der Kürzelsalat aus Listing 1: Das Programm (»program«) besteht hier aus einem Ausdruck (»expr«). Der wiederum liegt dann vor, wenn es sich entweder um einen»term«handelt, oder wenn es sich ebenfalls um einen»term«handelt, dem aber das Zeichen»+«und dann wieder ein Ausdruck folgen. Analog sind die übrigen Regeln zu lesen. Die letzte Regel ist nötig, da Zahlen aus mehreren Ziffern (»digits«) bestehen können. Diese Regeln, so genannte Produktionen oder Ableitungsregeln, bilden die Grammatik der Quellsprache. Wie die deutsche Grammatik gibt diese Grammatik Regeln vor, welche die Programmiersprache konstituieren. Kürzel wie»term«oder»factor«heißen Symbole. Alle Symbole, die auf der linken Seite stehen, nennt der Fachmann Nicht-Terminale, alle anderen Terminale. Letztgenannte wären im Beispiel»digit«,»+«,»*«,»(«und»)«. Für eine Programmiersprache dürfen mehrere Grammatiken existieren. Welche der Entwickler wählt, hängt von der Sprache und den Anforderungen ab. Mit der obigen Grammatik lassen sich unendlich lange Ausdrücke und somit Programme schreiben. Das gelingt nur, weil einige Regeln einen rekursiven Aufbau besitzen. Die im Beispiel genutzte Grammatik bezeichnet die Grammatiktheorie als kontextfreie Grammatik (oder Typ 2). Sie wird als regulär bezeichnet, wenn alle Regeln einer der beiden Formen folgen: U ::= t U ::= Vt Lesen Analysieren Übersetzen Scanner Dabei ist»t«ein Terminalzeichen,»U«und»V«sind Nicht-Terminal-Zeichen. Top-down-Parser syntaktische und semantische Analyse Zur großen Freude der Entwickler lässt sich aus der Grammatik recht elegant ein Compiler basteln: Für alle Nicht- Terminale erstellt der Entwickler dazu jeweils eine Funktion, die sich um die entsprechende Auswertung kümmert. Sie ruft bei Bedarf die entsprechenden Kolleginnen zu Hilfe. Die zu»expr«gehörende Listing 1: Backus-Naur-Form 01 program ::= expr 02 expr ::= term term + expr 03 term ::= factor factor * term 04 factor ::= number ( expr ) 05 number ::= digit digit number Listing 2:»expr()«01 int expr() { 02 int wert = term(); 03 if (File.ReadNextChar() == '+') wert += expr(); 04 return wert; 05 } Code erzeugen Abbildung 1: Grober Aufbau eines Compilers: Code einlesen, analysieren und ausführbares Programm erzeugen. Maschinencode Grundlagen 12/2017 Titelthema 21

3 22 Abbildung 2: Die Projekt-Webseite stellt den unter Linux recht bekannten Parser-Generator Bison vor. Funktion»expr()«besitzt beispielsweise einen Aufbau, wie ihn Listing 2 kurz skizziert. Gemäß der zweiten Regel in Listing 1 beginnt ein korrekter Ausdruck wie»1+2«in jedem Fall mit einem»term«. Die Funktion»expr()«bittet daher im ersten Schritt die noch zu implementierende Kollegin»term()«um eine Auswertung. Als Antwort liefert»term()«im Beispiel die»1«zurück. Im zweiten Schritt schaut sich»expr()«anschließend das nächste Zeichen im Quellcode an. Handelt es sich bei diesem um ein»+«, muss gemäß der zweiten Regel von Listing 1 wieder ein Ausdruck folgen, weshalb sich»expr()«selbst aufruft. Das Ergebnis dieses»expr()«liefert im Beispiel die»2«, die der Compiler auch gleich selbst zu dem schon berechneten Zwischenergebnis addiert. Damit wäre der Compiler am Ende eines gültigen Ausdrucks angekommen, weshalb»expr()«im Beispiel den fertig berechneten Wert zurückgibt. Ein ausgewachsener Compiler könnte an dieser Stelle eine passende Anweisung in Maschinencode generieren. Für alle anderen Nicht-Terminale generiert der Entwickler Funktionen nach dem gleichen Prinzip. Setzt er dann»program()«auf die Quellcodedatei an, erhält er automatisch das fertig übersetzte Programm im Beispiel wäre das die fertig berechnete Zahl. Da die Verarbeitung mit»program«beginnt, bezeichnen Informatiker dieses Symbol auch als Startsymbol. Die Aufrufe der einzelnen Funktionen lassen sich in diesem Szenario als Baum darstellen, den so genannten Syntaxbaum. Scheitert ein Programmierer bei dem Versuch, für seinen Code einen solchen Baum aufzumalen, hat er mit ziemlicher Sicherheit auf dem Weg einen Fehler gemacht. Bottom-up-Parser Im bisher beschriebenen Prozess geht der Parser einfach vom Startsymbol aus (im Beispiel»program«) und versucht dann, für jedes eingelesene Zeichen passende Regeln in der Grammatik zu finden. Solche Parser nennt die Informatik Topdown-Parser. Andere Parser gehören zu den so genannten Bottom-up-Parsern und gehen nach einem entgegengesetzten Schema vor: Sie versuchen den Quellcode mit Hilfe der Grammatikregeln so lange zu ersetzen (Reduktion), bis zum Schluss nur noch das Startsymbol übrig bleibt. In der Praxis nutzen solche Bottom-up-Parser üblicherweise einen zu Beginn leeren Stack, auf den sie alle bereits erkannten Nicht-Terminale und alle gelesenen Zeichen werfen. Nach jedem neu gelesenen Zeichen prüfen sie, ob die obersten Elemente auf dem Stack zur rechten Seite einer Grammatikregel passen. Ist das der Fall, nehmen diese Parser die Elemente vom Stack und legen das Nicht-Terminal von der linken Seite der gefundenen Grammatikregel oben drauf. Das ganze Verfahren läuft so lange, bis zum Schluss lediglich noch das Startsymbol übrig und gleichzeitig das Ende des Quellcodes erreicht ist. Klappt das nicht, liegt wahrscheinlich ein Fehler vor. Arbeitet ein Bottom-up-Parser nach diesem Muster, heißt er im Fachjargon auch Shift-Reduce-Parser. Die Programmierung von Scanner und Parser ergibt sich recht gradlinig aus der Grammatik der Sprache. Dieser Vorgang lässt sich auch automatisieren: Tools wie Flex [2] oder Bison [3] erzeugen aus der Grammatik automatisch den Quellcode für passende Scanner und Parser (Abbildung 2). Meist spannt der Parser den Scanner ein: Wann immer der Parser weitere Informationen benötigt, fordert er diese vom Scanner an. Im obigen Beispiel in Listing 2 würde die Funktion»expr()«somit nicht das nächste Zeichen selbst einlesen, sondern statt»file.readnextchar()«einfach den Scanner befragen. Anders als in dem Beispiel liest der nicht immer nur das nächste Zeichen ein. Scanner-Interna: Automaten Der Quellcode der meisten Programmiersprachen besteht aus Zahlen, (Variablen-)Namen, Schlüsselwörtern, Operatoren und Trennzeichen (Delimiter), zu denen etwa»+«,» «und»;«gehören. Namen und Schlüsselwörter setzen sich aus mehreren Buchstaben und Zeichen zusammen. Das gilt bei vielen Sprachen auch für einige Delimiter, etwa»+=«oder»!=«. Beim Erkennen von»int«,»&&«und allen anderen Bestandteilen der Sprache hilft dem Scanner ein so genannter endlicher Automat. Den darf sich der interessierte Laie wie einen Fahrkartenautomaten vorstellen: Der Kunde wirft 20 Cent ein, woraufhin der Automat in den Zustand 20 Cent bezahlt wechselt. Wirft der Kunde einen Euro nach, ändert der Automat den Zustand in 120 Cent bezahlt. Das geht so weiter, bis der Automat den Zustand Preis komplett bezahlt erreicht. Analog lässt sich auch ein Automat basteln, der statt Münzen die Buchstaben aus dem Quellcode entgegennimmt. Mit jedem gelesenen Zeichen wechselt der Automat in einen anderen Zustand: Hat

4 der Scanner ein»i«gelesen, wechselt er in den Zustand i gelesen, kommt das»n«hinzu, wechselt er in den Zustand n gelesen. Folgt das»t«, wechselt der Automat schließlich in den Zustand int erkannt. Dieser Automat besitzt dabei einen Anfangszustand und mindestens einen Endzustand. Der Automat zum Erkennen von»int«hat den Anfangszustand noch kein Zeichen gelesen und die beiden Endzustände int erkannt und nicht das Schlüsselwort int. Tritt der erstgenannte Endzustand ein, sprechen Informatiker davon, dass der Automat das Wort»int«akzeptiert. Ein Automat lässt sich auch in Form eines Diagramms aufzeichnen, in dem Kästen (Knoten) die einzelnen Zustände repräsentieren. Die Start- und Endzustände hebt das Diagramm dabei entsprechend hervor. Pfeile (Kanten) zeigen an, von welchem Zustand der Automat in welchen anderen Zustand wechselt. Der jeweilige Wechsel findet dabei nur dann statt, wenn der Automat eines der an dem Pfeil notierten Zeichen gelesen hat (Abbildung 3). Aus einer regulären Grammatik lässt sich nicht nur ein Parser, sondern auch ein endlicher Automat konstruieren, der die Sprache der Grammatik akzeptiert: Zunächst erstellt der Programmierer für alle Nicht-Terminale einen Zustand, hinzu kommen der Anfangs- und der Endzu- stand. Danach fügt er für ein gelesenes Zeichen»t«einen Übergang vom Zustand»s«zum Zustand»n«ein, wenn es eine Grammatikregel in der Form»n ::= st«gibt. Ganz nebenbei entsteht so ein Bottom-up-Parser für die Grammatik. Den Automaten muss er nur noch in den eigenen Compiler einbauen. Bei einem einfachen Szenario könnte er nun das nächste Zeichen einlesen und mit»if«- Abfragen oder in einem»switch«-konstrukt prüfen, um welches Zeichen es sich handelt, und sich schließlich in Form einer Variablen merken, in welchen neuen Zustand der Automat gewechselt ist. Hat der Scanner das nächste Element im Quellcode erkannt (wie etwa das Schlüsselwort»int«), ersetzt er es durch ein Symbol und gibt dieses an den Parser zurück. Das bereits erwähnte Tool Flex Interpreter, Assembler und Übersetzer Anders als der Compiler liest ein Interpreter den Quellcode ein und führt ihn direkt aus, es entsteht folglich kein Objektcode. Die klassischen Interpreter analysieren jeden einzelnen Befehl im Quellcode nacheinander. Diese Vorgehensweise nutzten beispielsweise die Basic- Interpreter in den 1990er Jahren. Moderne Interpreter überführen zunächst den kompletten Quellcode in eine spezielle optimierte interne Darstellung. Diesen Zwischenoder Bytecode führt der Interpreter dann wesentlich schneller aus. Mitunter übersetzt ein Just-in-Time-Compiler die interne Darstellung nutzt ebenfalls die Strategie mit endlichen Automaten. Symboltabelle Um den Quellcode im Speicher kompakt darzustellen, ersetzt der Scanner jedes erkannte Schlüsselwort, jeden Variablennamen und alle weiteren Elemente jeweils durch ein Symbol. Die recht langen Variablennamen könnte er etwa gegen zwei Zahlen tauschen: Die erste Zahl dient als Ersatz für den Variablennamen. Die zweite gibt die Zeile in einer Tabelle, der so genannten Symboltabelle, an, in der dann der vom Entwickler genutzte Variablenname steht. Während der Syntax- und Semantik-Analyse landen in der Symboltabelle noch weitere Informationen, etwa der Typ der Variablen. in Maschinensprache, was die Ausführungsgeschwindigkeit noch einmal erhöht. In der Praxis verwendet etwa Java dieses Vorgehen. Ein Assembler ist eine spezielle Form des Compilers, der ein Programm in Assemblersprache oder in Maschinensprache übersetzt. Da Assembler in der Regel eine symbolische Darstellung der Maschinenbefehle ist, ähneln sich beide Sprachen. Meist fasst der Oberbegriff Übersetzer alle drei, also Compiler, Assembler und Interpreter, zusammen. So lässt sich am Ende sagen, dass ein Übersetzer ein Quellprogramm in ein Objektprogramm überführt. Grundlagen 12/2017 Titelthema 23

5 24 + Letter =, Delimiter ID Number + =, + Ziel Start *, (,), ; Letter, ~gc1079/ Abbildung 3: Der Automat wechselt den Zustand, sobald er auf ein bestimmtes Zeichen trifft. Um möglichst schnell einen Eintrag in der Symboltabelle zu finden, jagen viele Compiler den Variablennamen durch eine schnell zu berechnende Hashfunktion. Die wiederum spuckt eine Zahl aus, die der Compiler dann als Index in der Symboltabelle verwendet. Trifft der Compiler später wieder auf den Variablennamen, berechnet er einfach den Hashwert und erhält so umgehend den Speicherort in der Symboltabelle mit allen wichtigen Informationen über die Variable etwa ihren Typ. Der Compiler muss also nicht umständlich die komplette Tabelle durchforsten. Sowohl Scanner als auch die semantische Routine erzeugen neben der Symboltabelle während ihrer Arbeit noch einige weitere Tabellen. In ihnen liegen unter anderem die Schachtelungsstruktur für die Schleifen und die Schleifenvariablen. Auf die Informationen in den Tabellen greift der Compiler auch im späteren Verlauf immer wieder zurück. Interne Darstellung des Quellcodes Die von ihm ermittelten Symbole reicht der Scanner an den Parser weiter. Am Ende der Syntax- und Semantik-Analyse steht eine interne Darstellung des Quellcodes. Wie genau diese Darstellung aussieht, hängt vom Compiler und den Sprachen ab. So könnte das Programm als Syntaxbaum vorliegen oder in der polnischen Notation. Viele Compiler nutzen auch Quadrupel, aus der Anweisung»A = B + A«würde dann etwa: +, B, A, T1 =, T1, A»T1«ist eine temporäre Variable, die der Compiler erzeugt. Die Operanden liegen dabei anders als hier im Beispiel in der internen Darstellung als Zeiger auf die passenden Zeilen in der Symboltabelle vor. Bis zu diesem Zeitpunkt hat der Compiler das Quellprogramm jedoch lediglich analysiert. Diese erste Phase nennen Experten aus diesem Grund auch die Analysephase. Code-Erzeugung Im nächsten Schritt optimiert eine weitere Komponente die interne Darstellung. In der Regel optimiert der Compiler die Laufzeit und weist den Variablen Laufzeit-Speicherplätze zu. Im obigen Beispiel würde der Compiler beispielsweise versuchen die temporäre Variable»T1«zu eliminieren. In der letzten Phase erzeugt der Compiler schließlich den ausführbaren Maschinencode. Den bezeichnen Programmierer allgemein auch als Objektcode oder landläufig einfach als Code. Unter Linux handelt es sich üblicherweise entweder um eine (dynamische) Bibliothek oder das ausführbare Programm. Einige Compiler produzieren allerdings auch Assemblercode, den im Anschluss noch ein nachgeschalteter Assembler in Maschinensprache umwandelt. Aus dem Beispiel»A = A + B«könnte der Compiler etwa folgenden Code generieren: lda a add b sto a ; Lade a in den Akku ; Addiere b zum Akku ; Speichere Akku nach a Kontrollstrukturen wie»if«,»while«und»for«lassen sich in der Regel mit den Sprunganweisungen des Prozessors abbilden. Komplexe Schleifen, etwa das in C enthaltene»for«, ersetzt wahlweise eine (längere)»while«-schleife. Weil er den Prozessor-Befehlssatz kennt und ihm die Informationen aus den Tabellen helfen, gestaltet der Compiler den Code zudem kompakter. Bei Funktionsaufrufen kommt der Stack zum Einsatz: Vor dem Start einer Funktion wirft der Compiler deren Argumente und die Rücksprungadresse auf den Stack. Dann führt der Prozessor die Funktion aus. Schließlich muss der Compiler den Stack bereinigen, wobei ihn aktuelle Prozessoren mit speziellen Befehlen unterstützen. Den vorgestellten Ablauf halten nicht alle Compiler ein. So genannte One- Pass-Compiler verzichten beispielsweise auf eine interne Darstellung des Codes und generieren den Objektcode in einem einzigen Durchlauf. Dabei erzeugen die semantischen Routinen auch gleichzeitig die passenden Maschinenbefehle. Des Weiteren sind die vorgestellten Phasen mitunter ineinander verzahnt. (kki) n Infos [1] Compilerbau-Vorlesungsskript: [ www. staff. uni giessen. de/ ~gc1079/] [2] Flex: [ github. com/ westes/ flex] [3] Bison: [ www. gnu. org/ software/ bison/]

Was ist ein Compiler?

Was ist ein Compiler? Was ist ein Compiler? Was ist ein Compiler und worum geht es? Wie ist ein Compiler aufgebaut? Warum beschäftigen wir uns mit Compilerbau? Wie ist die Veranstaltung organisiert? Was interessiert Sie besonders?

Mehr

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme und Grammatikregeln

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme und Grammatikregeln Stefan Brass: OOP (Java), 3. Syntaxdiagramme und Grammatikregeln 1/32 Objektorientierte Programmierung Kapitel 3: Syntaxdiagramme und Grammatikregeln Stefan Brass Martin-Luther-Universität Halle-Wittenberg

Mehr

Fachseminar WS 2008/09

Fachseminar WS 2008/09 Fachseminar WS 2008/09 Fachgebiet: Compilerbau Thema: Lexikalische Analyse (Scanner) Referent: Ali Sediq Betreuer: Prof. Dr. Helmut Weber 1 Inhaltsverzeichnis Lexikalische Analyse 1.0 Grundprobleme der

Mehr

ARBEITSBLATT ZU FORMALEN SPRACHEN

ARBEITSBLATT ZU FORMALEN SPRACHEN ARBEITSBLATT ZU FORMALEN SPRACHEN Aufgabe 1: Gegeben ist die folgende Formale Sprache L(G) mit G = (T, N, P, S). Die Produktionen lauten ZUWEISUNG ::= name zuweisungsoperator AUSDRUCK semikolon AUSDRUCK

Mehr

Kapitel 4: Syntaxdiagramme und Grammatikregeln

Kapitel 4: Syntaxdiagramme und Grammatikregeln 4. Syntaxdiagramme und Grammatikregeln 4-1 Objektorientierte Programmierung (Winter 2006/2007) Kapitel 4: Syntaxdiagramme und Grammatikregeln Syntaxdiagramme Grammatikregeln (kontextfrei) Beispiele: Lexikalische

Mehr

9 Theoretische Informatik und Compilerbau

9 Theoretische Informatik und Compilerbau 9 Theoretische Informatik und Compilerbau Theoretische Informatik und Mathematik schaffen die Basis für viele der technischen Entwicklungen, die wir in diesem Buch besprechen. Die boolesche Algebra (S.

Mehr

1 Syntax von Programmiersprachen

1 Syntax von Programmiersprachen 1 Syntax von Programmiersprachen Syntax ( Lehre vom Satzbau ): formale Beschreibung des Aufbaus der Worte und Sätze, die zu einer Sprache gehören; im Falle einer Programmier-Sprache Festlegung, wie Programme

Mehr

Alphabet, formale Sprache

Alphabet, formale Sprache n Alphabet Alphabet, formale Sprache l nichtleere endliche Menge von Zeichen ( Buchstaben, Symbole) n Wort über einem Alphabet l endliche Folge von Buchstaben, die auch leer sein kann ( ε leere Wort) l

Mehr

Interpreter - Gliederung

Interpreter - Gliederung Institut für Informatik Ludwig-Maximilian Universität Interpreter - Gliederung Programmiersprache Syntax Konkrete Syntax Abstrakter Syntax Baum (Abstrakte Syntax) Parser Syntaktische Struktur einer Sprache

Mehr

Programmierkurs II. C und Assembler

Programmierkurs II. C und Assembler Programmierkurs II C und Assembler Prof. Dr. Wolfgang Effelsberg Universität Mannheim Sommersemester 2003 1-1 Inhalt Teil I: Die Programmiersprache C 2. Datentypen und Deklarationen 3. Operatoren und Ausdrücke

Mehr

Grundlagen der Programmentwicklung

Grundlagen der Programmentwicklung Informatik für Elektrotechnik und Informationstechnik Benedict Reuschling [email protected] Hochschule Darmstadt Fachbereich Informatik WS 2013/14 Über C++ Über C++ C++ ist eine in der Industrie

Mehr

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder Programmieren in PASCAL Bäume 1 1. Baumstrukturen Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder 1. die leere Struktur oder 2. ein Knoten vom Typ Element

Mehr

Software Entwicklung 2. Übersetzerbau 1

Software Entwicklung 2. Übersetzerbau 1 Software Entwicklung 2 Übersetzerbau 1 Übersetzerbau I Inhalt Aufgaben von Übersetzern Weitere Anwendungen von Übersetzern Arten von Übersetzern Grundlagen: Sprachdefinition Grammatik: BNF, EBNF, Syntaxdiagramme

Mehr

Einführung in die Informatik Grammars & Parsers

Einführung in die Informatik Grammars & Parsers Einführung in die Informatik Grammars & Parsers Grammatiken, Parsen von Texten Wolfram Burgard Cyrill Stachniss 12.1 Einleitung Wir haben in den vorangehenden Kapiteln meistens vollständige Java- Programme

Mehr

Grammatiken. Eine Grammatik G mit Alphabet Σ besteht aus: Variablen V. Startsymbol S V. Kurzschreibweise G = (V, Σ, P, S)

Grammatiken. Eine Grammatik G mit Alphabet Σ besteht aus: Variablen V. Startsymbol S V. Kurzschreibweise G = (V, Σ, P, S) Grammatiken Eine Grammatik G mit Alphabet Σ besteht aus: Variablen V Startsymbol S V Produktionen P ( (V Σ) \ Σ ) (V Σ) Kurzschreibweise G = (V, Σ, P, S) Schreibweise für Produktion (α, β) P: α β 67 /

Mehr

Formale Sprachen und Grammatiken

Formale Sprachen und Grammatiken Formale Sprachen und Grammatiken Jede Sprache besitzt die Aspekte Semantik (Bedeutung) und Syntax (formaler Aufbau). Die zulässige und korrekte Form der Wörter und Sätze einer Sprache wird durch die Syntax

Mehr

Grammatiken und ANTLR

Grammatiken und ANTLR Grammatiken und ANTLR Zusatzfolien zu Algo Blatt 6 Author: Henry Schaefer http://www.majeeks.de/folien_blatt6.pdf Grammatik Definition: syntaktische Beschreibung einer Sprache (H.S.) Definiton Grammatik

Mehr

Theoretische Informatik I

Theoretische Informatik I Theoretische nformatik inheit 3 Kontextfreie Sprachen 1. Kontextfreie Grammatiken 2. Pushdown Automaten 3. igenschaften kontextfreier Sprachen Theoretische nformatik inheit 3.1 Kontextfreie Grammatiken

Mehr

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen. I.2. I.2. Grundlagen von von Programmiersprachen.

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen. I.2. I.2. Grundlagen von von Programmiersprachen. 1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen I.2. I.2. Grundlagen von von Programmiersprachen. - 1 - 1. Der Begriff Informatik "Informatik" = Kunstwort aus Information und Mathematik

Mehr

Programmiersprachen und Übersetzer

Programmiersprachen und Übersetzer Programmiersprachen und Übersetzer Sommersemester 2010 19. April 2010 Theoretische Grundlagen Problem Wie kann man eine unendliche Menge von (syntaktisch) korrekten Programmen definieren? Lösung Wie auch

Mehr

Programmierung 2. Übersetzer: Das Frontend. Sebastian Hack. Klaas Boesche. Sommersemester

Programmierung 2. Übersetzer: Das Frontend. Sebastian Hack. Klaas Boesche. Sommersemester 1 Programmierung 2 Übersetzer: Das Frontend Sebastian Hack [email protected] Klaas Boesche [email protected] Sommersemester 2012 Vom Programm zur Maschine Was passiert eigentlich mit unseren

Mehr

Kapitel 1: Einführung

Kapitel 1: Einführung 10 Kapitel 1: Einführung 1.1 Was ist eine Programmiersprache? 1.2 Details zu C++ 1.3 Phasen der Programmierung 1.4 Ein erstes Programm: Hello World! 1.5 Addition zweier Zahlen 1.6 Entscheidungen 1.1 Was

Mehr

Zwischencodeerzeugung Compiler II

Zwischencodeerzeugung Compiler II Zwishenodeerzeugung Compiler II Prof. Dr. Ursula Goltz 14.09.2012 Einleitung Front-End... Parser Sem. Analys Zwishenodegenerator Bak-End Codegenerator... Zwishendarstellung (Zwishenode) evtl. mashinennunabh.

Mehr

Einführung in die Informatik I (autip)

Einführung in die Informatik I (autip) Einführung in die Informatik I (autip) Dr. Stefan Lewandowski Fakultät 5: Informatik, Elektrotechnik und Informationstechnik Abteilung Formale Konzepte Universität Stuttgart 24. Oktober 2007 Was Sie bis

Mehr

Das erste C++ Programm

Das erste C++ Programm Das erste C++ Programm // Program: power8.c // Raise a number to the eighth power. #include int main() { // input std::cout > a; // computation int

Mehr

Reguläre Sprachen und endliche Automaten

Reguläre Sprachen und endliche Automaten Reguläre Sprachen und endliche Automaten 1 Motivation: Syntaxüberprüfung Definition: Fließkommazahlen in Java A floating-point literal has the following parts: a whole-number part, a decimal point (represented

Mehr

Kapitel 5: Syntax-Analyse

Kapitel 5: Syntax-Analyse Kapitel 5: Syntax-Analyse Aufgabe Die Token-Folge wird strukturiert in Anweisungen, Ausdrücke etc., um die Semantische Analyse und Code-Erzeugung zu ermöglichen Themen Kontextfreie Grammatik Äquivalente

Mehr

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder Prof. aa Dr. J. Giesl Programmierung WS12/13 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder Tutoraufgabe 1 (Syntax und Semantik): 1. Was ist Syntax? Was ist Semantik? Erläutern Sie den Unterschied. 2.

Mehr

Werkzeuge zur Programmentwicklung

Werkzeuge zur Programmentwicklung Werkzeuge zur Programmentwicklung B-15 Bibliothek Modulschnittstellen vorübersetzte Module Eingabe Editor Übersetzer (Compiler) Binder (Linker) Rechner mit Systemsoftware Quellmodul (Source) Zielmodul

Mehr

Vorlesung Theoretische Informatik

Vorlesung Theoretische Informatik Vorlesung Theoretische Informatik Automaten und Formale Sprachen Hochschule Reutlingen Fakultät für Informatik Masterstudiengang Wirtschaftsinformatik überarbeitet von F. Laux (Stand: 09.06.2010) Sommersemester

Mehr

Formale Sprachen, reguläre und kontextfreie Grammatiken

Formale Sprachen, reguläre und kontextfreie Grammatiken Formale Sprachen, reguläre und kontextfreie Grammatiken Alphabet A: endliche Menge von Zeichen Wort über A: endliche Folge von Zeichen aus A A : volle Sprache über A: Menge der A-Worte formale Sprache

Mehr

Kapitel 2. Methoden zur Beschreibung von Syntax

Kapitel 2. Methoden zur Beschreibung von Syntax 1 Kapitel 2 Methoden zur Beschreibung von Syntax Grammatik, die sogar Könige zu kontrollieren weiß... aus Molière, Les Femmes Savantes (1672), 2. Akt 2 Ziele Zwei Standards zur Definition der Syntax von

Mehr

Compiler, Übersetzer. Allgemeine Erklärung / Definition

Compiler, Übersetzer. Allgemeine Erklärung / Definition Compiler, Übersetzer Allgemeine Erklärung / Definition Ein Übersetzer ist ein Programm, das ein S 1 -Wort den Quelltext in ein S 2 -Wort umwandelt den Zieltext wobei die Semantik erhalten bleibt. Frage:

Mehr

Grundlagen der Theoretischen Informatik Musterlösungen zu ausgewählten Übungsaufgaben

Grundlagen der Theoretischen Informatik Musterlösungen zu ausgewählten Übungsaufgaben Dieses Dokument soll mehr dazu dienen, Beispiele für die formal korrekt mathematische Bearbeitung von Aufgaben zu liefern, als konkrete Hinweise auf typische Klausuraufgaben zu liefern. Die hier gezeigten

Mehr

9 Compilerbau-Werkzeuge

9 Compilerbau-Werkzeuge 9.1 Überblick In der Praxis des Compilerbaus werden heute vielfach Werkzeuge eingesetzt, die Routineaufgaben erleichtern sollen. In erster Linie ist dabei an die Punkte Generierung eines Scanners Generierung

Mehr

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester 2012. [email protected]. [email protected].

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester 2012. hack@cs.uni-saarland.de. boesche@cs.uni-saarland. 1 Programmierung 2 Übersetzer: Code-Erzeugung Sebastian Hack [email protected] Klaas Boesche [email protected] Sommersemester 2012 Bytecodes Der Java Übersetzer erzeugt keine Maschinensprache

Mehr

Kontextfreie Grammatiken

Kontextfreie Grammatiken Kontextfreie Grammatiken Bisher haben wir verschiedene Automatenmodelle kennengelernt. Diesen Automaten können Wörter vorgelegt werden, die von den Automaten gelesen und dann akzeptiert oder abgelehnt

Mehr

Motivation. Formale Grundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen. Informales Beispiel. Informales Beispiel.

Motivation. Formale Grundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen. Informales Beispiel. Informales Beispiel. Kontextfreie Kontextfreie Motivation Formale rundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen Bisher hatten wir Automaten, die Wörter akzeptieren Frank Heitmann [email protected]

Mehr

Schleifen in Javascript

Schleifen in Javascript Schleifen in Javascript Jobst-Hartmut Lüddecke 3. April 2013 Zusammenfassung In dieser Lektion geht es um Schleifen (engl. loop). Diese Schleifen sind in jeder Programmiersprache das beste Werkzeug für

Mehr

EINFÜHRUNG IN DIE THEORETISCHE INFORMATIK

EINFÜHRUNG IN DIE THEORETISCHE INFORMATIK EINFÜHRUNG IN DIE THEORETISCHE INFORMATIK Prof. Dr. Klaus Ambos-Spies Sommersemester 2012 17. DIE KONTEXTFREIEN SPRACHEN II: ABSCHLUSSEIGENSCHAFTEN, MASCHINENCHARAKTERISIERUNG, KOMPLEXITÄT Theoretische

Mehr

Theoretische Informatik. Grammatiken. Grammatiken. Grammatiken. Rainer Schrader. 9. Juli 2009

Theoretische Informatik. Grammatiken. Grammatiken. Grammatiken. Rainer Schrader. 9. Juli 2009 Theoretische Informatik Rainer Schrader Institut für Informatik 9. Juli 2009 1 / 41 2 / 41 Gliederung die Chomsky-Hierarchie Typ 0- Typ 3- Typ 1- Die Programmierung eines Rechners in einer höheren Programmiersprache

Mehr

kontextfreie Grammatiken Theoretische Informatik kontextfreie Grammatiken kontextfreie Grammatiken Rainer Schrader 14. Juli 2009 Gliederung

kontextfreie Grammatiken Theoretische Informatik kontextfreie Grammatiken kontextfreie Grammatiken Rainer Schrader 14. Juli 2009 Gliederung Theoretische Informatik Rainer Schrader Zentrum für Angewandte Informatik Köln 14. Juli 2009 1 / 40 2 / 40 Beispiele: Aus den bisher gemachten Überlegungen ergibt sich: aus der Chomsky-Hierarchie bleiben

Mehr

Compiler und Codegenerierung. Hw-Sw-Co-Design

Compiler und Codegenerierung. Hw-Sw-Co-Design Compiler und Codegenerierung Hw-Sw-Co-Design Wo sind wir? System Verhalten Modul Architektur Block SW HW Logik Struktur Compiler und Codegenerierung Compiler - Aufbau Codegenerierung Codeoptimierung Codegenerierung

Mehr

Praktikum Funktionale Programmierung Teil 1: Lexen und Parsen

Praktikum Funktionale Programmierung Teil 1: Lexen und Parsen Praktikum Funktionale Programmierung Teil 1: Lexen und Parsen Professur für Künstliche Intelligenz und Softwaretechnologie Sommersemester 2009 Überblick Teil 1: Lexen und Parsen Die Sprache LFP +C Professur

Mehr

Von der Grammatik zum AST

Von der Grammatik zum AST Von der Grammatik zum AST Welche Eigenschaften soll ein Parser haben? Wann ist eine Grammatik eindeutig? Wie sollte eine Grammatik aussehen? Theoretischer Hin tergrund: FIRST, FOLLOW Einschränkungen von

Mehr

Fachseminar. Semantische Analyse

Fachseminar. Semantische Analyse Fachseminar Vortragender: Arton Berisha Thema : Semantische Analyse Kursleiter: Prof. Dr. Helmut Weber Agenda 1. Einleitung 1.1 Phasen eines Compilers 1.2 Symboltabelle 2. Semantische Analyse 2.1 Was ist

Mehr

Sprachbeschreibung und Erweiterung

Sprachbeschreibung und Erweiterung Sprachbeschreibung und Erweiterung Worte, Sprachen, reguläre Ausdrücke, Automaten, BNF, Grammatik, Syntax- Diagramme, Spracherweiterungen do, for, break, switch Formale Beschreibung von Programmiersprachen

Mehr

2D22 Prinzipien der Softwareentwicklung. Prinzipien der Softwareentwicklung S. Strahringer 1

2D22 Prinzipien der Softwareentwicklung. Prinzipien der Softwareentwicklung S. Strahringer 1 2D22 1 Inhalte der Lehrveranstaltung Einführung in die Programmierung mit PHP Literatur: Theis, Thomas (2010): Einstieg in PHP 5.3 und MySQL 5.4. [für Programmieranfänger geeignet]. 6., aktualisierte Aufl.

Mehr

GI Vektoren

GI Vektoren Vektoren Problem: Beispiel: viele Variablen vom gleichen Typ abspeichern Text ( = viele char-variablen), Ergebnisse einer Meßreihe ( = viele int-variablen) hierfür: Vektoren ( = Arrays = Feld ) = Ansammlung

Mehr

Betriebssysteme Teil 4: Übersetzung von C-Programmen

Betriebssysteme Teil 4: Übersetzung von C-Programmen Betriebssysteme Teil 4: Übersetzung von C-Programmen 18.10.13 1 Übersicht Übersetzungsprozess gcc(i) als Steuerprogramm Assembler Binder Hauptprogramme in C In dieser Einheit werden nur die Grundprinzipien

Mehr

Reguläre Grammatiken/Sprachen und endliche Automaten

Reguläre Grammatiken/Sprachen und endliche Automaten Reguläre Grammatiken/Sprachen und endliche Automaten Bei regulären Grammatiken ist die Form der Grammatikregeln am stärksten eingeschränkt. Trotzdem lassen sich bereits weite Teile einer natürlichen Sprache

Mehr

8. Turingmaschinen und kontextsensitive Sprachen

8. Turingmaschinen und kontextsensitive Sprachen 8. Turingmaschinen und kontextsensitive Sprachen Turingmaschinen (TM) von A. Turing vorgeschlagen, um den Begriff der Berechenbarkeit formal zu präzisieren. Intuitiv: statt des Stacks bei Kellerautomaten

Mehr

Ein Ausflug in den Compilerbau

Ein Ausflug in den Compilerbau Ein Ausflug in den Compilerbau Syntaktische Analyse und Berechnung arithmetischer Ausdrücke von Torsten Brandes Der Compilerbau ist ein (aufgrund der komplexen Materie) in der Schule vernachlässigtes Teilgebiet

Mehr

Grundbegriffe der Informatik

Grundbegriffe der Informatik Grundbegriffe der Informatik Einheit 8: kontextfreie Grammatiken Thomas Worsch Karlsruher Institut für Technologie, Fakultät für Informatik Wintersemester 2009/2010 1/37 Überblick Kontextfreie Grammatiken

Mehr

syntax.tex Eine Übersicht

syntax.tex Eine Übersicht syntax.tex Eine Übersicht Bernd Worsch 7. Juli 1997 Inhaltsverzeichnis 1 Einleitung 1 2 Bevor es funktioniert... 1 3 Grundelemente von syntax.tex 1 4 Strukturelemente von syntax.tex 3 5 Setzen von Syntaxdiagrammen

Mehr

Deklarationen in C. Prof. Dr. Margarita Esponda

Deklarationen in C. Prof. Dr. Margarita Esponda Deklarationen in C 1 Deklarationen Deklarationen spielen eine zentrale Rolle in der C-Programmiersprache. Deklarationen Variablen Funktionen Die Deklarationen von Variablen und Funktionen haben viele Gemeinsamkeiten.

Mehr

Ausarbeitung des Interpreter Referats

Ausarbeitung des Interpreter Referats Ausarbeitung des Interpreter Referats Gliederung 1. Programmiersprache 1.2. Syntax 1.2.1. Konkrete Syntax 1.2.2. Abstrakter Syntax Baum (Abstrakte Syntax) 2. Parser 2.1. Syntaktische Struktur einer Sprache

Mehr

Sprachen und Programmiersprachen

Sprachen und Programmiersprachen Sprachen und Programmiersprachen Natürliche Sprachen versus Programmiersprachen / Spezifikationssprachen Syntax legt die grammatikalische Korrektheit fest. Semantik legt die Bedeutung von syntaktisch korrekten

Mehr

Algorithmen und Formale Sprachen

Algorithmen und Formale Sprachen Algorithmen und Formale Sprachen Algorithmen und formale Sprachen Formale Sprachen und Algorithmen Formale Sprachen und formale Algorithmen (formale (Sprachen und Algorithmen)) ((formale Sprachen) und

Mehr

Allgemeine Informatik 2 im SS 2007 Programmierprojekt

Allgemeine Informatik 2 im SS 2007 Programmierprojekt v05 30.06.2007 Technische Universität Darmstadt Fachbereich Informatik Prof. Dr. Johannes Fürnkranz Allgemeine Informatik 2 im SS 2007 Programmierprojekt Bearbeitungszeit: 04.06. bis 13.07.2007 Die Formalitäten

Mehr

Algorithmen mit konstantem Platzbedarf: Die Klasse REG

Algorithmen mit konstantem Platzbedarf: Die Klasse REG Algorithmen mit konstantem Platzbedarf: Die Klasse REG Sommerakademie Rot an der Rot AG 1 Wieviel Platz brauchen Algorithmen wirklich? Daniel Alm Institut für Numerische Simulation Universität Bonn August

Mehr

Compilerbau P. K ohler Sommersemester 2015

Compilerbau P. K ohler Sommersemester 2015 Compilerbau P. Köhler Sommersemester 2015 Inhaltsverzeichnis 1 Vorwort 3 2 Einleitung 4 3 Sprachen und Grammatiken 9 3.1 Ein Beispiel zum Einstieg...................... 9 3.2 Definitionen..............................

Mehr

2.11 Kontextfreie Grammatiken und Parsebäume

2.11 Kontextfreie Grammatiken und Parsebäume 2.11 Kontextfreie Grammatiken und Parsebäume Beispiel: Beispiel (Teil 3): Beweis für L(G) L: Alle Strings aus L der Länge 0 und 2 sind auch in L(G). Als Induktionsannahme gehen wir davon aus, dass alle

Mehr

Programmierkurs: Delphi: Einstieg

Programmierkurs: Delphi: Einstieg Seite 1 von 6 Programmierkurs: Delphi: Einstieg Aus Wikibooks Inhaltsverzeichnis 1 Einstieg Einstieg Was ist Delphi Borland Delphi ist eine RAD-Programmierumgebung von Borland. Sie basiert auf der Programmiersprache

Mehr

Informatik I Übung, Woche 40

Informatik I Übung, Woche 40 Giuseppe Accaputo 2. Oktober, 2014 Plan für heute 1. Fragen & Nachbesprechung Übung 2 2. Zusammenfassung der bisherigen Vorlesungsslides 3. Tipps zur Übung 3 Informatik 1 (D-BAUG) Giuseppe Accaputo 2 Nachbesprechung

Mehr

Theoretische Grundlagen der Informatik

Theoretische Grundlagen der Informatik Theoretische Grundlagen der Informatik Vorlesung am 10.01.2012 INSTITUT FÜR THEORETISCHE 0 KIT 12.01.2012 Universität des Dorothea Landes Baden-Württemberg Wagner - Theoretische und Grundlagen der Informatik

Mehr

Arbeiten mit Arrays. 4.1 Eigenschaften. 4.1.1 Schlüssel und Element. Kapitel 4

Arbeiten mit Arrays. 4.1 Eigenschaften. 4.1.1 Schlüssel und Element. Kapitel 4 Arbeiten mit s Eine effiziente Programmierung mit PHP ohne seine s ist kaum vorstellbar. Diese Datenstruktur muss man verstanden haben, sonst brauchen wir mit weitergehenden Programmiertechniken wie der

Mehr

Programmierung mit C Zeiger

Programmierung mit C Zeiger Programmierung mit C Zeiger Zeiger (Pointer)... ist eine Variable, die die Adresse eines Speicherbereichs enthält. Der Speicherbereich kann... kann den Wert einer Variablen enthalten oder... dynamisch

Mehr

1. Der Einstieg in Java. Was heißt Programmieren?

1. Der Einstieg in Java. Was heißt Programmieren? 1. Der Einstieg in Java Lernziele: Am Ende dieses Kapitels sollen Sie wissen, aus welchen Bestandteilen ein Java-Programm besteht, Java-Programme übersetzen und ausführen können, Möglichkeiten der Kommentierung

Mehr

4 Lexikalische Analyse und Parsing

4 Lexikalische Analyse und Parsing 4 Lexikalische Analyse und Parsing Lexikalische Analyse und Parsing sind die wichtigsten Bereiche des Compilerbaus. Prinzipien und Techniken des Compilerbaus beschränken sich nicht auf die Erstellung von

Mehr

Einführung in die Computerlinguistik Einführung in Python (1)

Einführung in die Computerlinguistik Einführung in Python (1) Einführung in die Computerlinguistik Einführung in Python (1) Dozentin: Wiebke Petersen 10. Foliensatz Wiebke Petersen Einführung CL 1 Compiler Ein Compiler (auch Übersetzer oder Kompilierer genannt) ist

Mehr

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny Grundlagen der Informatik Prof. Dr. Stefan Enderle NTA Isny 2 Datenstrukturen 2.1 Einführung Syntax: Definition einer formalen Grammatik, um Regeln einer formalen Sprache (Programmiersprache) festzulegen.

Mehr

RO-Tutorien 3 / 6 / 12

RO-Tutorien 3 / 6 / 12 RO-Tutorien 3 / 6 / 12 Tutorien zur Vorlesung Rechnerorganisation Christian A. Mandery WOCHE 2 AM 06./07.05.2013 KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft

Mehr

Theoretische Informatik I

Theoretische Informatik I heoretische Informatik I Einheit 2 Endliche Automaten & Reguläre Sprachen. Deterministische endliche Automaten 2. Nichtdeterministische Automaten 3. Reguläre Ausdrücke 4. Grammatiken 5. Eigenschaften regulärer

Mehr

7. Formale Sprachen und Grammatiken

7. Formale Sprachen und Grammatiken 7. Formale Sprachen und Grammatiken Computer verwenden zur Verarbeitung von Daten und Informationen künstliche, formale Sprachen (Maschinenspr., Assemblerspachen, Programmierspr., Datenbankspr., Wissensrepräsentationsspr.,...)

Mehr

Übersetzergenerierung mit lex und yacc

Übersetzergenerierung mit lex und yacc Übersetzergenerierung mit lex und yacc 0. Überblick und Organisatorisches Jan Bredereke SoSe 2004, Universität Bremen otivation Übersetzer: Grundlegende Werkzeuge welche Fehler kann er finden? Konstrukt

Mehr

Die Käfer lernen dazu...

Die Käfer lernen dazu... Die Käfer lernen dazu... ZIEL: Wissen, dass alles, was die Käfer ausführen können, im Quelltext notiert ist. Vorhandene Quelltexte ergänzen und erweitern können. AB 2 Öffne das Szenario 2_Erstling aus

Mehr

Fragen für die Klausuren

Fragen für die Klausuren Fragen für die Klausuren Vom Quellcode zum ausführbaren Programm Was ist ein Quellcode? Ist der Quellcode von einem Programm auf unterschiedlichen Rechner gleich? Nennen Sie drei Programmiersprachen. Was

Mehr

1. LPC - Lehmanns Programmier Contest - Lehmanns Logo

1. LPC - Lehmanns Programmier Contest - Lehmanns Logo Aufgabe ist die Entwicklung einer vereinfachten Variante der beliebten Programmiersprache Logo. Die Aufgabe ist in drei Stufen zu erledigen, von der wir zunächst nur die erste Stufe bekannt geben. Die

Mehr

Syntaxanalyse Ausgangspunkt und Ziel

Syntaxanalyse Ausgangspunkt und Ziel Syntaxanalyse Ausgangspunkt und Ziel Ausgangspunkt: Kontextfreie Grammatik Im Normalfall BNF, manchmal EBNF BNF = Backus-Naur-Form = Produktionsregeln EBNF = erweiterte BNF (+ reguläre Ausdrücke) Prüfung

Mehr

Rekursiv aufzählbare Sprachen

Rekursiv aufzählbare Sprachen Kapitel 4 Rekursiv aufzählbare Sprachen 4.1 Grammatiken und die Chomsky-Hierarchie Durch Zulassung komplexer Ableitungsregeln können mit Grammatiken größere Klassen als die kontextfreien Sprachen beschrieben

Mehr

Programmierkurs Python I

Programmierkurs Python I Programmierkurs Python I Michaela Regneri & Stefan Thater Universität des Saarlandes FR 4.7 Allgemeine Linguistik (Computerlinguistik) Winter 2010/11 Übersicht Kurze Wiederholung: while Sammeltypen (kurz

Mehr

Fachseminar Compilerbau

Fachseminar Compilerbau Fachseminar Compilerbau WS 08/09 Matthias Schiller Syntaktische Analyse 1. Prinzip der Top-Down-Analyse 2. LL(1)-Grammatiken Modell-Vorstellung Der Scanner liefert als Ergebnis der lexikalischen Analyse,

Mehr

C-Grundlagen. Einführung von Tronje Krabbe 1/21

C-Grundlagen. Einführung von Tronje Krabbe 1/21 C-Grundlagen Einführung von Tronje Krabbe 1/21 Gliederung Hintergrund Geschichte Nutzungsgebiete C-Derivate Syntax Compiler Beispielcode 2/21 Was ist C? C ist eine imperative, kompilierte Programmiersprache

Mehr

Einführung in Automation Studio

Einführung in Automation Studio Einführung in Automation Studio Übungsziel: Der links abgebildete Stromlaufplan soll mit einer SPS realisiert werden und mit Automation Studio programmiert werden. Es soll ein Softwareobjekt Logik_1 in

Mehr

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML. JavaScript JavaScript wird direkt in HTML-Dokumente eingebunden. Gib folgende Zeilen mit einem Texteditor (Notepad) ein: (Falls der Editor nicht gefunden wird, öffne im Browser eine Datei mit der Endung

Mehr

Übersicht. Übersetzungsprozess gcc(i) als Steuerprogramm Assembler Binder Hauptprogramme in C

Übersicht. Übersetzungsprozess gcc(i) als Steuerprogramm Assembler Binder Hauptprogramme in C Übersicht Übersetzungsprozess gcc(i) als Steuerprogramm Assembler Binder Hauptprogramme in C In dieser Einheit werden nur die Grundprinzipien dargestellt, dies ist keine Beschreibung konkreter Formate

Mehr

= 7 (In Binärdarstellung: = 0111; Unterlauf) = -8 (In Binärdarstellung: = 1000; Überlauf)

= 7 (In Binärdarstellung: = 0111; Unterlauf) = -8 (In Binärdarstellung: = 1000; Überlauf) Musterlösung Übung 2 Aufgabe 1: Große Zahlen Das Ergebnis ist nicht immer richtig. Die Maschine erzeugt bei Zahlen, die zu groß sind um sie darstellen zu können einen Über- bzw. einen Unterlauf. Beispiele

Mehr

Einführung in die Programmierung 1

Einführung in die Programmierung 1 Einführung in die Programmierung 1 Einführung (S.2) Einrichten von Eclipse (S.4) Mein Erstes Programm (S.5) Hallo Welt!? Programm Der Mensch (S.11) Klassen (S.12) Einführung Wie Funktioniert Code? Geschriebener

Mehr

Programmieren I. Formale Sprachen. www.kit.edu. Institut für Angewandte Informatik

Programmieren I. Formale Sprachen. www.kit.edu. Institut für Angewandte Informatik Programmieren I Formale Sprachen KIT Universität des Landes Baden-Württemberg und nationales Großforschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu Formale Sprachen: Allgemeines Sprachen werden

Mehr

Formale Methoden 1. Gerhard Jäger 9. Januar Uni Bielefeld, WS 2007/2008 1/23

Formale Methoden 1. Gerhard Jäger 9. Januar Uni Bielefeld, WS 2007/2008 1/23 1/23 Formale Methoden 1 Gerhard Jäger [email protected] Uni Bielefeld, WS 2007/2008 9. Januar 2008 2/23 Automaten (informell) gedachte Maschine/abstraktes Modell einer Maschine verhält sich

Mehr

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens Grundlagen von C Jonas Gresens Proseminar C Grundlagen und Konzepte Arbeitsbereich Wissenschaftliches Rechnen Fachbereich Informatik Fakultät für Mathematik, Informatik und Naturwissenschaften Universität

Mehr

IT-Basics 2. DI Gerhard Fließ

IT-Basics 2. DI Gerhard Fließ IT-Basics 2 DI Gerhard Fließ Wer bin ich? DI Gerhard Fließ Telematik Studium an der TU Graz Softwareentwickler XiTrust www.xitrust.com www.tugraz.at Worum geht es? Objektorientierte Programmierung Konzepte

Mehr

1 ÜBERSETZER. Compilerbau 1

1 ÜBERSETZER. Compilerbau 1 1 ÜBERSETZER 1 A.V.Aho, J.D.Ullmann: Principles of Compiler Design, Addison Wesley (1977) J.Amsterdam: Building a computer in Software, BYTE (Okt. 1985) Programming Project: A SIMPL Compiler, BYTE (Dez.

Mehr

Theoretische Grundlagen der Informatik

Theoretische Grundlagen der Informatik Theoretische Grundlagen der Informatik Vorlesung am 12.01.2012 INSTITUT FÜR THEORETISCHE 0 KIT 12.01.2012 Universität des Dorothea Landes Baden-Württemberg Wagner - Theoretische und Grundlagen der Informatik

Mehr

Programmieren. Wie entsteht ein Programm

Programmieren. Wie entsteht ein Programm Wie entsteht ein Programm 1/9 1. Schritt: Programmentwurf Der wichtigste Teil beim Erstellen eines Programms ist der Programmentwurf. Dabei wird das vorgegebene Problem analysiert, es wird ermittelt, welche

Mehr

J.5 Die Java Virtual Machine

J.5 Die Java Virtual Machine Java Virtual Machine Die Java Virtual Machine 22 Prof. Dr. Rainer Manthey Informatik II Java-Compiler und Java Virtual Machine Quellcode-Datei class C... javac D.java Java-Compiler - Dateien class class

Mehr

Entwurf von Algorithmen - Kontrollstrukturen

Entwurf von Algorithmen - Kontrollstrukturen Entwurf von Algorithmen - Kontrollstrukturen Eine wichtige Phase in der Entwicklung von Computerprogrammen ist der Entwurf von Algorithmen. Dieser Arbeitsschritt vor dem Schreiben des Programmes in einer

Mehr

6 Kontextfreie Grammatiken

6 Kontextfreie Grammatiken 6 Kontextfreie Grammatiken Reguläre Grammatiken und damit auch reguläre Ausdrücke bzw. endliche Automaten haben bezüglich ihres Sprachumfangs Grenzen. Diese Grenzen resultieren aus den inschränkungen,

Mehr