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