Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
A++ ist eine Programmiersprache, die an Minimalismus nicht zu übertreffen ist. Ihr einziger Zweck ist es, an der Programmierung Interessierten zu helfen, so schnell und effizient wie nur möglich das Wesentliche der Programmierung zu erfassen. In verhältnismäßig kurzer Zeit werden Denkmuster eingeübt, die einen befähigen, sich müheloser in die großen populären Programmiersprachen einzuarbeiten, um in ihnen produktiv werden zu können. In diesem Buch wird eine Erweiterung von A++ vorgestellt, die einer neuen Programmiersprache entspricht (mit Compiler und virtueller Maschine) in der die Funktionalität von Scheme, Python, Java, C++ und C enthalten ist. Dies ist möglich, da in ARS++ eine Schnittstelle zu den anderen Sprachen namens ARSAPI eingebaut ist. Nicht nur ein A++-Interpreter wird zur Verfügung gestellt, sondern auch ein ARS++-Compiler und ein Interpreter für die virtuelle Maschine (AVIM). Auch dieses Buch enthält im Anhang eine Einführung in das Lambda-Kalkül von Alonzo Church. Das Buch wendet sich an alle Personen, die sich mit dem Erlernen der Kunst der Programmierung befassen. Dies sind vor allem Lehrende und Lernende an Hochschulen und den Oberstufen von Gymnasien in den Fachbereichen der Informatik, der Mathematik und der Physik.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 339
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Georg P. Loczewski
A++ mit einer Schnittstelle zu anderen Programmiersprachen
Mit einer Einführung in das Lambda-Kalkül
Copyright c 2018 Georg P. Loczewski
Von A++ nach ARS++
A++ mit einer Schnittstelle zu anderen Programmiersprachen
1. Auflage 2018 –Hamburg
Verlag & Druck: tredition GmbH
ISBN
978-3-7469-3643-7 (Paperback)
978-3-7469-3644-4 (Hardcover)
978-3-7469-3645-1 (e-Book)
Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollst ändig ausgeschlossen werden. Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung, noch irgendeine Haftung übernehmen.
Für Verbesserungsvorschl äge und etwaige Hinweise auf Fehler sind Verlag und Autor dankbar. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zul ässig.
Das Werk einschließlich all seiner Teile ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzul ässig und strafbar. Das gilt insbesondere für Verfielf ältigungen, Übersetzungen, Mikroverfilmungen und die Einspeisung, Verarbeitung und Verbreitung in elektronischen Systemen.
Meiner Frau Ursulaund meinen Söhnen Thomas und Johannes in Liebe gewidmet
Dieses Buch ist basiert auf dem 1032-seitigen Buch ‘Programmierung pur’, das in der 2. erweiterten Auflage von demselben Autor im Verlag S.Toeche-Mittler in Darmstadt im Jahre 2003 veröffentlicht wurde. Die 1. Auflage erschien im Jahre 2002. (Siehe [56].), [55]).
Die Eigenschaften von A++ werden in verschiedenen Büchern in dieser Reihe vorgestellt, jedesmal mit einem anderen Schwerpunkt. Das vorliegende Buch wird unter Punkt 4 in der folgenden Liste beschrieben.
1. In A++ Die kleinste Programmiersprache der Welt[58] geht es darum, die theoretischen Grundlage dieser Sprache zu präsentieren und die Mächtigkeit von A++ aufzuzeigen.
2. In dem 2. Buch Programmieren lernen mit A++[61] ist auch eine Einführung in A++ enthalten, der Fokus des Buches liegt aber darauf zu zeigen, wie in den anwendungsorientierten Programmiersprachen Python und Java A++-orientiert programmiert werden kann.
In der englischsprachigen Ausgabe A++ The Smallest Programming Language in the World wird außerdem die Programmiersprache Perl und die A++-orientierte Programmierung in dieser Sprache erläutert.Siehe: [59]!
3. In dem 3. Buch A++ und systemnahe Programmiersprachen[60] liegt der Schwerpunkt darauf, aufzuzeigen, wie auch in den Programmiersprachen C und C++ A++-orientiert programmiert werden kann.
4. In dem 4. Buch Von A++ nach ARS++[62] wird schließlich eine Erweiterung von A++ vorgestellt, die einer neuen Programmiersprache entspricht (mit Compiler und virtueller Maschine) in der die Funktionalität von Python, Java, C++ und C enthalten ist. Dies ist mglich, da in ARS++ eine Schnittstelle zu den anderen Sprachen namens ARSAPI eingebaut ist.
Die Werkzeuge und Hilfsmittel zu diesem Buch werden in einem Download-Verzeichnis im Internet bereitgestellt. Siehe: B.3 auf Seite 397.
Das Buch stellt auf einfache Weise die Grundlagen der Programmierung auf der Basis des Lambda-Kalküls vor. In dem Bemühen, Programmierung aus der Sicht des Lambda-Kalküls zu verstehen, geht es darum, das Wesentliche der Programmierung zu erfassen und uns davor zu bewahren, uns von einer Unzahl von Vorschriften und Regeln einer bestimmten Programmiersprache die Programmierung an sich vergraulen zu lassen. Es wird hier dank des Lambda-Kalküls eine Sicht der Programmierung gewonnen, die eine befreiende Wirkung hat. Das Denken wird aus den Niederungen des komplexen Regelwerks einer bestimmten Programmiersprache herausgeholt und heraufgehoben auf die Höhen eines einfacheren, umfassenderen und deshalb mächtigeren Denkens. Das Lambda-Kalkül bietet die theoretische Grundlage für eine solche Sicht.
Die meisten Bücher, die die Thematik des Lambda-Kalküls aufgreifen, münden ein in die funktionale Programmierung und wenden sich ausschließlich den rein funktionalen Sprachen zu. Imperative oder objekt-orientierte Sprachen finden in solchen Büchern keine Berücksichtigung. In diesem Buch wird gezeigt, dass die drei Grundoperationen des Lambda-Kalküls, nämlich Abstraktion, Referenz und Synthese, so allgemein sind, dass sie in fast jeder Programmiersprache angewandt werden können. Diese Grundoperationen mögen zwar sehr trivial und abstrakt klingen, sie verändern jedoch die Denkweise und die Art zu programmieren sehr.
Erstaunlicherweise scheint die Programmierung als solche eine große Verwandtschaft mit der Kunst zu haben. In beiden menschlichen Aktivitäten wird die einen umgebende Wirklichkeit wahrgenommen und Abstraktionen dieser Wirklichkeit gebildet und in sich aufgenommen. Das Abstrahieren wird besonders deutlich in der urmenschlichen Aktivität der Namensvergabe. Mit der Bildung eines Namens wird eine Abstraktion vorgenommen. Der Name steht für die Wirklichkeit. Von allen Details dieser Wirklichkeit wird mit der Namensbildung abstrahiert. Die so gebildeten vielfältigen, ja unzähligen Abstraktionen werden vom Künstler wie vom Programmierer je nach Eigenart der Person gegebenenfalls neu zusammengesetzt. Es entsteht etwas Neues, mitunter etwas noch nie Dagewesenes. Diese Operation nennen wir Synthese oder auch Applikation. Die Bezugnahme auf die Abstraktionen der Wirklichkeit bezeichnen wir als Referenz.
Hiermit haben sich drei Grundoperationen herauskristallisiert, die das künstlerische Schaffen charakterisieren, so wie das der Programmierer.
Abstraktion: Etwas einen Namen geben.
Referenz: Auf etwas mit seinem Namen Bezug nehmen.
Synthese: Zwei oder mehrere Abstraktionen miteinander verknüpfen und dadurch eine neue Abstraktion bilden.
Was für ein Zufall, dass die ersten Buchstaben dieser drei Begriffe tatsächlich das Wort Kunst ergeben, nämlich in der lateinischen Sprache, einer der beiden Muttersprachen unseres abendländischen Kulturraumes: ARS! Die Kunst besteht nun darin, sinnvolle Abstraktionen zu bilden und ebenso sinnvolle Synthesen vorzunehmen.
Dass mit diesen drei Grundoperationen ein mathematisch-logisches System aufgebaut werden kann, hat der amerikanische Logiker Alonzo Church 1941 bereits in seinem Werk: The Calculi of Lambda Conversion bewiesen. Seine Theorie ist unter dem Namen Lambda Calculus oder auf deutsch Lambda-Kalkül bekannt geworden. Siehe auch hierzu [5].
Dass auf dieser Grundlage auch programmiert werden kann, ist in verschiedenen Büchern der Informatik ebenfalls bewiesen worden. Siehe hierzu [48],[47] und [13]. Wer mit der Kargheit dieser drei Grundoperationen gelernt hat umzugehen, sich sozusagen bewährt hat, der kann sich gestatten, ein paar weitere Primitivoperationen bzw. Syntax-Elemente hinzuzunehmen, um sich das Leben etwas zu versüßen. Dies haben Guy L. Steele und Gerald J. Sussman 1975 am MIT gemacht und so die Programmiersprache Scheme geschaffen.
Genau genommen stellt ARS eine Verallgemeinerung des Lambda-Kalküls dar. Die Verallgemeinerung besteht darin, dass der Begriff der Abstraktion allgemeiner als im Lambda-Kalkül definiert wird, nämlich als ’etwas einen Namen geben’. Hinter dem Namen verbergen sich alle Details des Definierten. Eine solche Namensvergabe setzt eine explizite Namensdefinition voraus.
Im Lambda-Kalkül dagegen ist eine explizite Vergabe eines Namens für eine Lambda-Abstraktion bei deren Bildung nicht vorgesehen. Dort erfolgt sie lediglich implizit bei einer Synthese von Lambda-Ausdrücken.
Die Auswirkungen dieses zunächst als klein erscheinenden Unterschiedes sind gewaltig: Während ein Ausbau des Lambda-Kalküls immer in die Funktionalen Programmiersprachen mündet, können mit ARS allgemeine Muster der Programmierung definiert werden, die sowohl auf die Funktionale Programmierung als auch auf die Objekt-orientierte und die Imperative Programmierung angewandt werden können.
Wer sich in seinem Programmieren von den in ARS formulierten Prinzipien leiten lässt, wird Programme erstellen, die nicht nur funktionieren, sondern die auch schön sind, Programme, bei denen der Leser mit Bewunderung die Abstraktionen und Synthesen nachempfinden und genießen kann.
Dass es möglich ist, ausgehend von den drei aufgezeigten Grundoperationen zu programmieren, und zwar ausschließlich auf ihnen aufbauend, wird im Teil 2 des Buches ausführlich aufgezeigt. Hier wird ARS als die kleinste Programmiersprache der Welt mit dem Namen A++ unter dem Gesichtspunkt der Sprache an sich und dem ihrer Anwendung vorgestellt. Der Name A++ ergibt sich ganz von selbst aus ARS: Abstraction + Reference + Synthesis.
A++ wird eingeführt als das universale Instrument zum Erlernen der Programmierung, das uns mit dem Wesentlichen der Programmierung konfrontiert und uns hilft diese Konfrontation zu meistern.
Nach intensiver Auseinandersetzung mit dem, was Programmierung im Wesentlichen ist, stellen wir uns den Problemen der Programmierpraxis. Um diese Konfrontation bestehen zu können müssen wir A++ ausbauen zu einem Instrument der Praxis, d.h. zu einer Programmiersprache, die den Anforderungen der Programmierpraxis genügt.
Diese neue Konfrontation führt uns zu ARS++, einer Programmiersprache, die auf ARS basiert, die Funktionalität der Programmiersprache Scheme einschließt und durch Zusätze Scheme übertrifft. Der Name ARS++ ist abgeleitet aus ARS +Scheme+Extensions.
Es sei noch kurz angesprochen, warum statt ARS++ nicht Scheme selbst als Programmiersprache in diesem Buch eingesetzt wurde. Scheme ist eine wunderbare Programmiersprache, aber leider sind in der Sprache selbst für die Programmierpraxis wichtige Randzonen nicht geregelt.
Die verschiedensten Scheme-Implementierungen versuchen nun auf ihre Weise Ergänzungen vorzunehmen, wie wir das ja auch in ARS++ getan haben. Leider scheint es jedoch keine Scheme-Implementierung zu geben, die all die Bereiche abdeckt, die wir in den Fallstudien benötigen und die außerdem noch auf allen Plattformen zur Verfügung steht und schließlich auch noch freie Software ist.
So waren wir gezwungen ARS++ zu kreieren mit den zusätzlichen Vorteilen der vollen ARS-Kompatibilität, der Offenheit und Nachvollziehbarkeit der Implementierung und der sich daraus ergebenden Ergänzungsmöglichkeit nach einem bereits vorgegebenen Muster.
ARS und die anderen Sprachen
Ein weiteres Hauptthema von ‘A++ in Theorie und Praxis’ ist die Auswirkung der sich in ARS manifestierenden Denkweise auf den Umgang mit den großen wohl etablierten Programmiersprachen.
Es wird Wert darauf gelegt aufzuzeigen, dass selbst das Lernen von neuen Programmiersprachen nach einer Intensivschulung in A++ um ein Vielfaches erleichtert wird und schneller zu Produktivität in der neuen Sprache führt.
Für diese neue Konfrontation wurde in diesem Buch die Programmiersprache Java ausgewählt. In dem Buch ‘Programmierung pur’[56] (ISBN 3-87820-108-7), das vom selben Autor im Jahre 2003 im S.Toeche-Mittler Verlag veröffentlicht wurde, werden ebenso folgende Programmiersprachen berücksichtigt: C, C++, Python und Perl.
Für die Auswahl der Sprachen in den beiden Büchern waren folgende Überlegungen entscheidend:
1.Java ist die populärste Programmiersprache.
2.Python ist eine relativ junge Sprache, die sich auszeichnet durch ein hohes Maß an Einfachheit, Mächtigkeit, Flexibilität und Dynamik. Außerdem gibt es für Python Anwendungsbeispiele aus fast allen Gebieten und eine überaus reichhaltige Bibliothek von Funktionen und Klassen. All dies ist im Quellcode verfügbar.
3.Perl Es hat sich gezeigt, dass es sinnvoll ist die Programmiersprache Perl ebenfalls in diesem Buch zu berücksichtigen, da sie nicht nur eine von Systemadministratoren sehr geschätzte Skriptspache ist und als Internetsprache ebenso weite Verbreitung gefunden hat, sondern auch deswegen, weil in ihr die wesentlichen Gedanken dieses Buches direkt umgesetzt werden können. Man kann sagen, dass ’Perl’ eine Lambda-Sprache ist.
4.C++ ist die Programmiersprache, die heutzutage meistens gewählt wird, wenn es darum geht, große Anwendungspakete zu erstellen, bei denen Effizienz eine hohe Priorität besitzt.
5.C ist die Sprache, aus der C++ entstanden ist, der Sprache Nr. 1, wenn es darum geht, systemnahe Software, wie Betriebssysteme (z.B. Linux-Kernel, Compiler etc) zu programmieren, oder wenn Effizienz der Anwendung unverzichtbar an erster Stelle steht.
Die Programmiersprache C ist nun mal die Sprache mit der größten Maschinennähe und damit die Sprache, in der die Computer-Ressourcen am besten genutzt werden können. Das was ihr fehlt ist die Nähe zu den zu programmierenden Anwendungen. Diese Verbindung schafft ARSAPI.
In ARS geht es nur um die Lösung der Probleme. In ARS wird abstrahiert von dem Computer und der Syntax irgendeiner Sprache. ARSAPI schlägt die Brücke zwischen beiden extremen Polen. Mit Hilfe von ARSAPI ist es möglich auf einfache Weise in C objekt-orientiert und funktional zu programmieren ohne viel von der Effizienz der Sprache aufzugeben.
Primäre Zielgruppe
Das Buch wendet sich an Programmierer und solche, die es werden wollen. Es möchte ihnen mit der speziellen Denkweise die Programmierung erleichtern, besonders auch das Erlernen neuer Sprachen. Mit der nahe gelegten Sicht der Programmierung wird eine Sprachenunabhängigkeit gewonnen, ja man ist sogar offen für verschiedene Paradigmen der Programmierung. Mit der Erfahrung der gewonnenen Flexibilität ausgerüstet wird ein Programmierer oder eine Programmiererin mit mehr Freude und größerer Effizienz die Probleme der Programmierung meistern.
Das Buch wendet sich auch an Anfänger der Programmierung. Jedoch sollte ein großes Interesse für die Programmierung aufgrund einer persönlichen Eignung und Neigung vorhanden sein.
Zusammenfassend ist die primäre Zielgruppe des Buches wie folgt zu beschreiben:
Das Buch ist gedacht für Menschen, die einen Ausbildungsbedarf in den Grundlagen der Programmierung besitzen.
• Dies sind Studenten aller Fachrichtungen der Informatik sowie Studenten der Mathematik und Physik.
• Dies sind ferner alle Angestellten in der Industrie, die sich, aus welchen Gründen auch immer, mit der Programmierung auseinandersetzen müssen.
•Programmierer, die bereits programmieren können, sich aber nicht scheuen, etwas Neues kennen zu lernen, kommen als potentielle Nutznießer von ‘A++ im großen Stil’ gewiss ebenfalls in Betracht.
Sekundäre Adressaten
• In Fachkreisen gilt das Lehrbuch der Informatik vom Massachusetts Institute of Technology (MIT), das legendäre SICP-Buch, als eines der besten Lehrbücher der Informatik. An den deutschen Hochschulen wird dieses Buch zwar empfohlen, aber die Vorlesungen orientieren sich meistens nicht an ihm, sodass viele Studenten entmutigt werden, sich mit dem Buch auseinander zu setzen.
Hier könnte ‘A++ in Theorie und Praxis’ eine Lücke füllen. Es ist einfacher, grundlegender und nicht so komplex wie das SICP-Buch, geht aber in dieselbe Richtung, nämlich vom Lambda-Kalkül her die Programmierung aufzubauen. Dazu kommt der größere Bezug zur Praxis durch die gleichzeitige Anwendung der Grundlagen auf fünf Programmiersprachen und die vier großen Fallstudien.
1. Die erste Fallstudie ist ein A++ – Interpreter. Dies ist ein Programm, das A++ – Programmcode auswertet. Diese Fallstudie ist in diesem Buch in ARS++ implementiert1wird auch die Implementierung in Perl, Python, Java, C++ und C vorgestellt. Der ARS-Interpreter soll nicht nur dazu dienen, die A++ – Beispiele nachvollziehen zu können, sondern ist gleichzeitig eine Anwendung der ARS-gemäßen Programmierung in der jeweiligen Zielsprache.
2. Die zweite Fallstudie ist in Java implementiert und besteht aus einem Applet (”OntoSimula“), das das Leben mehrerer Philosophen simuliert. Die Fallstudie enthält ein eigenes dynamisches Objektsystem, das die Möglichkeiten des statischen Standard-Objektsystems von Java (das allerdings mitbenutzt wird), weit übersteigt. Diese Dynamik im Objektsystem ist gefordert, wenn es darum geht, ein lebendiges System zu simulieren, in dem es Wachstum, Veränderung, Altern und Ähnliches gibt.
Auf die Frage: „Was bringt es dem Leser oder der Leserin dieses Buch zu lesen; welchen Nutzen kann man aus ihm ziehen?“, können folgende Punkte eine Antwort geben:.
• Das Lesen von ‘A++ in Theorie und Praxis’ schafft eine Vertrautheit mit den drei Paradigmen der Programmierung, nämlich mit der funktionalen Programmierung, der objektorientierten Programmierung und der imperativen Programmierung. Leser können später selbst entscheiden, welcher Programmierstil im konkreten Fall zu bevorzugen ist. Konkreter Fall ist hier nicht identisch mit irgendeinem Projekt, denn selbst innerhalb eines Programmes kann ‘hier’ der eine Stil und ‘dort’ ein anderer Stil zu empfehlen sein.
• Da die in ‘A++ in Theorie und Praxis’ vermittelten Grundlagen der Programmierung sehr allgemein gehalten sind, kann man sie in den meisten Programmiersprachen anwenden. Das bedeutet, dass Leserinnen und Leser neue Programmiersprachen leichter erlernen werden, weil sie die in ‘A++ in Theorie und Praxis’ aufgezeigten Muster der Programmierung in den neuen Sprachen lediglich zum Ausdruck bringen müssen.
Diese Muster der Programmierung sind sehr einfach, aber dennoch umfassend und mächtig. Mit ihnen können die meisten Programmieraufgaben gelöst werden.
• In ‘A++ in Theorie und Praxis’ lernt man nebenbei, sich ein eigenes Objektsystem aufzubauen. Diese Technik kann sehr hilfreich sein beim Umgang mit Programmiersprachen, die nicht objekt-orientiert sind.
>Dieses Objektsystem ist außerdem noch ein dynamisches Objektsystem. Angewandt auf die Programmiersprache Java bedeutet dies eine Erweiterung und Bereicherung des Standard-Objektsystems.
Die solide Grundlage des Lambda-Kalküls wird in ein Grundlagenstudium der Programmierung integriert,
•ohne, dass eine Fixierung auf spezielle funktionale Programmiersprachen erfolgt
• und ohne, dass dieser Versuch in eine Mathematisierung der Programmierung mündet.
In anderen Büchern wird funktionale Programmierung meistens nur im Zusammenhang mit einer ganz speziellen komplexen Programmiersprache, wie z.B. Haskell eingeführt und das Lambda-Kalkül wird, wenn es überhaupt als theoretische Grundlage für die funktionale Programmierung erwähnt wird, immer als logisch-mathematisches System gesehen und entsprechend in mathematischer Notation präsentiert. Es steht auf einem hohen mathematischen Podest, das immer noch für viele Programmierer abschreckend wirkt.
In ’A++ in Theorie und Praxis ’ dagegen werden die Grundoperationen des Lambda-Kalküls, Abstraktion, Referenz und Synthese als einfache grundlegende Programmiersprache mit Programmbeispielen und einem eigenen ARS-Interpreter vorgestellt.
Es ist somit die besondere Leistung dieses Buches, Programmierern und Programmiererinnen den Schrecken vor dem Lambda-Kalkül zu nehmen und letzteres nutzbar zu machen für den Prozess des Erlernens der Kunst des Programmierens.
Die Zielgruppe für dieses Kapitel und das ganze Buch ist somit nicht eine kleine elitäre Gruppe von Wissenschaftlern, sondern alle Studenten und Studentinnen der Informatik, weil es hier um die Grundlagen der Programmierung geht, auf einem Niveau von Programmierern und nicht von Mathematikern.
Dieses Buch wurde auf dem PC erstellt mithilfe qualitativ erstrangiger Software-Tools, die vongroßen Idealistender Weltfreizur Verfügung gestellt wurden. Die primären Werkzeuge2 sind:
1. Das 1982 von Donald E. Knuth veröffentlichte Textsatzsystem TEX und das 1984 von Leslie Lamport dazu entwickelte Makropaket LATEX.
2. Die von Thomas Esser (Universität Hannover) für Linux erstellte Implementierung des Tex/Latex-Systems teTeX.
3. Das von Linus Thorvalds (Universität Helsinki) 1991 geschaffene PC-Betriebssystem Linux
4. Das X Window System für Linux XFree86 mit den vielfältigen Window-Managern und Desktop-Environments (z.B. fvwm SuSE-Desktop, kde, gnome).
5. Die programmierbaren Texteditoren elvis und vim, die von Steve Kirkendall bzw. von Bram Moolenaar entwickelt wurden.
6. Die von Brian Fox (Free Software Foundation) und von Chet Ramey (Case Western Reserve University) erstellte bash (Bourne Again Shell).
7. Das von Tomas Rokicki (Stanford University) erstellte Konvertierungsprogramm dvips zum Erstellen eines Postscript-Dokumentes aus den von TEX gelieferten dvi-Dokumenten und die von Angus J.C. Duggan zum Manipulieren von Postscript-Dokumenten (Skalieren der Seiten, Anordnung der Seiten in Faszikeln, etc.) erstellten Werkzeuge psutils.
8. Das von Timothy O. Theisen (University of Wisconsin-Madison) erstellte Programm ghostview zum Visualisieren und Drucken von Postscript-Dokumenten.
9. Das von Carsten Heinz erstellte LATEX-Makro-Paket listings.dtx zum Formatieren von Programmlisten für die meisten Programmiersprachen.
10. Das von Nikos Drakos (University of Leeds) ursprünglich erstellte und von Ross Moore (Macquerie University, Sydney) sowie Marek Rouchal (Infineon Technologies AG, München) weiterentwickelte Programm latex2html LATEX-Dokumente in HTML übersetzt werden können.
Mein besonderer Dank gilt denjenigen, die Scheme geschaffen haben, nämlich Guy L. Steele und Gerald J. Sussman, sowie den vielen Autoren, die so ausgezeichnete Bücher über Scheme und andere Programmiersprachen geschrieben haben, wie Jacques Chazarain, mit seinem Buch Programmer Avec Scheme, das ich für mich persönlich als eines der besten Lehrbücher der Informatik halte, sowie Peter Norvig und Samuel N. Kamin. (Siehe hierzu [13], [70] und [48]).
Alonzo Church, dem wir das Lambda-Kalkül verdanken, sei ganz besonderer Dank, obwohl er selbst natürlich nichts davon ahnte, dass er einen so großen Beitrag zur Informatik leistete, dass er für die Theorie der Programmiersprachen eine Grundlage geschaffen hatte. Der Dank erstreckt sich selbstverständlich auch auf alle anderen Autoren, die in dem bibliographischen Anhang aufgeführt sind.
Auch Brent Benson gebhrt mein Dank, der es mir ermöglicht hat mit Hilfe seiner Bibliothek ‘libscheme’ die Programmiersprache ARS++ zu schaffen, die aus A++ mit Hilfe der vorgegebenen, aus libscheme importierten Primitivoperationen, eine Programmiersprache der Praxis macht, angereichert durch über Scheme und ‘libscheme’ hinausgehende Erweiterungen, um so den praktischen Anforderungen der Fallstudien voll gerecht werden zu können.
Ähnlichen Dank schulde ich Hans J. Boehm, der mit seinem ‘black-box’ Garbage-Collector für C und C++ Programme, die Komplexität der Fallstudien für dieses Buch auf ein vertretbares Maß herunterschrauben half.
Was wäre schließlich die Welt ohne Richard Stallman, dem wir Programmierer nicht nur den Emacs sondern auch den GNU-C-Compiler verdanken und all den Reichtum, den die von ihm gegründete Free Software Foundation der Welt anzubieten hat! Auch dieses Buch hätte ohne ihn und die vielen Programmierer, die ihre Software als freie Software veröffentlichen, nicht realisiert werden können!
Möge dieses Buch Programmierern das Faszinierende von ARS entdecken helfen und sie zu einem souveränen Umgang mit den Elementarteilchen der Programmierung führen und sie dadurch befähigen, mit größerer Freude und Produktivität die Herausforderungen der Programmierung zu meistern.
Georg P. Loczewski
Groß-Zimmern, im Mai 2018
1 Abstraktion
2 Referenz
3 Synthese
4 Funktion
5 Nebeneffekte
6 Klasse von Funktionen
7 Modularisierung
8 Objekt-Orientierung
9 Klassenvariable
10 Instanz einer Klasse
11 Exemplar einer Klasse
12 Objekt
13 Instanzvariable
14 Methoden von Objekten
15 Attribute von Objekten
16 Pakete in Java
17 Definition von Variablen
18 Definition von Funktionen
19 Erzeugung von Objekten
20 Zuweisung von Werten
21 Testen von Werten
22 Einfache Auswahlstruktur
23 Allgemeine Auswahlstruktur
24 Wiederholung von Operationen
25 DOUNTIL-Struktur
26 DOWHILE-Struktur
27 Atom
28 Zusammengesetzte Daten
29 Listen
30 Dictionaries
31 Assoziative Listen
32 Hash-Tabellen
33 Vektoren
34 Abstraktion
35 Referenz
36 Synthese
37 Closure
38 Lexical Scope
39 Klasse von Funktionen
40 Klassenvariable
41 Instanz einer Klasse
42 Exemplar einer Klasse
43 Objekt
44 Instanzvariable
45 Methoden von Objekten
46 Attribute von Objekten
47 Special-Form in ARS++
48 Makros in ARS++
49 Etwas einen Namen geben (ARS++)
50 Lambda-Abstraktion in ARS++
51 Nebeneffekte in ARS++
52 Closures in ARS++
53 Bildung von Klassen in ARS++
54 Erzeugung eines Objektes in ARS++
55 Senden einer Botschaft an ein Objekt in ARS++
56 Bildung von Makros in ARS++
57 Lexical Scope
58 Indefinite Extent
59 Closure
60 Testen von Werten in ARS++
61 Einfache Auswahlstruktur (if)
62 Allgemeine Auswahlstruktur (cond)
63 Allgemeine Auswahlstruktur (case)
64 Wiederholungsstruktur (while)
65 Rekursion
66 Atom in ARS++
67 Listen in ARS++
68 Funktionen höherer Ordnung in ARS++
69 Dictionaries in ARS++
70 Assoziative Listen in ARS++
71 Sequentielle Programmierung in ARS++
72 Logische Abstraktionen in ARS
73 Numerische Abstraktionen in ARS
74 Abstraktionen für Listen in ARS
75 Relationale Abstraktionen in ARS
76 Funktionen Höherer Ordnung in ARS
77 Imperative Programmierung in ARS
78 Objekt-Orientierte Programmierung in ARS(A++)
79 Syntax eines Lambda-Ausdrucks
80 Assoziativitätsregel für die Abstraktion
81 Assoziativitätsregel für die Applikation
82 Gebundene und freie Variable
83 Alpha-Konvertierung. 382 84 redex
85 Beta-Reduktion
86 Eta-Reduktion
87 Y-Kombinator
88 Dynamic Scope
89 Static Scope
90 Lexical Scope III
91 Indefinite Extent II
92 Dynamic Extent
93 Global Scope
94 Local Scope
1.1 Liste der Ein/Ausgabe-Funktionen
1.2 Liste einiger Relationalen Operationen
4.1 Funktionen der Klassen des ARS-Interpreters
2.1 Funktionsbegriff
2.2 Erweiterter Funktionsbegriff
2.3 Funktion mit Nebeneffekten
2.4 Klassenbegriff
2.5 Instanzbegriff
3.1 IFTHENELSE-Struktur
3.2 CASE-Struktur
3.3 DOUNTIL-Struktur
3.4 DOWHILE-Struktur
4.1 Paar-Struktur
4.2 “nil”
4.3 Liste mit einem Element
4.4 Liste mit zwei Elementen
4.5 Stuktur einer komplexen Liste
4.6 Wörterbuch oder assoziative Liste
1.1 Definition einer “closure”
1.2 Aufruf einer “closure”
2.1 A++
2.2 Vorgegebene Primitiv-Abstraktionen für A++
2.3 A++ mit vorgegebenen Primitiv-Abstraktionen
2.4 A++ mit primitiven Werten und Operationen sowie typischen Abstraktionen
4.1 Dictionary oder assoziative Liste
6.1 Klassenbegriff
6.2 Instanzbegriff
6.3 Klasse “account”
6.4 Konstruktor der Klasse “account”
6.5 Aufruf des Konstruktors “make-account”
6.6 Senden einer Botschaft an “acc1”
6.7 Ausführen der Methode “deposit”
6.8 Tierheim: Klassendiagramm
6.9 Bibliotheksverwaltung: Klassendiagramm
1.1 Struktur von ARS++ (erste Ausbaustufe)
1.2 Konstruktor der Klasse “account”
1.3 Aufruf des Konstruktors “make-account”
1.4 Senden einer Botschaft an “acc1”
1.5 Beantworten der Botschaft “deposit”
1.6 Implementierung einer Liste
1.7 Dictionary oder assoziative Liste
2.1 Struktur von ARS++ (zweite Ausbaustufe)
2.1 Bibliotheksverwaltung: Klassendiagramm
3.1 Eine Lösung des ‘Eight-Queens’-Problems
3.2 Multi-Tasking
4.1 Hauptfunktionen des ARS-Interpreters
4.2 Struktur der Funktion ‘ars-eval’
4.3 Funktion ars-apply
4.4 Funktion ‘make-closure’
4.5 Primitiv-Abstraktionen des ARS-Interpreters
1.1 ARS
1.2 ARSAPI
3.1 Datentypen in ARSAPI für Java
3.2 Struktur einer ‘Umgebung’ für Closures
4.1 Datentypen in ARSAPI für C
4.2 Struktur einer ‘Umgebung’ für Closures
5.1 ARSAPI für C++: Datentypen
5.2 Struktur einer ‘Umgebung’ für Closures
1.1 ARS++
1.2 Aufbau der AVIM-SECD-Maschine
1.3 Komplexe Alternativstruktur
1.4 Auflösung einer komplexen Alternativstruktur in ACOMP
1.5 Arbeiten mit Variablen in AVIM
1.6 Definition einer Umgebung in AVIM
1.7 Arbeiten mit Funktionen in AVIM
1.8 ‘Continuations’ in AVIM
1.9 Alternativ-Struktur in AVIM
1.10 Funktionsdefinition in AVIM
3.1 Erweitertes ‘Environment’-Konzept für ARSAPI
3.2 Struktur einer ‘Umgebung’ für CLAM’s
3.3 Kategorien von Funktionen in ARSAPI für C
3.4 CLAM: Verkapselung einer Abstraktion mit ihrer Umgebung
3.5 Erweitertes ARSAPI für C
6.1 Hauptfunktion von ACOMP
6.2 Makroauflösung in ACOMP
3.1 Grundlegende logische Abstraktionen
3.2 Anwendung der grundlegenden logischen Abstraktionen
3.3 Erweiterte logische Abstraktionen
3.4 Anwendung der erweiterten logischen Abstraktionen
3.5 Abstraktion ‘zero’
3.6 Abstraktion ‘one’
3.7 Abstraktion ‘two’
3.8 Abstraktion ‘zerop’
3.9 Anwendung der Abstraktion ‘zerop’
3.10 Abstraktion ‘three’
3.11 Abstraktion ‘compose’
3.12 Abstraktion ‘add’
3.13 Anwendung der Abstraktion ‘add’
3.14 Abstraktion ‘succ’
3.15 Anwendung der Abstraktion ‘succ’
3.16 Abstraktion ‘mult’
3.17 Anwendung der Abstraktion ‘mult’
3.18 Abstraktion ‘lcons’
3.19 Abstraktion ‘lcar’
3.20 Abstraktion ‘lcdr’
3.21 Anwendung der Basis-Operationen für Listen
3.22 Abstraktion ‘nil’
3.23 Beispiel für eine allgemeine Liste
3.24 Abstraktion ‘nullp’
3.25 Anwendung der Abstraktion ‘nullp’
3.26 Abstraktion ‘llength’
3.27 Anwendung der Abstraktion ‘llength’
3.28 Abstraktion ‘remove’
3.29 Anwendung der Abstraktion ‘remove’
3.30 Abstraktion ‘zeropair’
3.31 Abstraktion ‘pred’
3.32 Anwendung der Abstraktion ‘pred’
3.33 Abstraktion ‘sub’
3.34 Anwendung der Subtraktion
3.35 Abstraktion ‘equalp’
3.36 Anwendung der Abstraktion ‘equalp’
3.37 Abstraktion ‘gtp’
3.38 Anwendung der Abstraktion ‘gtp’
3.39 Abstraktion ‘ltp’
3.40 Anwendung der Abstraktion ‘ltp’
3.41 Abstraktion ‘gep’
3.42 Anwendung der Abstraktion ‘gep’
3.43 Abstraktion ‘Fakultaet’
3.44 Anwendung der Abstraktion ‘Fakultaet’
3.45 Abstraktion ‘sum’
3.46 Anwendung der Abstraktion ‘sum’
3.47 Abstraktion ‘compose’
3.48 Abstraktion ‘curry’
3.49 Abstraktion ‘map’
3.50 Anwendung der Abstraktion ‘map’
3.51 Abstraktion ‘mapc’
3.52 Abstraktion ‘filter’
3.53 Anwendung der Abstraktion ‘filter’
3.54 Abstraktionen ‘locate’ und ‘locatex’
3.55 Anwendung von ‘locate’ und ‘locatex’
3.56 Abstraktion ‘nth’
3.57 Anwendung der Abstraktion ‘nth’
3.58 Abstraktion ‘for-each’
3.59 Anwendung der Abstraktion ‘for-each’
3.60 Abstraktion ‘memberp’
3.61 Anwendung der Abstraktion ‘memberp’
3.62 Abstraktion ‘addelt’
3.63 Anwendung der Abstraktion ‘addelt’
3.64 Abstraktion ‘union’
3.65 Anwendung der Abstraktion ‘union’
4.1 Abstraktion ‘insert’
4.2 Anwendung der Abstraktion ‘insert’
4.3 Abstraktion ‘insertion-sort’
4.4 Anwendung der Abstraktion ‘insertion-sort’
4.5 Assoziative Listen in A++
4.6 Anwendung der Abstraktionen für assoziative Listen in A++
5.1 Abstraktion “while”
6.1 Erstes Beispiel: Klasse “account” für Bankkonten
6.2 Anwendung der Prozedur ‘konto’
6.3 Basisklasse für alle Klassen
6.4 Tierheim: Klasse ‘tier’
6.5 Tierheim: Klasse ‘hund’
6.6 Tierheim: Klasse ‘katze’
6.7 Tierheim: Klasse ‘tierheim’
6.8 Tierheim: Testlauf
6.9 Tierheim: Ausgabeprotokoll des Testlaufs
6.10 Basisklasse für alle Klassen
6.11 Bibliotheksverwaltung: Klasse ‘person’
6.12 Bibliotheksverwaltung: Klasse ‘author’
6.13 Bibliotheksverwaltung: Klasse ‘reader’
6.14 Bibliotheksverwaltung: Klasse ‘book’
6.15 Bibliotheksverwaltung: Klasse ‘library’
6.16 Bibliotheksverwaltung: Testlauf
6.17 Bibliotheksverwaltung: Ausgabeprotokoll des Testlaufs
8.1 Abstraktion ‘ndisp!’
8.2 Abstraktion ‘bdisp!’
8.3 Abstraktion ‘ldisp!’
8.4 Testen des Interpreters
8.5 Testen des Interpreters
8.6 Initialisierungsdatei für den ARS-Interpreter: ‘init.ars’
1.1 Etwas einen Namen geben
1.2 Lambda-Abstraktion
1.3 Bildung einer Funktion mit Namensvergabe
1.4 Anwendung einer Funktion I
1.5 Anwendung einer Funktion II
1.6 Basisklasse für alle Klassen
1.7 Basisklasse “account” für Bankkonten
1.8 Klasse “accounti” für zinsbringende Konten
1.9 Anwendung der drei Klassen
1.10 Einfacher Makro
1.11 Anwendung des Makros
1.12 Applikation
1.13 Globale Variable
1.14 Lokale Variable
1.15 Makro “letrec”
1.16 Special-Form “named-let” in Scheme
1.17 Übersetzung eines ‘named-let’ in ARS++
1.18 Erzeugung von Objekten
1.19 Zuweisung von Werten
1.20 Verknüpfung von Prädikaten
1.21 Einfache Auswahlstruktur
1.22 Allgemeine Auswahlstruktur (cond)
1.23 Allgemeine Auswahlstruktur (case)
1.24 Wiederholungsstruktur: Summe bis 100
1.25 Wiederholungsstruktur: Fakultät
1.26 Wiederholungsstruktur: Fakultät mit ‘do’
1.27 Rekursion
1.28 Symbol-bezogene Bibliotheksfunktionen
1.29 Auswahl von numerischen Bibliotheksfunktionen
1.30 Auswahl von zeichen-orientierten Bibliotheksfunktionen
1.31 Auswahl von zeichenketten-orientierten Funktionen
1.32 Einfache Ausdrücke
1.33 Zusammengesetzte Ausdrücke
1.34 Ein Paar
1.35 Prädikat: “pair?”
1.36 Prädikat: “atom?”
1.37 Konstruktor für ein Paar “cons”
1.38 Selektor für das erste Element eines Paares
1.39 Selektor für das zweite Element eines Paares
1.40 Modifikator für das erste Element eines Paares
1.41 Modifikator für das zweite Element eines Paares
1.42 Die leere Liste
1.43 Einfache Listen
1.44 Listen-Prädikat: “list?”
1.45 Listen-Prädikat: “null?”
1.46 Konstruktor für eine Liste “list”
1.47 Die Funktionen “cons” und “list”