Semantik von Programmiersprachen

Ähnliche Dokumente
Semantik von Programmiersprachen

Programmieren für Fortgeschrittene

Programmieren für Fortgeschrittene

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

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

Algorithmen und Datenstrukturen

Semantik von Programmiersprachen

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

III.1 Prinzipien der funktionalen Programmierung - 1 -

1. Grundkonzepte der logischen Programmierung 2. Syntax von Prolog 3. Rechnen in Prolog. IV.1 Grundkonzepte der logischen Programmierung - 1 -

n 1. Grundkonzepte der logischen Programmierung n 2. Syntax von Prolog n 3. Rechnen in Prolog IV.1 Grundkonzepte der logischen Programmierung - 1 -

2. JAVA-Programmierung. Informatik II für Verkehrsingenieure

Inhalt. n Algorithmus. n Euklidscher Algorithmus. n Sortieren. n Programmiersprachen. n Entwicklungsschritte eines Programms.

Algorithmus und Programm: Vom Algorithmus zum Programm

Einführung in die Programmierung

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

Definitionen/Vorarbeit zum Thema Java

Kapitel 1: Einleitung. Gliederung. Zum Begriff Informatik Zum Begriff Algorithmus Zum Begriff Programmieren

Info B VL 1: Einführung p.1

Einführung in die Programmierung

EIGENSCHAFTEN VON SPRACHEN

Programmiersprachen. Organisation und Einführung. Berthold Hoffmann. Studiengang Informatik Universität Bremen

Paradigmen zur Algorithmenbeschreibung

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

Algorithmus und Programm: Vom Algorithmus zum Programm

Einführung in die Programmierung Wintersemester 2016/17

1. Einführung Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

Programmiersprache. Emily & rica

1.3 Geschichte der Programmiersprachen

Informatik Vorkurs Sommersemester 2015

Einführung in die Informatik I (autip)

2. Programmierung in C

Höhere Programmiersprachen

Einführung: Vom Algorithmus zum Programm

Einführung in die Informatik. Programming Languages

2. Programmierung in C

2. Programmierung in C

Programmierkurs II. Prof. Dr. Wolfgang Effelsberg. Universität Mannheim. Sommersemester Wolfgang Effelsberg Programmiersprachen

Programmierkurs II. Prof. Dr. Wolfgang Effelsberg. Universität Mannheim. Sommersemester Wolfgang Effelsberg Programmiersprachen

1 Programmiersprachen 1.1 1

Allgemeines. Verschiedene Sprachkonzepte C-Sprachfamilie C-ähnliche Programmiersprachen Allgemeines zu C. #include <stdio.h>

Von der Chomsky-Hierarchie

Paradigmen zur Algorithmenbeschreibung

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

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

Programmierkurs II. C und Assembler

Inhalte des Moduls Programmieren 1

Programmiersprachen: Klassifizierung und Methoden. Programmier-Paradigmen. Grundlagen der Programmierung 2 (1.C) - 1 -

Computergrundlagen Programmiersprachen, Interpreter, Compiler, Linker

Werkzeuge zur Programmentwicklung

Sprachen und Programmiersprachen

Ausblick: Entwurfsmuster (Design Pattern) 12.1 Entwurfsmuster (Design Pattern) 12.2 Programmierparadigmen und -sprachen und Veranstaltungen

2. Einführung. Informatik II für Verkehrsingenieure

Funktionale Programmiersprachen

Einführung in die Informatik. Programming Languages

Lösungsvorschlag Serie 2 Rekursion

Computergrundlagen Programmiersprachen, Interpreter, Compiler, Linker

Einführung in die Informatik

Einführung in die Programmierung mit VBA

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme

Kapitel 5: Syntaxdiagramme und Grammatikregeln

Konzepte der Programmiersprachen

Einführung in die Programmiertechnik

Programmieren lernen mit Perl

Computergrundlagen Turingmaschinen und Programmierung

1. Einführung Einführung in die Programmierung (fbw) Sommersemester 2008 Prof. Dr. Bernhard Humm Hochschule Darmstadt, fbi

Einführung in die Programmierung mit Java

Syntax von Programmiersprachen

Syntax von Programmiersprachen

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Definition Algorithmus. Wie beschreibt man Algorithmen?

Grundlagen der Informatik II. Teil I: Formale Modelle der Informatik

Modellierung und Programmierung 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 1. Einführung und Grundbegriffe

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Algorithmen und Datenstrukturen

Übersicht Formale Semantik. Übersicht Axiomatische Semantik. Inhaltsübersicht HPS WS 2003/04. Vorlesung Höhere Programmiersprachen,

Algorithmen und Datenstrukturen (für ET/IT)

Informatik-Seminar. Auftakt. Informatik. Grundlagen

1 Funktionale vs. Imperative Programmierung

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

Kapitel 2. Methoden zur Beschreibung von Syntax

Inhalt. Einführung in die Strukturierte Programmierung 15

1 Einleitung. 1.1 Höhere Programmiersprachen

Algorithmus Beispiele: Algorithmen als Programme Sind Programme korrekt? Gibt es Algorithmen? FAZIT

Konzepte von Programmiersprachen

Ziele der Vorlesung: Entwurfsalternativen von Programmiersprachen erkunden Deklarative Programmierung am Beispiel von Haskell erlernen

Compilerbau für die Common Language Run-Time

Grundlagen der Informatik 0

Programmieren in Haskell Einführung

5.1 Algorithmen Der Algorithmenbegriff

Grammatiken. Grammatiken sind regelbasierte Kalküle zur Konstruktion von Systemen und Sprachen Überprüfung von Systemen und Sprachen

Transkript:

Semantik von Programmiersprachen 1. Einführung Werner Struckmann Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme Sommersemester 2017

1. Einführung 1.1 Sprachen und Paradigmen 1.2 Definition von Programmiersprachen 1.3 Implementierung von Programmiersprachen 1.4 Beispiele für semantische Fragen 1.5 Einführung in die formale Semantik von Programmiersprachen 1.1 Sprachen und Paradigmen 2/41

Sprachen Sprache ist ein sich stets weiterentwickelndes, komplexes System von Lauten und Zeichen zum Zwecke der Kommunikation. Jedem Zeichen des Systems wird eine feststehende Bedeutung zugeordnet. Sprache wirkt im Prozess der Kommunikation als Medium zwischen dem Sender (Sprecher, Schreiber) und Empfänger (Hörer, Leser). Es werden natürliche und künstliche Sprachen unterschieden. aus Basiswissen Deutsch, Dudenverlag 1.1 Sprachen und Paradigmen 3/41

Natürliche, künstliche und formale Sprachen Natürliche Sprachen sind historisch gewachsen. Hierzu zählen z. B. Deutsch, Englisch und Französisch. Sie sind Ausdruck menschlichen Denkens, Fühlens und Wollens und weisen im Unterschied zu künstlichen Sprachen Mehrdeutigkeiten auf. Künstliche Sprachen sind Zeichensysteme, die der Verständigung in einem eng begrenzten Fachgebiet dienen, zum Beispiel Programmiersprachen. Sprachen wie Esperanto sind ebenfalls künstliche Sprachen, die sich durch leichtere Schreibung und Grammatik gegenüber natürlichen Sprachen auszeichnen. Formale Sprachen sind künstliche Sprachen, die mithilfe mathematischer Methoden definiert sind. 1.1 Sprachen und Paradigmen 4/41

Sprachen der Informatik Um Sachverhalte mit Rechensystemen zu behandeln, müssen sie in eindeutigen also künstlichen Sprachen beschrieben werden. Einige Beispiele sollen dies verdeutlichen: Algorithmen: Programmiersprachen (Java) Dokumente: Markup-Sprachen (Html, XML), Seitenbeschreibungssprachen (Postscript) Modelle, Systeme: Modellierungssprachen (UML), Spezifikationssprachen (Z) Datenbanken: Anfragesprachen (SQL) Mathematische Objekte: Symbolische Sprachen (Maple) Abläufe: Simulationssprachen (GPSS) 1.1 Sprachen und Paradigmen 5/41

Sprachen der Informatik In der Informatik hat man es mit einer Vielzahl von künstlichen Sprachen zu tun. Sie alle beschreiben Sachverhalte in einem relativ kleinen Kontext, dafür aber (hoffentlich) präzise, widerspruchsfrei und vollständig. 1.1 Sprachen und Paradigmen 6/41

Paradigmen höherer Programmiersprachen Jeder Programmiersprache liegt ein bestimmtes Denkschema zugrunde. Auf der Basis dieser Konzepte unterteilt man die höheren Programmiersprachen in folgende Kategorien: Imperative Programmiersprachen, Funktionale (applikative) Programmiersprachen, Prädikative (deduktive, logische) Programmiersprachen, Objektorientierte Programmiersprachen. 1.1 Sprachen und Paradigmen 7/41

Imperative Programmiersprachen Bei diesen Sprachen besteht ein Programm aus einer Folge aus Befehlen an den Rechner. Wesentlich ist das Variablenkonzept. Variable können verschiedene Werte annehmen. Die Menge aller Variablen und ihrer Werte sowie der Programmzähler beschreiben den Zustand zu einem bestimmten Zeitpunkt. Die Ausführung eines Programms bewirkt eine Zustandstransformation. 1.1 Sprachen und Paradigmen 8/41

Funktionale Programmiersprachen Bei diesen Sprachen berechnen Programme Funktionen, die Eingabedaten auf Ausgabedaten abbilden. Ein funktionales Programm beschreibt die Beziehungen zwischen Ein- und Ausgabe mithilfe mathematischer Gleichungen. Ausgehend von elementaren Ausdrücken werden die Beziehungen durch Ausdrücke steigender Komplexität festgelegt. Das wichtigste Konstruktionsprinzip ist hierbei die Rekursion. Außerdem spielen Funktionen höherer Ordnung, sogenannte Funktionale, eine wichtige Rolle. 1.1 Sprachen und Paradigmen 9/41

Prädikative Programmiersprachen Bei diesen Sprachen wird Programmierung als Beweisen in einem System von Tatsachen und Schlussfolgerungen aufgefasst. Der Anwender gibt eine Menge von Fakten und Regeln vor. Die Aufgabe des Rechners ist es festzustellen, ob eine eingegebene Tatsache zutrifft oder nicht. Alternativ können alle Fakten, die bestimmte Kriterien erfüllen, ermittelt werden. Die Fakten werden durch Prädikate formuliert, den Schlussfolgerungen liegt ein logischer Kalkül zugrunde. 1.1 Sprachen und Paradigmen 10/41

Objektorientierte Programmiersprachen Bei diesen Sprachen werden alle zum Lösen eines Problems notwendigen Informationen als Objekte aufgefasst. Objekte besitzen Eigenschaften, die als Attribute bezeichnet werden. Objekte können durch Nachrichten an andere Objekte Informationen austauschen. Dieser Vorgang kann zum Beispiel durch Aufruf von Methoden realisiert werden. Gleichartige Objekte werden durch Klassen beschrieben. Von jeder Klasse können Objekte gemäß der Beschreibung erstellt und über die Methoden manipuliert werden. Klassen können untereinander in vielfältigen Beziehungen stehen. 1.1 Sprachen und Paradigmen 11/41

Paradigmen höherer Programmiersprachen Aus einer übergeordneten Sichtweise werden die folgenden Kategorien unterschieden: Prozedurale Programmiersprachen: Es wird exakt angegeben, wie die Lösung eines Problems ermittelt werden kann. Imperative Programmiersprachen fallen in diese Kategorie. Deklarative Programmiersprachen: Im Gegensatz zum prozeduralen Paradigma fragt man in der deklarativen Programmierung danach, was berechnet werden soll. Es wird also nicht der Lösungsweg programmiert, sondern angegeben, welches Ergebnis gewünscht ist. Deklarative Paradigmen beruhen auf mathematischen, rechnerunabhängigen Theorien. Beispiele hierfür sind prädikative und bis zu einem gewissen Grade auch funktionale Programmiersprachen. 1.1 Sprachen und Paradigmen 12/41

Entwicklung der Programmiersprachen Edsger W. Dijkstra: Jeder Programmierer weiß, dass es nur eine einzig wahre Programmiersprache gibt. Jede Woche eine neue. Albrecht Weinert: Java für Ingenieure, 2001, Seite 7: Die Zahl der Programmiersprachen, die die Informatik in den letzten fünfzig Jahren hervorgebracht hat, ist Legion. Ernst zu nehmende Schätzungen sprechen von mehr als 20 000. Wenn Weinerts Schätzung zutrifft, sind es 7,7 Sprachen pro Woche! 1.1 Sprachen und Paradigmen 13/41

Entwicklung der Programmiersprachen 1995 93 91 89 87 85 83 81 79 77 1975 73 71 69 67 65 63 61 59 57 1955 JAVA SCHEME Standard C++ OCCAM ADA SMALLTALK80 CSP MODULA2 SCHEME C PROLOG PASCAL LOGO ALGOL68 SIMULA PL/I BASIC COBOL LISP ALGOL FORTRAN Programmiersprachen in der Informatikausbildung Algol Algol68 Modula-2 Scheme Java...? 1.1 Sprachen und Paradigmen 14/41

Paradigmen und Programmiersprachen Einige Programmiersprachen: imperativ: Algol, Algol68, Pascal, Ada, C,... funktional: Lisp, Scheme, ML, Haskell,... prädikativ: Prolog objektorientiert: Smalltalk, Eiffel, Java, C++, C#,... In der Regel lassen sich die Sprachen nicht eindeutig einem bestimmten Paradigma zuordnen. Zum Beispiel gibt es in Scheme Variable und Zuweisungen, d. h. imperative Konzepte. Java sollte besser als imperativ-basierte objektorientierte Programmiersprache (hybrides Paradigma) bezeichnet werden. Java 8 geht Schritte in die Richtung, das hybride Paradigma um das funktionale Paradigma zu erweitern. C++ hingegen besitzt einen vollständigen imperativen Kern, während Smalltalk eine strikt objektorientierte Programmiersprache ist. 1.1 Sprachen und Paradigmen 15/41

Skriptsprachen Bei Skriptsprachen handelt es sich um übergeordnete Sprachen, um vorhandene Programme oder Prozeduren kontrolliert ablaufen zu lassen. Skriptsprachen haben ihren Ursprung in den Kommandosprachen (Job Control Language, JCL) von Betriebssystemen. Einfache Skriptsprachen sind die Shell-Skripts von Unix. Mächtigere Skriptsprachen sind beispielsweise Perl, PHP, Python oder JavaScript. Skriptsprachen werden in der Regel interpretiert, nicht kompiliert. 1.1 Sprachen und Paradigmen 16/41

Datenstrukturen und Typsysteme Programmiersprachen bieten die Möglichkeit, aus elementaren Datenbereichen mithilfe von Konstruktoren komplexe Datenbereiche aufzubauen. Datenbereiche werden häufig Datenstrukturen genannt. Elementare Datenbereiche boolean, char, cardinal, integer, real, enumeration,... Konstruktoren array, record, set, pointer,... Operationen Typäquivalenz, Typanpassung, Typkompabilität,... Alle Aspekte, die die Datenbereiche einer Programmiersprache betreffen, werden als deren Typsystem bezeichnet. 1.1 Sprachen und Paradigmen 17/41

Paradigmenübergreifende Konzepte (Auswahl) Die folgende Liste enthält einige paradigmenübergreifende Konzepte. Nicht jeder Punkt ist für jedes Paradigma relevant. Beispielsweise benötigt die prädikative Sprache Prolog keine Ablaufsteuerung. Ablaufsteuerung Unterprogramme, Module, abstrakte Datentypen Ausnahme- und Ereignisbehandlung Annotationen Programmierung randomisierter Algorithmen Programmierung nichtdeterministischer Algorithmen Programmierung paralleler und verteilter Algorithmen GUI-, Echtzeit-, Netzwerk-, Datenbank-,... -programmierung 1.1 Sprachen und Paradigmen 18/41

Prinzipien des Sprachentwurfs Effizienz Allgemeingültigkeit Orthogonalität (Kombinierbarkeit unabhängiger Konzepte) Uniformität Einfachheit Ausdruckskraft Genauigkeit Maschinenunabhängigkeit Sicherheit Konsistenz mit anerkannten Konventionen Erweiterbarkeit Einschränkbarkeit 1.1 Sprachen und Paradigmen 19/41

1. Einführung 1.1 Sprachen und Paradigmen 1.2 Definition von Programmiersprachen 1.3 Implementierung von Programmiersprachen 1.4 Beispiele für semantische Fragen 1.5 Einführung in die formale Semantik von Programmiersprachen 1.2 Definition von Programmiersprachen 20/41

Definition von Programmiersprachen Bestandteile einer Programmiersprache: Lexik, Syntax, Semantik. Die Pragmatik einer Programmiersprache untersucht ihre Anwendbarkeit und Nützlichkeit. Sie gehört nicht zur Definition der Sprache. 1.2 Definition von Programmiersprachen 21/41

Lexik Im Lexikon findet man: Lexem (griechisch) das, Sprachwissenschaft: kleinste semantische Einheit, Träger der lexikalischen Bedeutung; das Lexem tritt als Einzelwort (z. B. Wald), als Teil eines Wortes (z. B. wald- in waldig) und als Wortverbindung auf (z. B. Waldbrand). Lexik die, der Wortschatz einer Sprache. Die Lexik einer Programmiersprache bestimmt die textuellen Grundbausteine der Programme. Solche Bausteine sind etwa Schlüsselwörter, Literale und Bezeichner. Sie werden z. B. durch Aufzählung oder reguläre Ausdrücke angegeben. Lexeme einer Programmiersprache können aus mehr als einem Zeichen bestehen. In Programmiersprachen werden Lexeme auch Token genannt. 1.2 Definition von Programmiersprachen 22/41

Syntax Die Syntax einer Programmiersprache beschreibt, wie aus den Grundbausteinen vollständige Programme gebildet werden können. In den meisten Fällen wird die Syntax durch eine kontextfreie Grammatik festgelegt. Eine kontextfreie Grammatik G = (V N, V T, P, S) besteht aus einem Nichtterminalalphabet V N, einem Terminalalphabet V T, einer Produktionenmenge P und dem Startsymbol S. Mit L(G) bezeichnen wir die von der kontextfreien Grammatik G erzeugte Sprache. Kontextfreie Grammatiken können durch Syntaxdiagramme grafisch dargestellt werden. 1.2 Definition von Programmiersprachen 23/41

Syntax Programmiersprachen sind i. Allg. kontextsensitiv und nicht kontextfrei. Beispielsweise kann durch eine kontextfreie Grammatik nicht ausgedrückt werden, dass jeder Bezeichner vor seiner Benutzung deklariert werden muss. Andere Formalismen, zum Beispiel zweischichtige oder attributierte Grammatiken, ermöglichen es, kontextsensitive Aspekte in die Definition der Syntax einer Programmiersprache einzubeziehen. 1.2 Definition von Programmiersprachen 24/41

Semantik Die Bedeutung der syntaktisch korrekten Programme ist durch die Semantik der Sprache gegeben. Sie kann beispielsweise mithilfe von Zuständen definiert werden. Man spricht dann von einer operationellen Semantik. In der denotationalen Semantik werden den syntaktischen Einheiten Funktionen zugeordnet. Hier spielen vollständige Halbordnungen, stetige Abbildungen und Fixpunkte eine wichtige Rolle. Weitere Möglichkeiten sind die axiomatische Semantik (Programmverifikation, Hoare-Kalkül, Spezifikationssprachen) und die algebraische Semantik. 1.2 Definition von Programmiersprachen 25/41

Beispiel: Lexik Eine Programmiersprache enthält endlich viele Schlüsselwörter. Sie können durch Aufzählung angegeben werden: while, do, od,... Die Menge der Bezeichner einer Programmiersprache kann zum Beispiel durch die folgenden regulären Ausdrücke definiert werden: Ziffer = {0, 1,..., 9} Buchstabe = {a, b, c,..., y, z} Bezeichner = Buchstabe (Buchstabe Ziffer) 1.2 Definition von Programmiersprachen 26/41

Beispiel: Syntax Die folgenden Zeilen enthalten einige Produktionen einer kontextfreien Grammatik G zur Beschreibung einer kleinen Programmiersprache in der sog. Backus-Naur-Form: <Anweisungsfolge> ::= <Anweisung> ; <Anweisungsfolge> <Anweisung> <Anweisung> ::= <Zuweisung> <While-Anweisung>... <Zuweisung> ::= <Bezeichner> := <arithmetischer Ausdruck> <While-Anweisung> ::= while <logischer Ausdruck> do <Anweisungsfolge> od 1.2 Definition von Programmiersprachen 27/41

Beispiel: Operationelle Semantik Zunächst werden Zustände z Z definiert. Hierbei kann es sich um die Zustände eines abstrakten Automaten handeln. In unserem Beispiel ist Z = {z z : V Z}, wobei V die Menge aller Variablen ist. Die Semantik ordnet jedem syntaktisch korrektem Programm P L(G) eine partielle Funktion M [P ] : Z p Z als seine Bedeutung zu. Das heißt, M ist eine Abbildung der Form M : L (Z Z). p Die Bedeutung eines Programms ist also eine Zustandstransformation. 1.2 Definition von Programmiersprachen 28/41

Beispiel: Algorithmus von Euklid Der folgende in der obigen imperativen Sprache formulierte Algorithmus von Euklid (ca. 300 v. Chr.) berechnet den größten gemeinsamen Teiler der Zahlen x, y N mit x 0 und y > 0: a := x; b := y; while b # 0 do r := a mod b; a := b; b := r od Nach Ausführung des Programmfragments gilt a = ggt(x, y). 1.2 Definition von Programmiersprachen 29/41

Beispiel: Algorithmus von Euklid Es seien x = 36 und y = 52: Variable z 0 z 1 z 2 z 5 z 8 z 11 z 14 r 36 16 4 0 a 36 36 52 36 16 4 b 52 36 16 4 0 Das Zeichen bedeutet, dass der Wert dieser Variablen im betreffenden Zustand irrelevant ist. ggt(36, 52) = 4 Durchlaufene Zustände: Es gilt M [P ](z 0 ) = z 14. z 0, z 1, z 2,..., z 14 Z 1.2 Definition von Programmiersprachen 30/41

Sprachreport Die Definition einer Programmiersprache erfolgt oft in Form eines sog. Sprachreports. Dieser enthält in der Regel eine kontextfreie Grammatik zur Beschreibung der Lexik und der Syntax. Die Produktionen werden häufig in der Backus-Naur-Form oder einer Varianten davon angegeben. Darüber hinaus werden die Produktionen meistens grafisch in der Form eines Syntaxdiagramms veranschaulicht. Die Semantik wird in der Regel informell, in einigen Fällen auch halbformal oder sogar formal definiert. 1.2 Definition von Programmiersprachen 31/41

1. Einführung 1.1 Sprachen und Paradigmen 1.2 Definition von Programmiersprachen 1.3 Implementierung von Programmiersprachen 1.4 Beispiele für semantische Fragen 1.5 Einführung in die formale Semantik von Programmiersprachen 1.3 Implementierung von Programmiersprachen 32/41

Klassifikation der Programmiersprachen Die Programmiersprachen lassen sich grob in drei Klassen einteilen: Maschinensprachen Bits und Bytes, für den menschlichen Leser kaum verständlich Maschinenorientierte Sprachen (Assembler) stellen die Befehle in einem Mnemo-Code dar ADDIC 23, R0 STO R0, #12004 Problemorientierte Sprachen imperative, funktionale, objektorientierte, logische Sprachen, Spezialsprachen Ein Computer versteht nur Maschinensprachen! 1.3 Implementierung von Programmiersprachen 33/41

Implementierung von Programmiersprachen Compiler übersetzen Quellprogramme aus problemorientierten Sprachen in äquivalente Zielprogramme in Maschinensprachen: cc -o prog prog.c prog input output Interpreter lesen das Programm zusammen mit den Eingabedaten ein und führen es aus: scm prog.scm input output Mischverfahren übersetzen das Programm zunächst mit einem Compiler in eine Zwischensprache. Das übersetzte Programm wird anschließend interpretiert: javac prog.java java prog input output 1.3 Implementierung von Programmiersprachen 34/41

Implementierung von Programmiersprachen Interpreter müssen das Programm bei jedem Lauf erneut analysieren. Dies bedeutet einen gewissen Effizienzverlust. Typisch, aber nicht zwingend: Compiler: C Interpreter: Scheme Mischverfahren: Java Näheres zu Aufbau und Arbeitsweise dieser Programme erfahren Sie in den Veranstaltungen Compiler I, Compiler II sowie im Compilerbaupraktikum. 1.3 Implementierung von Programmiersprachen 35/41

Verarbeitung von Java-Programmen java VM für Windows Java Quellprogramm javac Java Bytecode java VM für Linux Zuerst wird ein Quellprogramm vom Compiler in Bytecode übersetzt. Im zweiten Schritt wird der Bytecode vom Interpreter ausgeführt. Der Bytecode kann als Maschinencode der sogenannten virtuellen Java-Maschine (JVM) angesehen werden. Bytecode ist portabel. Der Compiler ist maschinenunabhängig, der Interpreter muss für jede Plattform neu entwickelt werden. 1.3 Implementierung von Programmiersprachen 36/41

Verarbeitung von Java-Programmen Interpretierter Code ist langsamer in der Ausführung als kompilierter Code, selbst wenn dieser als Bytecode vorliegt. Prinzipiell können Java-Programme auch in Maschinensprache übersetzt werden. Dann geht allerdings die Portierbarkeit verloren. Eine Alternativlösung bieten Just-in-Time-Compiler (JIT). Ein JIT ist ein Programm, das den Bytecode einzelner Methoden während der Ausführung in Maschinencode der jeweiligen Plattform übersetzt. So kann die Methode beim nächsten Aufruf deutlich schneller ausgeführt werden. Vorteilhaft ist, dass der Bytecode nicht verändert wird und damit das übersetzte Programm portabel bleibt. 1.3 Implementierung von Programmiersprachen 37/41

1. Einführung 1.1 Sprachen und Paradigmen 1.2 Definition von Programmiersprachen 1.3 Implementierung von Programmiersprachen 1.4 Beispiele für semantische Fragen 1.5 Einführung in die formale Semantik von Programmiersprachen 1.4 Beispiele für semantische Fragen 38/41

Beispiele für semantische Fragen Diese Beispiele sehen wir uns jetzt an. 1.4 Beispiele für semantische Fragen 39/41

1. Einführung 1.1 Sprachen und Paradigmen 1.2 Definition von Programmiersprachen 1.3 Implementierung von Programmiersprachen 1.4 Beispiele für semantische Fragen 1.5 Einführung in die formale Semantik von Programmiersprachen 1.5 Einführung in die formale Semantik von Programmiersprachen 40/41

Einführung in die formale Semantik von Programmiersprachen Wir sehen uns jetzt zuerst grundlegende Begriffe der Semantik von Programmiersprachen an. 1.5 Einführung in die formale Semantik von Programmiersprachen 41/41