Interpreter - Gliederung



Ähnliche Dokumente
Ausarbeitung des Interpreter Referats

Konzepte von Programmiersprachen

Methoden zur Interpretation LISPähnlicher. Programmiersprachen. Seminarvortrag / 53 FH AACHEN FACHBEREICH 9 TOBIAS STUMM MATR.-NR.

Übungs- und Praktikumsaufgaben zur Systemprogrammierung Dipl.-Ing. H. Büchter (Lehrbeauftragter) FH-Dortmund WS 2001/2002 / SS 2002

Syntax von Programmiersprachen

Ein Fragment von Pascal

Compilerbau für die Common Language Run-Time

Inhalt Kapitel 11: Formale Syntax und Semantik

Vorkurs Informatik WiSe 17/18

Einführung in die Programmiertechnik

OCP Java SE 8. Lambda

3.1 Reservierte Wörter

9.4 Grundlagen des Compilerbaus

Bisher. Programme. Ausdrücke und ihre Auswertung (Substitutionsmodell)

Quick-Start Informatik Programmieren in Python Teil 1

Es gibt keinen Algorithmus zum Schreiben eines Programms bzw. Algorithmus.

Kapitel 1: Informationsverarbeitung durch Programme

3 Syntax von Programmiersprachen

2 Eine einfache Programmiersprache

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

2 Eine einfache Programmiersprache. Variablen. Operationen Zuweisung. Variablen

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Implementieren von Klassen

12 Abstrakte Klassen, finale Klassen und Interfaces

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

GTI. Hannes Diener. 18. Juni. ENC B-0123,

Vorkurs Informatik WiSe 16/17

7. Syntax: Grammatiken, EBNF

Grundlagen der Informatik 0

2 Eine einfache Programmiersprache

DieÜbersetzung funktionaler Programmiersprachen

2.2 Syntax, Semantik und Simulation

Python Intro. Vorsemesterkurs Informatik Praktischer Teil WS2012/13. 2.Oktober Vorkurs Informatik - WS 2012/13

Lösung Probeklausur Informatik I

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache

Java I Vorlesung Imperatives Programmieren

Die Klasse MiniJava ist in der Datei MiniJava.java definiert:

Präzedenz von Operatoren

EIGENSCHAFTEN VON SPRACHEN

Kontextfreie Grammatiken. Kontextfreie Grammatiken 1 / 48

Fragenkatalog 2. Abgabegespräch Formale Modellierung 3 Reguläre Sprachen

Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten.

Das diesem Dokument zugrundeliegende Vorhaben wurde mit Mitteln des Bundesministeriums für Bildung und Forschung unter dem Förderkennzeichen

Programmierkurs Java

3.4 Struktur von Programmen

5. Übung - Kanalkodierung/Programmierung

Lexikalische Programmanalyse der Scanner

Programmieren in Java

Objektorientierte Programmierung II

Kontextfreie Grammatiken. Kontextfreie Grammatiken 1 / 45

Python Intro I. Vorsemesterkurs Informatik Praktischer Teil WS 2013/14. 1.Oktober Vorkurs Informatik - WS 2013/14

Elementare Konzepte von

Syntaxanalyse Ausgangspunkt und Ziel

1 Bedingte Anweisungen. 2 Vergleiche und logische Operatoren. 3 Fallunterscheidungen. 4 Zeichen und Zeichenketten. 5 Schleifen.

Prakt. Datenbankprogrammierung. Sommersemester 2005

WS2018/ Oktober 2018

Programmieren Vorkurs

Einstieg in die Informatik mit Java

Kapitel 5: Syntaxdiagramme und Grammatikregeln

Der Earley-Algorithmus

Welche Informatik-Kenntnisse bringen Sie mit?

Werkzeuge zur Programmentwicklung

1 Formale Sprachen, reguläre und kontextfreie Grammatiken

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

ECDL MODUL COMPUTING. Syllabus Version 1.0

Literale. Programmbestandteile. Variable. Schlüsselwörter. Literal: Ein Literal ist ein vordefinierter Name, der für einen festen Wert steht.

Einführung IMP-Syntax Reduktionssemantik Maschinen-Semantik. Teil IV. Semantik imperativer Sprachen

Guile Die Erweiterungssprache des GNU-Projekts

string: Beispiele: Test, test, `Seitentitel: ${document.title}`

Intensivübung zu Algorithmen und Datenstrukturen

Transkript:

Institut für Informatik Ludwig-Maximilian Universität Interpreter - Gliederung Programmiersprache Syntax Konkrete Syntax Abstrakter Syntax Baum (Abstrakte Syntax) Parser Syntaktische Struktur einer Sprache Parser Generator Interpreter Erweiterungen unserer Programmiersprache Bedingte Auswertung Lokale Bindungen Prozeduren Closures 1

Programmiersprache Syntax Definition System von Regeln, das die Form einer (Programmier-)Sprache beschreibt. Konkrete Syntax Die BNF Definition (Backus-Naur Form), für Kontext-freie- Grammatiken, beschreibt eine bestimmte Repräsentation von induktiven Datentypen: sie benutzt die bestimmten Zeichenketten und Werte, erzeugt bei der Grammatik. Ist die Syntax der Programmiersprache, so wie sie der Programmierer in den Computer tippt. (Der Programm Text, hello.scm oder hello.java) 2

Abstrakter Syntax Baum (Abstrakte Syntax) Um solche Daten bearbeiten zu können, brauche wir sie in einer internen Repräsentation zu umwandeln = abstrakte Syntax. Ist die konkrete Syntax als möglichst knapper Baum dargestellt. Terminale, wie Klammer brauchen nicht gespeichert werden, weil die keine Information beinhalten. Um abstrakte Syntax für bestimmte konkrete Syntax bauen zu können, müssen wir jede Produktion und deren nonterminals der konkreten Syntax benennen. <expression> =:: <identifier> var-exp (id) Eine Produktion der Grammatik 3

Beispiel: konkrete abstrakte Syntax Beispiel 1: Konkret Abstrakt (+7(+(3 5))) + + 7 3 5 Beispiel 2: +(3,4) a-programm( primapp-exp(add-prim List( lit-exp(3) lit-exp(4)))) oder a-program primapp-exp add-prim () lit lit 3 4 4

Parser Definition: konkrete Syntax Parser abstrakter Syntax Baum Der Parser organisiert die Reihenfolge von Tokens in hierarchisch - syntaktische Struktur (Expression, Statement, Blöcke). Er formt die syntaktische Struktur einer Sprache. Tokens = Reihenfolge von Zeichen (Worte, Nummern, Sonderzeichen, Kommentare); Parser-Generator = Programm, dass als Input lexikalische Spezifikation und Grammatik hat, und als Output scanner und parser für diese produziert. 5

Interpreter (1) Definition: Ein Interpreter parst (übersetzt) Quellcode und führt ihn umgehend aus. Im Gegensatz zu einem Compiler erzeugt er keinen speicherbaren Maschinencode. konkrete Syntax Parser abstrakter Syntax Baum Interpreter Antwort Interpreter können nur mit abstrakter Syntax operieren! Definierte Sprache (oder source Sprache): Die Sprache, die wir mit dem Interpreter definieren. Definierende Sprache ( oder host Sprache): Die Sprache, in der wir den Interpreter schreiben. In unserem Fall Scheme. 6

Interpreter (2) Wie bauen wir unser Interpreter?: 1. Definition der konkreten Syntax: Unsere Sprache unterstützt Nummern, Variablen und primitive Anwendungen (+, -, *, add1, sub1); 2. Definition der abstrakten Syntax: <programm> ::= <expression> a-program (exp) <expression> ::= <nummer> lit-exp (datum) ::= <identifier> var-exp (id) ::= <primitive> ({<expression>}* ) primapp-exp (prim rands) <primitive> ::= + - * add1 sub1 7

Interpreter (3) Umgebung einer Variable: Jede Funktion, die Variablen beinhaltet, hat ihre eigene Umgebung für sie. In der Umgebung werden die Werte und die Typen der Variablen gespeichert, damit die Funktion ausgeführt werden kann. (define f (lambda (x) (let (y 10) (in (+ (x y)))))) Umgebung x 5 y 10 Im Interpreter wird die Umgebung einer Funktion überall mitgenommen. 8

Interpreter (4) 3. Implementieren (define eval-program (lambda (pgm) (cases program pgm (a-program (body) (eval-expression body (init-env)))))) (define eval-expression (lambda (exp env) (cases expression exp (lit-exp (datum) datum) (var-exp (id) (apply-env env id)) (primapp-exp (prim rands) (let ((args (eval-rands rands env))) (apply-primitive prim args))) ))) 9

Erweiterung unserer Programmiersprache Bedingte Auswertung if Anweisung (1) Um das Hinzufügen von boolean-werte zu unserer Sprache zu vermeiden, werden wir sie als integer-werte kodiert. Dafür implementieren wir die folgende Hilfsfunktion: (define true-value? (lambda (x) (not (zero? x)))) Beispiele für eine if Anweisung: - -> if 1 then 2 else 3 2 - -> if (3, + (1, 2)) then 2 else 3 3 10

Bedingte Auswertung if Anweisung (2) Erweiterung der Sprache mit Fallunterscheidung if Anweisung: 1. Definition der konkreten Syntax 2. Definition der abstrakten Syntax <expression> ::= if <expression> then <expression> else <expression> if-exp (test-exp true-exp false-exp) 3. Implementieren in eval-expression: (if-exp (test-exp true-exp false-exp) (if (true-value? (eval-expression test-exp env)) (eval-expression true-exp env) (eval-expression false-exp env))) Dieser Code beinhaltet die if Form von der definierenden Sprache um die if Form der definierten Sprache zu implementieren. 11

Erweiterung unserer Programmiersprache Lokale Bindungen let Anweisung (1) Beispiel: let x = 5 y = 6 in +(x, y) Lokale Bindungen: Innere Deklarationen beschatten, oder schaffen Löcher in dem Körper von, äußere Deklarationen. D.h ein variablen Objekt wird immer mit der meist näheren lexikalischen Bindung gebunden. Beispiel: let x = 1 in let x = +(x, 2) in add1 (x) > 4 12

Lokale Bindungen let Anweisung (2) Erweiterung mit lokalen Zuweisungen let Anweisung: 1. Definition der konkreten Syntax 2. Definition der abstrakten Syntax let-exp (ids rands body) <expression> ::= let {<identifier> = <expression>}* in <expression> 3. Implementieren in eval-expression: (let-exp (ids rands body) (let ((args (eval-rands rands env))) (eval-expression body (extend-env ids args env))) 13

Erweiterungen unserer Sprache Prozeduren und Closures (1) Wenn eine Prozedur aufgerufen wird, wird ihr Körper in einer Umgebung ausgeführt, die die formale Parameter der Funktion mit den Argumenten der Applikation bindet. Beispiel: let x = 5 in let f = proc (y, z) +(y, -(z, x)) x = 28 in (f 2 x) Die Funktion f wird in der Umgebung ausgeführt, die y mit 2, z mit 28 und x mit 5 bindet. 14

Prozeduren und Closures (2) Definition: Um eine Prozedur ihre Bindungen, die ihre freie Variablen am Prozedur-Erzeugung hatten, behalten zu können, braucht sie ein geschlossenes Packet, unabhängig von der Umgebung, in der sie ausgeführt wird! So ein Packet nennt man Closure. Ein Closure muss den Körper, die Namen der formalen Parameter und die Bindungen der freien Variablen der Prozedur beinhalten. Es ist günstiger und praktischer die ganze Deklarationsumgebung in dem Closure zu speichern und nicht nur die Bindungen der freien Variablen. Man sagt, dass eine Prozedur geschlossen über oder geschlossen in ihrer Deklarationsumgebung ist. 15

Prozeduren und Closures (3) Beispiel 1: (define f (lambda (x) Freie Variablen (let (y 10) (lambda (z) (+ x y z))))) (define g (f 5)) Gebundene Variable Beispiel 2: (define g (33)) x 5 Closure y 10, z, (+ x y z) z 33 env ids body 16

Prozeduren und Closures (4) Wir wollen, dass Prozeduren auch erste-klasse Werte in unserer Sprache werden. Dafür müssen wir, aber auch neue Rückgabewerte zu der Sprache definieren: ProcVal. Definition: ProcVal ist die Menge von Werten, die die Prozeduren repräsentieren. Der Interface des Datentyps ProcVal besteht aus: 1. Closure der beschreibt wie die Prozedur Werte gebaut werden sollen. 2. apply-procval Funktion, die beschreibt wie die Prozedur Werte verwendet werden sollen. Implemetationen von procval und apply-procval: (dafine-datatype procval procval? (closure (ids (list-of symbol?)) (body expression?) (env environment?))) 17

Prozeduren und Closures (5) (define apply-procval (lambda (proc args) (cases procval proc (closure (ids body env) (eval-expression body (extend-env ids args env)))))) Ein Closure wird in procval erzeugt und in apply-procval ausgeführt. Eine Prozedur wird in eval-expression ausgewertet: (... (app-exp (rator rands) (let ((proc (eval-expression rator env)) (args (eval-rands rands env))) (if (procval? Proc) (apply-procval proc args) (eopl:error eval-expression Attempt to apply non-procedure ~s proc))))...) 18

Prozeduren und Closures (6) Erweiterung mit selbst definierten Funktionen: 1. Definition der konkreten Syntax 2. Definition der abstrakten Syntax <expression> ::= proc ({<identifier>}* ) <expression> proc-exp (ids body) ::= (<expression> {<expression>}*) app-exp (rator rands) 3. Implementieren in eval-expression: (proc-exp (ids body) (closure ids body env)) 19

Prozeduren und Closures (7) Beispiel 3: (eval-expression <<let x = 5 in let x = 38 f = proc (y, z) *(y, +(x, z)) g = proc (u) +(u, x) in (f (g 3) 17)>> env0) (eval-expression <<let x = 38 f = proc (y, z) *(y, +(x, z)) g = proc (u) +(u, x) in (f (g 3) 17)>> env1) wo env1 = [x = 5]env0 20

Prozeduren und Closures (8) (eval-expression <<(f (g 3) 17)>> env2) wo env2 = [x = 38, f = (closure (y z) <<*(y, +(x, z))>> env1); g = (closure (u) <<+(u, x)>> env1) ] env1 21