Folien zur Vorlesung Programmiersprachen und ihre Übersetzer

Werbung
Einführung
Kleine Ideengeschichte der Programmiersprachen
Folien zur Vorlesung
Programmiersprachen und ihre Übersetzer
Kapitel 1
Robert Giegerich
Faculty of Technology
Bielefeld University
[email protected]
April 8, 2014
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Ziele der Vorlesung
Die Vorlesung will
einen Einblick geben in die Vielfalt der Programmiersprachen,
verschiedene Wege aufzeigen, wie man eine
Programmiersprache implementieren kann,
den typischen Aufbau von Übersetzern darstellen
Werkzeuge und Methoden vorstellen zur (systematischen)
Realisierung verschiedener Teilaufgaben der Übersetzung.
Viele Techniken des Übersetzerbaus sind auch anderswo relevant,
wenn Anwendungen nicht-triviale Eingabesprachen haben.
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Skript und Folien
Die Vorlesung verwendet Skript und Folien
Für die Vorlesung steht ein Skript “Programmiersprachen und
ihre Übersetzer” zur Verfügung, in einer Fassung von 2008.
Die Folien sind Extrakte und Kurzfassungen aus dem Skript,
enthalten aber an einigen (wenigen) Stellen Hinweise auf
modernere Entwicklungen.
Im Sommer 2014 gibt es parallel ein Seminar
“Programiersprachen”, das zum gleichen Studienmodul gehört.
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Organisatorisches
Vorlesung nur bis erste Juli-Woche,
verlängerte Sitzungsdauer 10:15 - 12:00,
zum Modul gehörendes Seminar “Programmiersprachen” wird
nur noch in diesem Semester angeboten.
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Ziele von Kapitel 1
Kapitel 1 gibt einen kurzen Überblick über die Geschichte der
Programmiersprachen. Wir unterteilen:
Die vorsprachliche Phase (1940 - 1960)
Die Phase der Proliferation (1960 - 1985)
Die vier Paradigmen der Programmiersprachen
Die Konsolidierung (1985 - 2010ff)
Anwendungssprachen
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Überblick zur Geschichte (1)
Hier einige Beispiele von Programmiersprachen und Sprachfamilien
imperative
Sprachen
Fortran,
Algol,
Pascal,
Modula,
Basic,
C,
Ada,
...
Robert Giegerich
PSÜ
funktionale
Sprachen
LISP,
FP,
Hope,
KRC,
ML,
Miranda,
Haskell,
...
logische
Sprachen1
Prolog,
Aussagenlogik,
Prädikatenlogik,
Spezifikationssprachen wie
CLEAR,
ASL, OBJ,
Larch,
...
objektorient.
Sprachen
Simula
Smalltalk-80,
C++,
CLASCAL,
Java,
...
Anwendersprachen
VHDL (VLSI-Entwurf),
SQL (Datenbanken),
VAL2 (Robotersteuerun
MARVIN (CompilerErzeugung
LATEX(Textverarbeitung)
SGML, HTML, XML,
Dokumentenverarbeitung
...
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Überblick zur Geschichte (2)
Ein berühmtes Poster von O’Reilly stellt die Geschichte der
Programmiersprachen und einige ihrer Abstammungsbeziehungen
dar.
Siehe http://oreilly.com/news/languageposter_0504.html
Leider wird das Poster nicht weitergeführt.
Wenn wir uns nachher die Geschichte der Programmiersprachen
ansehen, geht es mehr um eine Ideengeschichte – Wann erkannte
man welches Problem? Wie wurde es gelöst? – als um den
historischen Ablauf.
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Kapitel der Vorlesung
1
Einführung, Ideengeschichte
2
Grundbegriffe: Syntax und Semantik, Compiler und
Interpreter, Bootstrapping
3
Übersetzungsschemata: Signaturen, Terme, Ableitungen
4
Syntaxanalyse: Konkrete versus abstrakte Syntax,
Parsergeneratoren, Combinator-Parser
5
Implementierung imperativer Sprachen: Von rekursiven
Prozeduren zur Abstrakten Registermaschine
6
Codeerzeugung: Maschinenbeschreibungen, Spezifikation
durch Ableitung, Code-Selektion durch Inversion
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Keine Kapitel in der Vorlesung
Viele interessante Themen aus dem Bereich “Programmiersprachen
und ihre Übersetzer” kommen in der Vorlesung gar nicht vor oder
werden nur am Rande gestreift.
Entwurf von Programmiersprachen
spezifische Techniken für logische, funktionale,
objekt-orientierte Sprachen
abstrakte Maschinen für portable Implementierungen
diverse Techniken der Code-Optimierung
Codeerzeugung für parallele Rechnerarchitekturen
Prozessor/Compiler Co-design
Integration von Übersetzern und Interpretern in
Programmierumgebung und Betriebssystem
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Literatur
Siehe Literatur-Angaben im Skript.
Das deutschsprachige Buch von Wilhelm et al. gibt es seit
2012/2013 mit den Autoren Wilhelm, Seidl, Hack in vier Bänden
in der Reihe eXamen.press im Springer-Verlag.
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Die vorsprachliche Phase – 1940 - 1960 (1)
Hardwarenahe Programmierung von Rechnern:
Vor den ersten Universalrechnern: Programmierung durch
Verkabelung über Steckbretter
Eingabe von einzelnen Bits über Tasten
Eingabe von Programmen als Befehlsworte in
Binär/Oktal/Sedezimalcode
erste Assembler: Symbolische Namen für Opcodes und
Adressen, Dezimaldarstellung für Zahlen
Mit den Assembler-Sprachen beginnt die symbolische
Programmierung und die Übersetzung in Maschinencode durch den
Rechner selbst. (Diesem Stadium entspricht die unbeschräknte
Registermaschiner aus der A&D-Vorlesung im 1. Semester.)
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Die vorsprachliche Phase – 1940 - 1960 (2)
Weiter geht’s mit der Erhöhung des Programmier-Comforts:
erweiterte Assembler: Aufgabe der Entsprechung von
Maschinenbefehl und Anweisung, einfache Formeln für
Adressrechnung
automatische Speicherallokation durch den Assembler
(relative Adressen, Hilfszellen für Formelauswertung)
Subroutines als erste Abstraktion
Assembler bieten mehr und mehr “Comfort”:
FORTRAN ( = FORmula TRANslation) entsteht quasi
spontan ...
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Charakteristika der hardware-nahen Programmierung
Keinerlei Übertragbarkeit von Programmen zwischen den
Rechnern, in der Regel nicht einmal zwischen verschiedenen
Versionen der gleichen Architektur
intransparente Programme, trickreiche Programmierung
hohe Programmierkosten und unentbehrliche “Experten”
Keine exakt definierte Sprache, sondern nur den jeweilige
Komfort-Angebot der aktuellen Version des Assemblers
Programmieren durch Probieren ...
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Die Phase der Proliferation: 1960 - 1985
Der existierende Zustand weckte Forderungen nach einer
maschinen-unabhängigen Weise, Algorithmen zu beschreiben:
Programmiersprachen.
1958/60: ALGOL60, erste Sprache mit klar definierter Syntax
(kontext-freie Grammatiken, CFGs) und Anspruch auf
Maschinenunabhängigkeit.
Verschachtelte Sichtbarkeitsbereiche, Rekursion, Arrays, ...
ab 1960: FORTRAN, aus Wildwuchs (s.o.) entstanden, wird
zunehmend standardisiert
Entwicklung von Techniken des Übersetzerbaus, aufbauend
auf Parsertechnologie für CFGs
stürmische Entwicklung einer Vielzahl von
Programmiersprachen, universale wie spezielle
Stichpunkt 1965: AMS zählt 1700 Programmiersprachen in
700 Anwendungsbereichen
Robert Giegerich
logische (Prolog) und funktionale ProgrammiersprachenBielefeld University
PSÜ
Einführung
Kleine Ideengeschichte der Programmiersprachen
Von Programmen zu Software
Die Programmierung selbst wird zum Gegenstand der
Theoriebildung:
“Strukturierte Programmierung” fordert lesbare Programme
Programm-Verifikation erfordert Prüfung der Korrektheit
jenseits des Testens
Programming-in-the-large erfordert Modul-Konzepte und
Bibliotheken
Software-Lifecycle kommt ins Blickfeld
ab 1975 etwa herrscht Software-Krise
erste objekt-orientierte Ideen bereits in SIMULA67
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Zwei gegenläufige Tendenzen
Programmiersprachen sollten einfach sein; Verknüpfung weniger
Konzepte, Prinzip der Typsicherheit (strong typing) und der
Orthogonalität
N. Wirth entwickelt Pascal ca 1968; zunächst als Lehrsprache
gedacht und eingesetzt, findet es große praktische Verbreitung
Programmiersprachen sollten universell sein, um der Vielfalt der in
einem Projekt eingesetzten Sprachen zu begegnen
Ausschreibung des DoD (USA) 1977 führt zur Entwicklung
von Ada im internationalen Wettbewerb; eine überaus
komplizierten Sprache; “No Subsets!”; Validation-Suites; im
Endeffekt eine gigantische Fehlentwicklung
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Compiler-Technik
Die Vielzahl der Sprachen motivierte die Entwicklung von
Techniken ihrer Implementierung
Compiler-Compiler unterstützen Sprachimplementierung
Parser-generatoren (Yacc, Bison) für Syntaxanalyse
Attributierte Grammatiken für semantische Analyse und
Übersetzung in abstrakten Maschinencode
Generatoren für Code-Erzeuger, basierend auf
Pattern-Matching auf Bäumen
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Die Konsolidierung: 1985 – 2000
Erkennnisse und Ergebnisse vorangehenden Phase:
Einige wenige imperative Sprachen haben eine gewisse
Maschinenunabhängigkeit erreicht und sich weitgehend
durchgesetzt.
C für die systemnahe Programmierung
Pascal für Ausbildung und kleinere Anwendungen
FORTRAN (und ALGOL-Nachkommen) für numerische
Algorithmen (z.B. in der Physik)
COBOL für kommerzielle Dateiverarbeitung
Generell aber ist klar,
mit imperativen Konzepten allein ist dem Problem der
Software-Komplexität nicht beizukommen
die wesentliche Eigenschaft einer Programmiersprache ist ihre
Fähigkeit zur Bildung von Abstraktionen
Daher: funktionales, logisches und objekt-orientiertes Paradigma!
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Die vier Paradigmen
Für universelle Sprachen unterscheidet man vier Paradigmen
imperativ: Variablen und Anweisungen, die diese Variablen
bearbeiten
objekt-orientiert: Objekte als Einheit von Daten und
Operationen, Prinzip der Datenkapselung (information hiding)
funktional: Abstraktion durch Funktionen höherer Ordnung;
kein Speicherbegriff, kein vorher/nachher
logisch: es werden logische Abhängigkeiten beschrieben,
basierend auf einer Datenbank von Fakten. Anfragen
ermitteln Folgerungen durch einen universellen Suchprozess
(Resolution).
Logische und funktionale Sprachen fasst man auch als deklarative
Sprachen zusammen.
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Vertreter der OO-Programmiersprachen
Von den Anfängen bis heute:
1967: SIMULA67-Klassen sind persistente Datenstrukturen
mit darauf definierten Operationen
1970 – 1980 Smalltalk80: Sprache und umfassendes
Programmiersystem als Klassenhierarchie; puristisch
ca 1983: C++ als Erweiterung von C. Klassen, Templates,
aber auch explizite Pointer
ab 1995: Java: C++ plus die Pascal-Erfahrung: Einfache
Sprache, Klassen ohne Pointer; Plattform-Unabhängigkeit
Konkurrenten zu C++ und Java: Objective C, C#, Eiffel
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Vertreter der funktionalen Sprachen
Von den Anfängen bis heute:
1958ff LISP (LISt Processing language): Rekursive Funktionen
über Listen; nicht typisiert(!); symbolische Programmierung;
Programme als Datenstrukturen. Selbst-modifizierender
high-level Code (!). LISP-Interpreter in LISP passt auf eine
halbe DIN A4 Seite. Ursprünglich für die Theoretische
Informatik entwickelt, wurde es zur Sprache der KI-Forschung.
1975ff Scheme: Syntaktisch geschönte Version von Lisp;
strikte Semantik (= eager evaluation); verbreitete
Ausbildungssprache
Wikipedia enthält einen guten Artikel über LISP
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Vertreter der funktionalen Sprachen (2)
ca 1975 ML: Funktionale Sprache eines Theorem-Provers;
Konstruktor-Datentypen; parametrischer Typ-Polymorphismus
1982 Miranda: Lazy funktionale Sprache, polymorphe Typen,
elegante Syntax, Abseitsregel
1988ff Haskell: Weiterentwicklung von Miranda, Typklassen,
Monaden, GHC-Compiler
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Funktionale Sprachen
Merkmale funktionaler Sprachen:
Extrem kurze und lesbare Programme; hohe
Wiederverwendbarkeit; flexibel erweiterbar durch Funktionen
höherer Ordnung
Die outermost reduction von lazy Sprachen bedeutet einen
Geschwindigkeits-Nachteil und einen Speicher-Mehraufwand,
die durch aktuelle Verbesserung der Compiler-Techniken
immer weiter reduziert werden.
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Vertreter der logischen Sprachen
Von den Anfängen bis heute:
1970ff Prolog: Programmierung mit Horn-Klauseln;
Aussagenlogik mit strukturierten Symbolen; SLD-Resolution;
zunächst interpretiert, dann compiliert für WAM (Warren
abstract machince)
Wenig Weiterentwicklung in der Sprache, aber bessere
Implementierungen: Sixtus-Prolog, SWI-Prolog
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Zwischen den Paradigmen
Anwendungs-spezifische Sprachen (domain specific languages,
DSLs) lassen sich nicht unbedingt in diese Kategorien einsortieren
LaTeX, Html: Dokumentenbeschreibung
Bellman’s GAP: Dynamische Programmierung über Sequenzen
Neuere Sprachen versuchen verschiedene Paradigmen zu
verknüpfen (und dabei die Vorteile beider Seiten zu erhalten)
Scala: Objektorientierte und funktionale Sprache
Curry: Logisch-funktionale Sprache
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Fazit
Ausgangspunkt: 40 Jahre lang beruhte der Fortschritt der
Informatik zur Hälfte auf der Weiterentwicklung der
Programmiersprachen. Sie erlauben, mit weniger Aufwand
komplexere Probleme zu lösen, und dies auch noch zuverlässiger.
50 Jahre nach ALGOL hat sich die stürmische Entwicklung der
Programmiersprachen beruhigt:
wenige, etablierte Sprachen dominieren: C, C++/Java,
Haskell (Scheme), Prolog/Datalog (?)
Übersetzerbau hat als Forschungsgebiet an Bedeutung verloren
aber: signifikante Fortschritte in der Erweiterung und
Übersetzung von Haskell
Aber auch das Umfeld der Informatik hat sich gewandelt.
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Software-Entwicklung und Anwendung
In den frühen Jahren der Informatik waren die Entwickler der
Programme oft auch die Anwender. Heute:
Der Bereich der Anwendung ist gewaltig gewachsen und hat
sich von der Entwicklung der Informatik als wissenschaftliche
Disziplin abgetrennt.
Neue Algorithmen werden nur noch in (vergleichsweise)
wenigen, neuen Einsatzgebieten entwickelt.
Der größte Teil der Anwender benutzt vorgefertigte Software,
die ggf. konfiguriert oder mit anderer Software integriert
werden muss.
Robert Giegerich
PSÜ
Bielefeld University
Einführung
Kleine Ideengeschichte der Programmiersprachen
Software-Entwicklung und Anwendung
Unter den vielen Firmen der Softwarebranche gibt es
tatsächlich nur wenige, die diverse eigene Produkte für den
Markt entwickeln.2
Die meisten IT-Firmen sind damit beschäftigt, etablierte
Software auf die Betriebsabläufe des jeweiligen Kunden
anzupassen (oder auch umgekehrt).
SAP-Programmierer ist ein Beruf!
Neue Firmen entstehen durch erfolgreiche Nischenprodukte.
Fazit: Die bahnbrechenden Entwicklungen der Informatik finden
heute nicht mehr auf dem Gebiet de Programmiersprachen statt.
2
Der hierfür benötigte Kapitalvorschuss ist hoch, er erfordert viel
hochqualifizierte menschliche Arbeit; der Rückfluss ist durch den allgemein
schnellen Innnovationszyklus unsicher.
Robert Giegerich
PSÜ
Bielefeld University
Herunterladen