Der Zoo der Programmiersprachen
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Der Zoo der Programmiersprachen Prof. Dr. Bernd Ulmann 22. Januar 2014 1/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
1. Einleitung Einleitung 2/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Worum geht es? 1. Einleitung Worum geht es? Es geht um den Einfluss, den (Programmier-)Sprachen auf unser Denken haben, d.h. es geht um Programmiersprachen, ihre Geschichte und – ein wenig – auch um ihre Zukunft, aber auch Poesie und Literatur sollen nicht zu kurz kommen. . . . . . zunächst einmal geht es jedoch um Sprachen an sich: 3/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Sprachen 1. Einleitung Was sind Sprachen im allgemeinen? Zwei von vielen, vielen Definitionsversuchen:1 Unter Sprache versteht man die Menge, die als ” Elemente alle komplexen Systeme der Kommunikation beinhaltet.“ Das heisst was? :-) Sprachen sind die Systeme von Einheiten und ” ’ Regeln, die den Mitgliedern von Sprachgemeinschaften als Mittel der Verständigung dienen‘.“ 1 Siehe http://de.wikipedia.org/wiki/Sprache, Stand 09.03.2013 4/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Anforderungen 1. Einleitung Welche Eigenschaften müssen (brauchbare) Sprachen erfüllen? Keine Privatsprache“ (siehe [Wittgenstein 1945]): Eine ” solche Sprache kann nur von dem sie definierenden Individdum verstanden werden. Wohldefiniertheit“ von Begriffen (bei natürlichen Sprachen ” ist das stark eingeschränkt – was verbirgt sich beispielsweise hinter einem alltäglich verwendeten Begriff wie dem Bewusstsein“?) ” Vollständigkeit“ bzw. Mächtigkeit“: Die Sprache muss in ” ” der Lage sein, auch neue, unvorhergesehene Sachverhalte adäquat ausdrücken zu können. Idealerweise gibt es eine Kultur“ einer bestimmten Sprache, ” d.h. Literatur, Poesie etc. 5/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Sprachklassen 1. Einleitung Welche Sprachklassen lassen sich unterscheiden? Natürliche Sprachen: Sprachen dieser Klasse sind das Ergebnis einer (langen) historischen Entwicklung, die nicht gesteuert bzw. zweckgerichtet verlief. Konstruierte Sprachen: Solche Sprachen wurden explizit für bestimmte Einsatzzwecke entwickelt (z.B. Toki ” Pona“). Formale Sprachen: Diese sind eine Untermenge der konstruierten Sprachen und gehen aus sogenannten formalen Grammatiken hervor – ein typisches Beispiel hierfür sind Programmiersprachen. 6/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Warum Programmiersprachen? 1. Einleitung Im Folgenden liegt der Fokus aus den folgenden Gründen auf Programmiersprachen: Natürliche Sprachen sind ungenau, chaotisch und eigentlich langweilig. :-) Programmiersprachen sind das, was unsere heutige Welt zusammenhält! Programmiersprachen prägen das Problemlöseverhalten in vielleicht sogar größerem Maße, als das natürliche Sprachen tun! Programmiersprachen haben so kurze Entwicklungszyklen, dass man durch ihre Beobachtung und Untersuchung viel über Sprachentwicklung an sich lernen kann. . . . und immerhin geht es hier um Informatik, also um Sprachen für Maschinen (und auch Menschen)! :-) 7/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Programmiersprachen 1. Einleitung Warum werden in der Informatik eigentlich Programmiersprachen benötigt? Warum können nicht einfach sogenannte natürliche Sprachen, eventuell in Form eines Sprachsubsets, eingesetzt werden? Edsger Wybe Dijkstra bringt das Hauptproblem natürlicher Sprachen schön auf den Punkt:2 So-called ‘natural language’ is wonderful for the ” purposes it was created for, such as to be rude in, to tell jokes, to cheat or to make love in (and Theorists of Literary Criticism can even be content-free in it), but it is hopelessly inadequate when we have to deal unambiguously with situations of great intricacy, situations which unavoidably arise in such activities as legislation, arbitration, mathematics or programming.“ 2 Siehe [Dean 1995][Vorwort]. 8/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Programmiersprachen 1. Einleitung Was ist nun eine Programmiersprache? A programming language is an artificial language ” designed to communicate instructions to a machine, particularly a computer. Programming languages can be used to create programs that control the behavior of a machine and/or to express algorithms precisely.“ 3 Diese Definition ist jedoch (zu) stark eingeschränkt, beispielsweise bleiben Fragen nach Poesie, Literatur und der Schönheit von Programmen aussen vor. . . 3 Quelle: http://en.wikipedia.org/wiki/Programming language, Stand 06.10.2011. 9/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Programmiersprachen 1. Einleitung Programmiersprachen sind formale Sprachen“, d.h. es ” existiert jeweils eine exakte Definition zulässiger Ausdrücke sowie ihrer Bedeutung – Mehrdeutigkeiten, wie in natürlichen Sprachen, sind nicht möglich. :-) Programmiersprachen bilden (meist) die Schnittstelle zwischen Mensch (Programmierer) und Maschine (Computer). Programmiersprachen stehen im Spannungsfeld zwischen Universalität, Anwendungs- und Maschinenorientierung! Es gibt nicht die Programmiersprache für alle Einsatzbereiche (obwohl IBM seinerzeit PL/1 zu der Programmiersprache erklärt hat :-) ). 10/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Sag’ mir wieviel. . . 1. Einleitung Aktuelle Schätzungen gehen davon aus, dass es etwa 7000 natürliche Sprachen im Lauf der Zeiten gab, die aktiv gesprochen wurden und zum Teil noch werden. Damit stellt sich schnell die Frage, wieviele Programmiersprachen es (in etwa) gibt. Auf einer Webseite findet sich folgende Bemerkung:4 There are dozens of programming languages and ” new ones are being continuously developed.“ Das ist leicht untertrieben! Wer es genauer wissen möchte, sollte einen Blick auf HOPL5 werfen – hier finden sich viel, viel mehr als ein paar Dutzend Programmiersprachen: 4 Siehe http://www.businessdictionary.com/definition/programming-language.html, Stand 06.10.2011. 5 Siehe http://hopl.murdoch.edu.au, Stand 06.10.2011. 11/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Der Turmbau zu Babel 1. Einleitung 8512 Programmiersprachen! (Abbildung aus http://rzv037.rz.tu-bs.de/gis/gis/drucken/ft9.htm, Stand 06.10.2011.) 12/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Der Turmbau zu Babel 1. Einleitung Ist das nicht erstaunlich? In knapp 70 Jahren hat die Informatik mehr Kunstsprachen hervorgebracht, als der Rest der Menschheit in all’ den Jahrtausenden zuvor! 13/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Top 10 languages 1. Einleitung Verblüffenderweise werden gegenwärtig nur 10 Sprachen für ca. 80 Prozent aller Projekte genutzt: (Abbildung aus http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html, Stand 03.10.2013.) 14/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Und. . . ? 1. Einleitung Und? Welche Lehre sollte man daraus ziehen? Was scheren mich alte, längst vergessene Sprachen? Ich lerne Java – damit finde ich immer einen Job! NEIN! Ganz im Gegenteil! Unsere Geschichte, die Geschichte der Informatik, muss bewahrt werden, um aus den Fehlern der Vergangenheit lernen und auf den großartigen Ideen unserer Vorgänger aufbauen zu können! Die heutige Beinahe-Monokultur ist ein echtes Problem! 15/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Warum Geschichte? 1. Einleitung Warum sollte man sich mit Geschichte befassen? Sollte man nicht besser nur nach vorne schauen? George Santayana6 bemerkt dazu Folgendes: [. . . W]hen experience is not retained, as among ” savages, infancy is perpetual. Those who cannot remember the past are condemned to repeat it. In the first stage of life the mind is frivolous and easily distracted; it misses progress by failing in consecutiveness and persistence. This is the condition of children and barbarians, in whom instinct has learned nothing from experience.“ 6 Siehe [Santayana 1906]. 16/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Sprachengeschichte 1. Einleitung Was kann man aus der Geschichte der Entwicklung der Programmiersprachen lernen, was heute von Wert ist? Klärung der Frage Warum ist ein bestimmtes Feature so, wie ” es ist, und nicht anders?“ – zum Beispiel: Warum verwendet ” C 0-terminierte Strings und nicht counted Strings, wie Pascal?“ Welche Ideen haben sich nicht bewährt – diese retrospektive Einsicht ist in der Informatik sehr schwach vertreten.7 Welche Ideen sind – vielleicht zu Unrecht – (fast) in Vergessenheit geraten? (Beispiele: APL, Forth. . . ) Über den Tellerrand-Schauen ist essenziell! Ein wirklich guter Programmierer muss deutlich mehr als ein oder zwei Sprachen kennen! 7 Es gibt jedoch das Forum for Negative Results“, siehe http://page.mi.fu-berlin.de/prechelt/fnr/, ” Stand 06.10.2011. 17/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Sprachengeschichte 1. Einleitung Schön bringt das Diarmuid Pigott auf den Punkt:8 As the world becomes increasingly and ” overwhelmingly dependant on software, we find that the core of that software – programming languages and systems – remain a mystery to even their users, the programmers. By paying attention to the origin, rise and fall of each of the languages we may learn why they made their decisions.“ Darum nun eine kleine Tour de Force auf den Turm zu Babel der Programmiersprachen und deren Geschichte, um zu zeigen, wie viele brillante Ideen es wieder zu entdecken gibt und wie facettenreich Programmiersprachen sind. . . 8 http://hopl.murdoch.edu.au/why.html, Stand 06.10.2011. 18/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Auf den Schultern. . . 19/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Auf den Schultern. . . 2. Auf den Schultern. . . . . . von Giganten! Alle Konzepte der Informatik, und damit auch die von Programmiersprachen, bauen letztlich auf dem gigantischen Ideen- und Notationsgebäude auf, das Mathematik und Logik mit sich gebracht haben. Darum ein kurzer Blick auf mathematische Notation und deren Einfluß auf unser Denken. . . 20/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Die erste konstruierte Sprache 2. Auf den Schultern. . . Die mathematische Notation ist die vermutlich erst überhaupt entwickelte Kunstsprache. Mit die frühesten bekannten Schriftstücke behandeln erstaunlich häufig mathematische Probleme, was zeigt, wie wichtig schon vor Jahrtausenden die Möglichkeit war, mathematische Fragestellungen, wenngleich zunächst sehr praxisbezogen, zu formulieren. Ein Beispiel hierfür ist folgende Aufgabe aus einem babylonischen Keilschrifttext:9 Länge mit 3 vervielfacht ” Breite mit 2 verfielfacht addiert quadratisch Fläche [der] Länge addiert und so 4,56,40“ In heutiger Notation sähe diese Aufgabenstellung wie folgt aus: (3x + 2y )2 + x 2 = 4, 56, 40 9 Siehe [Neugebauer 1969][S. 71]. 21/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Sprachen für Mathematik 2. Auf den Schultern. . . Offensichtlich war es sehr mühsam, auch nur halbwegs komplexe Problemstellungen dergestalt zu beschreiben – von der Beschreibung algorithmischer Lösungsverfahren einmal ganz abgesehen. . . Dies dürfte mithin ein Grund dafür gewesen sein, dass die Mathematik erst in den vergangenen wenigen Jahrhunderten zu einem wahren Höhenflug angesetzt hat, als nämlich eine zu großen Teilen standardisierte und anerkannte Notation vorhanden war, die auf die Beschreibung mathematischer Sachverhalte zugeschnitten entwickelt wurde. Mit verbesserter Notation konnten zunehmend komplexere Probleme beschrieben und auch gelöst werden, was wiederum Erweiterungen der mathematischen Notation zur Folge hatte etc. 22/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Das Gleichheitszeichen 2. Auf den Schultern. . . Einen wesentlichen Beitrag dazu leistete Robert Recorde10 , dem das Gleichheitszeichen zu verdanken ist:11 Die heute ungewohnten cossischen Zeichen bezeichnen hier die nullte, erste und zweite Potenz, so dass sich in heutiger Schreibweise Folgendes ergibt: 34x 2 − 12x = 40x + 480 − 9x 2 10 Ca. 1510–1558 11 Siehe [Reich 2010][S. 79]. 23/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Heaviside und p 2. Auf den Schultern. . . Ein kleines Beispiel, wie (Kunst-)Sprachen unser Denken beeinflussen bzw. manche Überlegungen erst möglich machen: Oliver Heaviside führte den p-Operator ein, um Ableitungen zu notieren, d.h. er definierte (das Folgende ist stellenweise sehr vereinfacht) d p= . dt Wenn p einer Ableitung entspricht, was ist dann p1 ? Offensichtlich ist dies die Umkehrfunktion von p, da p p1 = 1, d.h. 1 p entspricht einer Integration! Was passiert, wenn man mit p einfach rechnet“? ” 24/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
√ p 2. Auf den Schultern. . . Da p1 einer Integration entspricht, gilt (etwas vereinfacht, ohne Netz und doppelten Boden) tn Z Z 1 = . . . 1 dt = pn n! Und jetzt wird es auf den ersten Blick etwas esoterisch: Was ist beispielsweise eine halbe Integration“, d.h. was ist eigentlich ” 1 1 1 = √ ? p2 p Mit der Gamma-Funktion Γ, die als Erweiterung der Fakultät auf positive reelle Zahlen aufgefasst werden kann, ergibt sich für eine halbe Integration“ Folgendes: ” √ 1 t 1 = p2 Γ(1 + 12 ) 25/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
√ p 2. Auf den Schultern. . . Auf die Idee, eine halbe Integration“ zu betrachten, wäre man ” ohne den Notationstrick mit p wohl nicht gekommen. Das Verblüffendste daran ist, dass dieser Operator eine wichtige Rolle in den Untersuchungen Heavisides zum Elektromagnetismus spielen sollte!12 . . . und das alles nur durch Notation, d.h. in diesem Fall Sprache! :-) Nun aber endlich zu Programmiersprachen: 12 Siehe [Focke 1962][S. 635 ff.]. 26/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Programmieren: Die ersten ∼1900 Jahre 27/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Heron von Alexandria 3.1 Heron von Alexandria Heron von Alexandria (lebte vermutlich im 1. Jahrhundert) war nicht nur einer der schöpferischsten Ingenieure der Antike, sondern auch einer der ersten Programmierer. Er schuf Theatermaschinen, selbstfahrende Tempelwagen etc., die in gewissem Sinne programmierbar waren. Zu seiner Zeit riefen diese Maschinen sicherlich große Verwunderung hervor, was wohl auch der Auslöser für den Bau der Tempelwagen gewesen sein wird – Arthur C. Clarkes drittes Gesetz vorwegnehmend:13 Jede hinreichend fortschrittliche Technologie ist von Magie nicht ” zu unterscheiden.“ 13 Siehe http://de.wikipedia.org/wiki/Clarkesche Gesetze, Stand 23.07.2011. 28/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Herons Tempelwagen 3.1 Heron von Alexandria 29/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Jacquard-Webstühle 3.2 Jacquard Zu Beginn des 19. Jahrhunderts entwickelte Joseph Marie Jacquard einen lochkartengesteuerten Webstuhl, mit dessen Hilfe eine Massenproduktion von Textilien mit komplexen Mustern möglich wurde. Hauptunterschied zur Programmierung der Automaten des Heron von Alexandria war die Möglichkeit, Programme beliebig häufig ausführen zu lassen, da das Ablesen von Lochkarten nicht zerstörend war (im Unterschied zur Schnurprogrammierung des Tempelwagens etc.). 30/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Jacquard-Webstühle 3.2 Jacquard (Abbildung von Christiane Utsch vom Atelier für Parametik, mit freundlicher Genehmigung.) 31/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Player Pianos 3.3 Player Pianos Auch Musikinstrumente wie die Player Pianos wurden mit Lochstreifen gesteuert: (Abbildung aus http://www.nancarrow.de/images%201/02-Player-Piano.jpg, Stand 06.10.2011.) 32/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Babbage und Lovelace 3.4 Babbage und Lovelace Bereits 1837 beschrieb Charles Babbage die sogenannte Analytical ” Engine“,14 bei der es sich um einen programmierbaren mechanischen Rechner handelte, der zu seinen Lebzeiten allerdings nicht umgesetzt werden konnte (1991 wurde am Londoner Science Museum auf der Basis von Babbages Plänen eine funktionsfähige Analytical Engine gebaut, die zeigt, dass Babbages Ideen durchaus umsetzbar und vor allem korrekt waren). Die folgende Abbildung (Bild von Bruno Barral - mit freundlicher Genehmigung) zeigt ein von Babbage gebautes Experimentalmodell der Analytical Engine (ein Berater würde heutzutage von einem Proof-of-Concept sprechen). 14 Siehe hierzu vor allem [Dotzler 1996]. 33/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Die Analytical Engine 3.4 Babbage und Lovelace 34/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Analytical Engine, Lochkarten 3.4 Babbage und Lovelace Programmiert wurde sie mit Lochkarten: Die kleinen Karten im Vordergrund sind Opera- ” tional Cards“, d.h. sie spezi- fizieren einzelne Instruktionen, während die längeren Karten Variable Cards“ darstellen und ” die Adressen von Operanden enthalten. Bemerkenswert ist, dass eine Karte auf mehre- ren Operandengruppen arbei- ten kann – eine Vorwegnahme der Vektorrechneridee. . . (Bildquelle: http://upload.wikimedia.org/wikipedia/ commons/0/0d/PunchedCardsAnalyticalEngine.jpg, Stand 24.07.2011.) 35/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Die erste Programmiererin 3.4 Babbage und Lovelace Augusta Ada King, Countess of Lovelace, die Tochter Lord Byrons, wurde durch ihre Bekanntschaft mit Charles Babbage und ihre Begeisterung für die Analytical Engine nicht nur zur ersten Chronistin des Computer-Zeitalters, sondern vor allem zur ersten Programmiererin überhaupt. Unter Anderem entwickelte sie ein Programm zur Berechnung von Bernoulli-Zahlen und schreckte auch vor der Idee sehr langer Programme, die, wie sie schrieb, weit über 20000 Lochkarten benötigen würden, nicht zurück15 und schrieb:16 We may say most aptly that the analytical engine weaves algebraic ” patterns just as the Jacquard looms weaves flowers and leaves.“ Die folgende Abbildung17 zeigt das genannte Programm. 15 Siehe [Menabrea 1842] . 16 Siehe [Reynolds, Tymann 2008][S. 7]. 17 Siehe http://www.fourmilab.ch/babbage/figures/menat6ps.zip, Stand 24.07.2011. 36/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Bernoulli-Zahlen 3.4 Babbage und Lovelace 37/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Bedingte Ausführung 3.4 Babbage und Lovelace Was die Analytical Engine aus allen Entwicklungen bis etwa Mitte der 1940er Jahre heraus ragen lässt, ist ihre Möglichkeit, sogenannte bedingte Sprünge auszuführen. Diese Fähigkeit einer Maschine führt zu einem nahezu unbeschränkten Maß an Komplexität hinsichtlich ihrer Aktionen, was sie erst zu einer wirklich universellen Maschine, einem Computer im heutigen Sinne, werden lässt. Ohne diese Fähigkeit zu bedingten Entscheidungen wären Programme, die mehr als eine unabänderliche Folge von Befehlen darstellen, nicht möglich. So gesehen stellt die Analytical Engine einen der wichtigsten Schritte auf dem Weg zu unseren modernen Computern dar. 38/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Lessons learned 3.5 Lessons learned Lessons learned: Die Idee des Programmierens ist viel älter, als meist angenommen wird. Mit Lochstreifen lassen sich Schleifen bauen – sogenannte Loops“. ” Sollen viele gleiche Operationen auf unterschiedlichen Operanden ausgeführt werden, empfiehlt sich, nicht pro Operandensatz eine Instruktion zu verwenden, sondern eine Instruktion auf alle betreffenden Operanden anzuwenden. Vorwegnahme des Vektorrechners bzw. SIMD-Prinzips! 39/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
4. ∼1940 bis ∼1955 ∼1940 bis ∼1955 40/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Programmieren mit Kabeln 4. ∼1940 bis ∼1955 Viele Maschinen der 1940er und 1950er Jahre verfügten zwar über Speicherzellen, die jedoch meist nur für Variablen genutzt werden konnten, so dass keine Speicherprogrammierung der Rechner möglich war. Da eine Steuerung durch Lochkarten oder -streifen der durch den Einsatz von Röhren gesteigerten Arbeitsgeschwindigkeit nicht mehr angemessen war, wurde die Programmierung solcher Maschinen meist mit Hilfe einer variablen Verdrahtung vorgenommen. Ein schönes Beispiel hierfür sind die IBM 604 und 605: 41/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Programmieren mit Kabeln 4. ∼1940 bis ∼1955 (Mit freundlicher Genehmigung der D. H. Ramsey Library, Special Collections & University Archives.) 42/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Ein Patchboard 4. ∼1940 bis ∼1955 43/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
IBM 650 4. ∼1940 bis ∼1955 Einer der ersten kommerziell ausgesprochen erfolgreichen speicherprogrammierten Rechner war die IBM 650. Dieser vollständig röhrenbestückte Rechner verfügte über eine Magnettrommel mit einer Kapazität von 2000 Maschinenwörten, die sowohl für die Speicherung von Instruktionen als auch von Daten genutzt werden konnten. Aus heutiger Sicht nahezu unvorstellbar ist, dass mit einem so kleinen Speicher hochkomplexe Softwaresysteme entwickelt und betrieben werden konnten. Unter anderem wurde für die IBM 650 einer der ersten Compiler, IT“, entwickelt. ” Die folgende Abbildung zeigt eine IBM 650: 44/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
IBM 650 4. ∼1940 bis ∼1955 (Abbildung: Lawrence Livermore Laboratory, mit freundlicher Genehmigung.) 45/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Quadratwurzelberechnung 4. ∼1940 bis ∼1955 Quadratwurzelberechnung in Assembler:18 18 Siehe [IBM 1955][S. 88]. 46/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
IT 4. ∼1940 bis ∼1955 So faszinierend die Programmierung einer solchen Maschine in der ihr eigenen Maschinensprache oder Assembler auch ist, hat sie dennoch schwerwiegende Nachteile: Extrem zeitaufwändig. Vergleichsweise fehleranfällig. Maximale Maschinennähe aber ebenso maximale Problemferne. . . Entsprechend früh kam die Idee auf, Hochsprachen“ zu ” entwickeln, die von der eigentlichen Maschine abstrahieren sollten und mit Hilfe von Übersetzerprogrammen, Compilern“, in die ” Maschinensprache der Zielmaschine übersetzt werden. Die folgenden beiden Folien zeigen ein Programm in einer der ersten Hochsprachen, IT“, welches das Integral über eine ” Funktion mit Hilfe der Simpsonregel berechnete.19 19 Siehe [Perlis et al. 1958][S. 3.30 ff.]. 47/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
IT 4. ∼1940 bis ∼1955 Simpsonregel 1 SIMPS ONS RULE 2 C1 C2 RANGE AB 3 C3 ERROR 4 I1 R EAD F LINK 5 4K I 3K 0K 1K 10 0 K F 6 G5 F GET END 2 7 Y1 Z Q22 E K Y 5 X 1S2XI3Q F FUNCTION 9 8 G I2 F RETURN 9 TI3 T Y4 T C 3 T Y2 F 4 10 H F STOP 11 Y6 Z 0J F CLEAREND 5 12 Y2 Z LC2 MC1RD 2J F SET H 13 8K I 4K 1K1K 2K F END ITER 14 Y5 Z C I4 F SET P 3 15 I2 Z 8 F SET LINK 16 G I1 F TO FNCTN 17 Y6 ZY 6 S Y1 X Y 2 F COMP END 8 18 Y4 ZY6 F INIT INT 19 Y3 Z 0J F 1 20 Y7 Z C2 M Y2D 2J F 21 6 K Y5K C1SY 2K 2J XY2K Y7K F INNERSUM 22 I2 Z 6 F SET LINK 11 23 GI1 F TO FNCTN 7 24 Y3 Z Y3 S Y1 F NEXT DEL 6 25 Y7 Z Y6 S Y2 X 4J X Y3 F NEW INT 26 G10 IF C3 W ALY7 M Y4 R F CHCK END 27 Y4 Z Y7 F 28 Y6 Z J25 X Y4 S Y6 F NEXT G 29 Y2 Z Y2D 2J F NEXT H 30 G 1 F TO SET P 31 Y4 ZY 4 D 3J F INTEGRAL 10 32 G4 FF TO MASTER Simpsonregel 48/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
IT 4. ∼1940 bis ∼1955 Simpsonregel 1 SIMPSONS RULE 2 C1 C2 RANGE AB 3 C3 ERROR 4 I1 READ F LINK 5 4, I3, 0, 1, 100, F 6 2: GOTO 5 F GET END 7 9: Y1
Lochkarten 4. ∼1940 bis ∼1955 Wie sah eigentlich die Programmierumgebung dieser frühen Jahre aus? (Siehe [Jacobs 1986][S. 242].) 50/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Lochen 4. ∼1940 bis ∼1955 (Siehe [Jacobs 1986][S. 250].) 51/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Programmausführung 4. ∼1940 bis ∼1955 (Siehe [Jacobs 1986][S. 252].) 52/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Output 4. ∼1940 bis ∼1955 (Siehe [Jacobs 1986][S. 256].) 53/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Analyse und Debugging 4. ∼1940 bis ∼1955 (Siehe [Jacobs 1986][S. 258].) 54/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Fertiges Programm 4. ∼1940 bis ∼1955 (Siehe [Jacobs 1986][S. 200].) 55/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Lessons learned 4.1 Lessons learned Lessons learned: Wechselnde Verdrahtung hat Vorteile: Kein von Neumann-Flaschenhals etc. Vorwegnahme von Datenflussmaschinen und FPGAs, könnte in naher Zukunft wieder sehr interessant werden! Assembler ist gar nicht die schlechteste Art, einen Computer zu programmieren. :-) Man braucht keine bunte IDE, um wirklich guten Code schreiben zu können. :-) Wenig Speicher/CPU-Leistung erzwingt effizienten Code! (Davon könnte Microsoft einmal etwas lernen!) 56/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
5. Einige frühe Hochsprachen Einige frühe Hochsprachen 57/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
FORTRANSIT 5. Einige frühe Hochsprachen Schon etwas abstrakter, d.h. problemnäher, war FORTRAN, 1956 von John Backus entwickelt, hier eine Matrixmultiplikation in FORTRANSIT, einem FORTRAN-Dialekt: Matrixmultiplikation 1 C RECTANGULAR MATRIX 2 C MULTIPLICATION 3 DIMENSION A(4,5), B(5,3) 4 READ 1,A,B 5 READ 1,N,M,L 6 DO 4 J=1,N 7 DO 4 I=1,M 8 SUM=0.0 9 DO 3 K=1,L 10 3 SUM = SUM+A(I,K) * B(K,J) 11 4 PUNCH 1, SUM, I,J 12 END Matrixmultiplikation 58/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
FORTRAN 5. Einige frühe Hochsprachen Interessant an FORTRAN sind die folgenden Punkte: Die Sprache wird noch immer im technisch/naturwissenschaftlichen Bereich eingesetzt. FORTRAN besticht durch gute Standardisierung (FORTRAN 66, 77, 8x, 90, . . . ). Es ist definitiv keine schöne oder besonders innovative Sprache! Offenbar setzt sich nicht immer die bessere Idee durch, wie das folgende Beispiel APL zeigen wird: 59/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
APL 5. Einige frühe Hochsprachen 1957 entwickelte Ken Iverson (IBM) eine neue mathematische Notation, die er in einem Buch A Programming Language“ ” beschrieb. Zunächst war APL“ wirklich nur als neue, konsistente ” Notationsform gedacht, die unter anderem bei IBM zur formalen Beschreibung der Architektur der Baureihe /360 genutzt wurde. 1963 wurde eine erste Implementation der Sprache auf einer IBM 1620 umgesetzt, weitere Interpreter (!) für IBM-Großrechner folgten in den nächsten Jahren. Was ist an APL besonders? Bis heute zählt APL zu den außergewöhnlichsten Programmiersprachen überhaupt und ist in manchen Bereichen noch immer führend. Der Hauptvorteil von APL ist der extrem hohe Abstraktionsgrad von den Gegebenheiten der zugrunde liegenden Maschine und die hohe Problemnähe: 60/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
APL-Beispiel 5. Einige frühe Hochsprachen Als kleines Beispiel diene die Berechnung der Summe 100 X i. i=1 In FORTRAN könnte das wie folgt geschehen: PROGRAMM GAUSS IMPLICIT NONE INTEGER*4 I, SUMME/0/ C DO 10 I = 1, 100 10 SUMME = SUMME + I WRITE(*,*) SUMME END 61/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
APL-Beispiel 5. Einige frühe Hochsprachen Man sieht, dass man sich in FORTRAN um eine ganze Reihe von Dingen kümmern muss, die mehr mit der Maschine und weniger mit dem eigentlich zu lösenden Problem zusammen hängen. Ganz anders in APL – hier lässt sich die gegebene Aufgabe wie folgt lösen: +/ι100 Elegant, nicht wahr? Der Trick steckt hier im Reduktionsoperator /. (Die APL-Lösung läuft letztlich darauf hinaus, einen Vektor der Form (1, 2, 3, . . . , 100) zu bilden und dann daraus (1 + 2 + 3 + · · · + 100) zu berechnen.) 62/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Primzahlen 5. Einige frühe Hochsprachen Lassen Sie uns eine Liste von Primzahlen erzeugen – das Sieb des Eratosthenes bietet sich hierfür an. In C könnte das wie folgt aussehen: primes.c 1 #include 2 #define R 100 3 int main() 4 { 5 int i, j, v[R + 1]; 6 7 for (i = 2; i
Primzahlen in APL 5. Einige frühe Hochsprachen (∼ R ∈ R ◦ . × R)/R ← 1 ↓ ιR 64/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Primzahlen in APL 5. Einige frühe Hochsprachen Wie funktioniert das? Erst einmal ohne explizite Schleifen! Grundidee ist, eine Multiplikationstabelle aufzustellen (Spalten und Zeilen laufen von 2 bis 100). Auswahl aller Elemente eines Vektors mit den Elementen 2 bis 100, die nicht in der Matrix enthalten sind. Diese Elemente sind offensichtlich Primzahlen. Es geht aber auch ganz anders – während APL eine komplexe Syntax besitzt, kann man auch Programmiersprachen fast ohne Syntax entwickeln, die dennoch – oder gerade darum – sehr leistungsfähig sind: 65/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
LISP 5. Einige frühe Hochsprachen 1958 entwickelte John McCarthy die Programmiersprache LISP, die ebenfalls interpretiert ausgeführt wurde und die erste homoikonische“ Programmiersprache darstellt, d.h. die erste ” Sprache, in der Programme in der gleichen Datenstruktur (Form) ausgedrückt wurden, welche die grundlegende Struktur der Sprache selbst ist. Im Falle von LISP handelt es sich bei dieser Datenstruktur um Listen – (fast) alles in einem LISP-Programm ist letztlich eine Liste – auch das Programm selbst, was es erlaubt, Metaprogramme zu schreiben, die ihrerseits Programme schreiben oder modifizieren. . . Die folgende Folie zeigt ein LISP-Programm aus dem Jahre 1959:20 20 Quelle: http://funcall.blogspot.com/2011/02/early-lisp-programi .html, Stand 31.07.2011. 66/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
LISP-Beispiel 5. Einige frühe Hochsprachen TST M948-371-P. FOX-EXERCISE 1 DEFINE (((COLLAPSE,(LAMBDA,(L),(COND, ((ATOM,L), (CONS,L,NIL)) ((NULL,(CDR,L)), (COND,((ATOM,(CAR,L)),L),(T,(COLLAPSE,(CAR,L))))) (T,(APPEND,(COLLAPSE,(CAR,L)),(COLLAPSE,(CDR,L)))) ))))) () COLLAPSE ((((A,B),((C))),((D,(E,F)),(G),((H))))) () COLLAPSE ((A,(B,(C,(D,(E))),F,(G,(H,J))))) () COLLAPSE ((((((A),B),C),D),E)) () STOP))))))))))STOP FIN M948-371-P. FOX-EXERCISE 1 67/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
JOSS 5. Einige frühe Hochsprachen Eine weitere verblüffende Entwicklung war JOSS“, das ” JOHNNIAC Open Shop System“ – eines der ersten interaktiven ” Timesharingsysteme überhaupt, dessen erste Version 1963 fertig gestellt wurde. Die beiden folgenden Abbildungen zeigen einen JOSS-Nutzer (nach [Gruenberger 1968][S. 20]) sowie das Protokoll einer typischen JOSS-Sitzung (nach [Shaw 1965][S. 5]): 68/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
JOSS-Anwender 5. Einige frühe Hochsprachen 69/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
JOSS-Beispiel 5. Einige frühe Hochsprachen (Siehe [Shaw 1965][S. 5].) 70/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Lessons learned 5. Einige frühe Hochsprachen Lessons learned: Nur, weil eine Programmiersprache schon alt ist – APL blickt auf über 50 Jahre Entwicklung zurück –, heißt dies noch lange nicht, dass man nichts von ihr lernen könnte. APL ist hinsichtlich seiner Ausdrucksstärke und damit auch Prägnanz bis heute eigentlich unübertroffen! Viele Probleme, die man traditionell mit einer Schleife lösen würde, lassen sich mit einem anderen Ansatz ohne Schleifen, ohne Bedingungen etc. lösen – solche Ansätze sind nicht nur interessant, sondern oftmals sicherer! Unsere heutigen Shells etc. basieren zu einem großen Teil auf JOSS. Es ließen sich noch viel mehr interessante Beispiele aufzählen, aber das wäre eigentlich Stoff für ein ganzes Semester. . . 71/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
6. Literatur und Poesie Literatur und Poesie 72/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Literatur und Poesie 6. Literatur und Poesie Nun noch ein kleiner Ausblick auf Literatur und Poesie: Ist beides auch in Programmiersprachen möglich? Ja! Wer einmal ein schönes Programm gelesen hat, weiss, dass Programme durchaus Literatur sein können. John Bentley fragte einmal Folgendes: “When was the last time you spent a pleasant evening in a comfortable chair, reading a good program?”21 Donald E. Knuths The Art of Computer Programming ist nicht nur aus algorithmischer Sicht hochinteressant und spannend, sondern auch einfach eine Fundgrube schönen Codes. . . Und Poesie? 21 See [Bentley 1986]. 73/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Perl Poetry 6. Literatur und Poesie # Black Perl, adapted for Perl 5 by Jonadab. # Adapted from Black Perl, as seen in the Camel, # 2nd ed., p 553 BEFOREHAND: close door, each window & exit; wait until time; open spell book; study; read (spell, $scan, select); tell us; write it, print the hex while each watches, reverse length, write again; kill spiders, pop them, chop, split, kill them. unlink arms, shift, wait and listen (listening, wait). sort the flock (then, warn "the goats", kill "the sheep"); kill them, dump qualms, shift moralities, values aside, each one; die sheep; die (to, reverse the => system you accept (reject, respect)); next step, kill next sacrifice, each sacrifice, wait, redo ritual until "all the spirits are pleased"; do it ("as they say"). do it(*everyone***must***participate***in***forbidden**s*e*x*). return last victim; package body; exit crypt (time, times & "half a time") & close it. select (quickly) and warn next victim; AFTERWARDS: tell nobody. wait, wait until time; wait until next year, next decade; sleep, sleep, die yourself, die @last . . . es wurde sogar eine Poetry Optimization“ in Perl eingeführt, ” um Perl Poetry zu vereinfachen. . . 74/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
7. Ausblick Ausblick 75/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Ausblick 7. Ausblick Was lässt sich zusammenfassend feststellen und raten? Programmiersprachen haben einen immensen Einfluss darauf, wie man die Welt wahrnimmt und beschreibt. Wenn man nur einen Hammer hat, sieht jedes Problem wie ” ein Nagel aus!“, d.h. man sollte mehr als einen Hammer in seinem Werkzeugkasten haben (und keinen Vorschlaghammer nutzen, wenn eine Fliegenklatsche genügt). Welche Sprachen sollte man wenigstens in Grundzügen kennen, um ein guter Programmierer zu werden (das ist notwendig, nicht hinreichend!)? Mindestens eine imperative Sprache: C, Fortran, . . . Mindestens eine OO-Sprache: C++, C#, Java (, Simula), . . . Mindestens eine dynamische Sprache: Perl, Python, . . . LISP oder Scheme Prolog APL Forth 76/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Ratschläge 7. Ausblick Ratschläge an die nächste Programmierergeneration: Lassen Sie sich nicht von Managern einreden, dass Java für jeden Anwendungsfall das geeignete Mittel ist (meiner Meinung nach ist Java eigentlich für keinen Anwendungsfall das geeignete Mittel, aber das nur am Rande). Seien Sie multilingual! Spielen Sie mit unterschiedlichen Sprachparadigmen (apropos Spielen“: Lesen Sie beispielsweise [Barski 2011]. :-) ). ” Entwickeln Sie einmal selbst eine Sprache – nicht nur den x-ten Compiler für PL/0 oder etwas in der Art. Vergessen Sie nie, dass Sie für eine Maschine mit sehr begrenzten Ressourcen programmieren! Programmieren Sie eine Sprache so, wie es ihr angemessen ist! Nichts ist schlimmer als das FORTRAN in any ” language“-Syndrom! 77/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Vielen Dank! 7. Ausblick Vielen Dank für Ihre Aufmerksamkeit! (Der Autor kann unter ulmann@vaxman.de erreicht werden.) 78/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
8. Bibliographie Bibliographie 79/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Bibliographie 8. Bibliographie [Barski 2011] Conrad Barski, LAND OF LISP – Learn to Program ” in Lisp, One Game at a Time!“, no stach press, San Francisco, 2011 Jon Bentley, “Programming pearls: literate programming”, in Communications of the ACM, Volume 29, Issue 5, May 1986 [Dean 1996] C. N. Dean, M. G. Hinchey (Eds.), Teaching and Learning Formal Methods, Academic Press, 1996 [Dotzler 1996] Bernhard Dotzler (Hrsg.), Babbages ” Rechen-Automate“, Springer-Verlag, 1996 [Focke 1962] Joachim Focke, Distributionen und ” Heaviside-Kalkül“, in Wissenschaftliche Zeitschrift der Karl-Marx-Universität Leipzig, 11. Jahrgang, 1962, S. 627–629 80/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Bibliographie 8. Bibliographie [Gruenberger 1968] F. J. Gruenberger, The History of the ” JOHNNIAC“, The RAND Corporation, MEMORANDUM TK-5654-PR, October 1968, http://www.rand.org/pubs/ research memoranda/2005/RM5654.pdf [IBM 1955] IBM, 650 – magnetic drum data-processing machine, ” manual of operation“, International Business Machines Corporation, 1955, Form 22-6060-1 [Jacobs 1986] John F. Jacobs, The SAGE Air Defense System – A ” Personal History“, The MITRE Corporation Bedford, Massachusetts, 1986 [Menabrea 1842] L. F. Menabrea, Sketch of the Analytical Engine ” Invented by Charles Babbage“, Bibliothéque Universelle de Genéve, October, 1842, No. 82 81/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Bibliographie 8. Bibliographie [Neugebauer 1969] O. Neugebauer, Vorlesungen über Geschichte der antiken mathematischen Wissenschaften, Erster Band, Vorgriechische Mathematik, Zweite, unveränderte Auflage, Springer-Verlag, 1969 [Perlis et al. 1958] A. J. Perlis, J. W. Smith, H. R. VanZoeren, INTERNAL TRANSLATOR (IT) A COMPILER FOR THE 650“, ” Computation Center Carnegie Institute of Technology, 1958 [Reich 2010] Ulrich Reich, Wer hat das Gleichheitszeichen ” erfunden?“, in Forschung aktuell 2010, Hochschule Karlsruhe Technik und Wirtschaft, S. 79–80 [Reynolds, Tymann 2008] Carl Reynolds, Paul Tymann, Principles ” of Computer Science“, Schaum’s Outlines of Principles of Computer Science, McGraw-Hill, 2008 82/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Bibliographie 8. Bibliographie [Santayana 1906] George Santayana, The Life of Reason or the ” Phases of Human Progress“, Vol. 1 of 4 ( Introduction and Reason ” in Common Sense“), London, Archibald Constable & Co. Ltd., 1906, S. 284 [Shaw 1965] J. C. Shaw, JOSS: EXPERIENCE WITH AN ” EXPERIMENTAL COMPUTING SERVICE FOR USERS AT REMOTE TYPEWRITER CONSOLES“, THE RAND CORPORATOIN, P-3149 [Wittgenstein 1945] Ludwig Wittgenstein, Philosophische Untersuchungen, http://www.geocities.jp/mickindex/ wittgenstein/witt pu gm.html, retrieved 24.07.2013 83/83 Der Zoo der Programmiersprachen – Prof. Dr. Bernd Ulmann 22. Januar 2014
Sie können auch lesen