A++ Die kleinste Programmiersprache der Welt - Georg P. Loczewski - E-Book

A++ Die kleinste Programmiersprache der Welt E-Book

Georg P. Loczewski

0,0

Beschreibung

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. Das Buch enthält auch eine Einführung in das Lambda-Kalkül von Alonzo Church, das die theoretische Grundlage von A++ darstellt. Ein vom Autor zur Verfügung gestellter Interpreter soll dabei behilflich sein, das Gelernte anzuwenden und zu testen. 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. Dazu gehören aber auch Trainer und Ausbilder sowie Programmierer der Industrie.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 96

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



A++

Die kleinste Programmiersprache der Welt

Georg P. Loczewski

A++

Die kleinste Programmiersprache der Welt

Eine Programmiersprache zum Erlernen der Programmierung

Mit einer Einführung in das Lambda-Kalkül

IMPRESSUM

Copyright ©2018 Georg P. Loczewski

A++ : Die kleinste Programmiersprache der Welt

1. Auflage 2018 – Hamburg

tredition GmbH

ISBN

978-3-7469-3098-5 (Paperback)

978-3-7469-3099-2 (Hardcover)

978-3-7469-3100-5 (e-Book)

Verlag & Druck: tredition GmbH

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 Ursula und meinen Söhnen Thomas und Johannes in Liebe gewiedmet

Inhaltsverzeichnis

Vorwort

1 Einführung

1.1 Konstitutive Prinzipien in A++

Abstraktion

Referenz

Synthese

Closure

Lexical Scope

2 Sprachdefinition

2.1 Syntax und Semantik von A++

Anmerkungen zur Syntax:

2.2 Beispiele zur Syntax von A++

Beispiele zur Abstraktion 1. Alternative in 2.2

Beispiele zur Abstraktion 2. Alternative in 2.2

Beispiele zur Referenz 2.3

Beispiele zur Synthese 2.4

2.3 A++ Erweiterung

Syntax von A++ mit vorgegebenen Primitiv-Abstraktionen

Beispiele zu den Erweiterungen in A++

3 Erste Entfaltung von A++

3.1 Programmierstil in A++

3.2 Grundlegende Logische Abstraktionen

Abstraktionen ‘true’ und ‘false’

Abstraktionen ‘lif’

3.3 Erweiterte Logische Abstraktionen

3.4 Numerische Abstraktionen

Abstraktion für die Zahl ‘0’

Abstraktion für die Zahl ‘1’

Abstraktion für die Zahl ‘2’

Abstraktion für das Prädikat ‘zerop’

Abstraktion für die Zahl ‘3’

Utility-Abstraktion ‘compose’

Abstraktion für die Addition

Abstraktion für die Inkrementierung

Abstraktion für die Multiplikation

3.5 Abstraktionen für Listen

Abstraktion für den Konstruktor

Abstraktion für den Selektor ‘lcar’

Abstraktion für den Selektor ‘lcdr’

Anwendung der grundlegenden Operationen für Listen

Abstraktion für das Ende einer Liste

Abstraktion für das Prädikat ‘nullp’

Abstraktion für die Längenabfrage

Abstraktion zum Entfernen eines Objektes aus einer Liste

3.6 Erweiterte Arithmetische Abstraktionen

Abstraktion für ‘zeropair’

Abstraktion für die Dekrementierung

Abstraktion für die Subtraktion

3.7 Relationale Abstraktionen

Abstraktion für das Prädikat ‘gleich’

Abstraktion für das Prädikat ‘größer als’

Abstraktion für das Prädikat ‘kleiner als’

Abstraktion für das Prädikat ‘größer gleich’

3.8 Funktionen Höherer Ordnung

Abstraktion ‘compose’

Abstraktion für die ‘curry’-Funktion

Abstraktion für die Abbildung einer Liste

Abstraktion für die ‘curry map’-Funktion

Abstraktion für die Auswahl aus einer Liste

Abstraktion für die Suche nach einem Objekt in einer Liste

3.9 Mengen-Operationen

Abstraktion für das Prädikat ‘memberp’

Abstraktion für das Hinzufügen eines Elementes

Abstraktion für die Vereinigung von Mengen

4 Erste Anwendung von A++

4.1 Utility-Abstraktionen

Abstraktion für das sortierte Einfügen in eine Liste

Abstraktion für die Sortierung

4.2 Rekursion

Abstraktion für die Berechnung der Fakultät

Abstraktion für die Summation

Abstraktion für den Zugriff auf ein Element einer Liste

Abstraktion für die Iteration über die Elemente einer Liste

4.3 Imperative Programmierung in A++

Die Abstraktion ’while’ in A++

5 Objekt-Orientierte Anwendung von A++

5.1 Einleitung

Bildung von Klassen

Instanzen von Klassen

Beispiele für Objekt-orientierung in A++

5.2 Erstes Beispiel zur Objektorientierung in A++

Konstruktor für Objekte der Klasse “account”

Erzeugung des Objektes “acc1” durch Aufruf von “make-account”

Senden der Botschaft “deposit” an das Objekt “acc1”

Ausführen der Funktion “deposit”

Detaillierter Code in A++

Anmerkungen zu dem ersten Beispiel zur Objektorientierung

Anmerkungen zum Aufruf der Funktion ‘konto’

5.3 Zweites Beispiel zur Objektorientierung in A++

Anmerkung zu den einzelnen Klassen

Beziehungen zwischen den Klassen

Zusammenfassung

5.4 Drittes Beispiel zur Objektorientierung in A++

Anmerkung zu den einzelnen Klassen

6 Abstraktion, Referenz und Synthese im Detail

6.1 Addition der zwei Zahlen ‘two’ und ‘three’

Synthese von ‘add’ und ‘two three’ (1)

Abstraktion von ‘add’ (1)

Auflösung der Referenz von ‘add’ in [1]

Synthese von (lambda(m n) ... ) und ‘two three’ in [3]

Abstraktion von ‘compose’

Auflösung der Referenz von ‘compose’ in [4]

Synthese von (lambda(f g) ...) und ‘(two f) (three f)’ in [6]

Abstraktion von three:

Auflösung der Referenz von ‘three’ in [7]

Synthese von (lambda(f) ...) und ‘f’ in [9]

Synthese von (lambda(x) ...) und ‘x’ in [10]

Abstraktion von two:

Auflösung der Referenz von ‘two’ in [11]

Synthese von (lambda(f) ...) und ‘f’ in [13]

Synthese vom inneren (lambda(x) ...) und ‘(f (f (f x)))’ in [14]

6.2 Multiplikation der zwei Zahlen ‘two’ und ‘three’

Synthese von mult und ‘two three’

Abstraktion von mult:

Auflösung der Referenz von ‘mult’ in [17]

Synthese von (lambda(m n) ... ) und ‘two three’ in [19]

Abstraktion von compose:

Auflösung der Referenz von ‘compose’ in [20]

Synthese von (lambda(f g) ...) und ‘two three’ in [22]

Abstraktion von two:

Abstraktion von three:

Auflösung der Referenz von ‘two’ und ‘three’ in [23]

Synthese vom inneren (lambda(f) ...) und ‘x’ in [26]

Synthese von (lambda(f) ...) und ‘(lambda(x0) ...)’ in [28]

Synthese vom inneren (lambda(x0) ...) und ‘x1’

Synthese von (lambda(x0) ...) und ‘(x(x(x x1)))’

Umbenennung der Variablen: x –> f und x1 –> x

7 Infrastruktur für A++

7.1 Support-Funktionen

Abstraktion für die Ausgabe einer Zahl

Abstraktion für die Ausgabe eines boole’schen Wertes

Abstraktion für die Ausgabe von Listen

7.2 A++ Interpreter

Linux

MS-Windows

Programmbeendigung

7.3 Initialisierungsdatei für den ARS-Interperter

7.4 WWW-Adressen

8 Erweiterung von A++

8.1 ARS++

8.2 ARSAPI

Anhänge

A Das Lambda-Kalkül

A.1 Syntax eines Lambda-Ausdrucks

A.2 Begriffe und Regeln des Lambda-Kalküls

Assoziativitätsregeln
Gebundene und freie Variable
Alpha-Konvertierung
Beta-Reduktion
Eta-Reduktion
Y-Kombinator

A.3 Beispiele für Beta-Reduktion

Lambda-Kalkül-Programmierung in Scheme-Codierung
Auszuwertende Lambda-Ausdrücke in Scheme-Codierung
Basis-Abstraktionen in Scheme-Codierung.
Anwendung mit Beta-Reduktion

B Gültigkeitsbereich von Namen

B.1 Interpretation von Namen

Dynamic Scope
Static Scope
Global Scope
Local Scope

B.2 Auswirkung der Art der Symbolinterpretation auf die Programmierung

Auswirkung von „Dynamic Scope“ auf die Programmierung
Auswirkung von „Static Scope“ auf die Programmierung
Verdeutlichung der Unterschiede von „dynamic scope“ und „lexical scope“ anhand von Beispielen

Schlusswort

Biographische Daten zur Person des Autors

Verzeichnis der Fundamentalbegriffe

Abbildungsverzeichnis

Listings

Literaturverzeichnis

Index

Vorwort

Zweck des Buches

In diesem kleinen Büchlein, geht es primär darum an der Programmierung interessierten Leserinnen und Lesern ein Instrument vorzustellen, mit dem sie sehr schnell und sehr effizient Programmieren lernen können, ohne sich schon für eine der populären, voll-ausgebauten Programmiersprachen entscheiden zu müssen und ohne einen großen Kostenaufwand zu haben.

Dass das in diesem Taschenbuch Gelernte und Eingeübte eine solide Grundlage für das Programmieren in den meisten Sprachen ist, wird in dem 768-seitigen Buch ‘Programmierung pur’(Siehe [Loc03].) ausführlich gezeigt. Dort werden die in A++ enthaltenen Denkmuster ausgeweitet auf das Programmieren in populären Sprachen, wie Java, C++, C, Python und Scheme.1

Thematik des Buches

Das Wesentliche der Programmierung

A++ ist die kleinste Programmiersprache der Welt, deren Sinn es ist einzig das Wesentlicheder Programmierung darzustellen, und zwar in einer Form dass damit gearbeitet werden kann, dass man es einüben kann. So soll A++ hilfreich sein beim Erlernen des Programmierens ganz allgemein, aber auch beim Erlernen von konkreten Programmiersprachen.

Elementarteilchen der Programmierung

In A++ werden die Elementarteilchen der Programmierung in reinster Form sichtbar gemacht. Man kann diese gründlich studieren, den richtigen Umgang mit ihnen einüben und sich so die wichtigsten Rüstzeuge der Programmierung aneignen.

Vereinfachung der Programmierung

In dem Bemühen, Programmierung auf das Wesentliche zu reduzieren, geht es darum, Lernende zu bewahren, sich von einer Unzahl von Vorschriften und Regeln einer bestimmten Programmiersprache die Programmierung an sich vergraulen zu lassen.

Energien, die in den meisten Sprachen für die Beherrschung und das Einhalten der Syntax aufgebracht werden müssen, kommen in A++ der wichtigeren Aufgabe der logischen Bewältigung des zu lösenden Problems zugute.

Einfache, umfassende und mächtige Denkmuster

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.

Verallgemeinerung des Lambda-Kalküls

Der Name A++ ist eine Abkürzung von Abstraktion plus Referenz plus Synthese. Hiermit werden die drei Prinzipien von A++ benannt, die gleichzeitig ihr einziger Inhalt sind. Diese Prinzipien stellen eine Verallgemeinerung der Grundoperationen des Lambda-Kalküls von Alonzo Church dar. Das Lambda-Kalkül ist ein mathematisch-logisches System, das 1941 von dem Logiger Alonzo Church in seinem Buch: ‘The Calculi of Lambda Conversion’ der Welt vorgestellt wurde. Siehe hierzu unsere kurze Zusammenfassung im Anhang A auf Seite 77.

Während das Lambda-Kalkül der Funktionalen Programmierung ihre theoretische Grundlage liefert, ist A++ in der Lage eine theoretische Grundlage für die drei bekanntesten Paradigmen der Programmierung zu liefern, d.h. für die funktionale, die objekt-orientierte und die imperative Programmierung.

Verallgemeinerung der Grundoperationen des Lambda-Kalküls:

•Abstraktion: Etwas einen Namen geben

•Referenz: Auf etwas mit seinem Namen Bezug nehmen

•Synthese: Aus zwei oder mehr Dingen etwas Neues erzeugen

Die Primitiv-Operationen von A++ gehen inhaltsmäßig über die Grundoperationen des Lambda-Kalküls hinaus, indem ihnen in der Anwendung in einem Programm jedwede Einschränkung genommen wird.

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 expliziteNamensdefinition 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 Programmierspra­chen mündet, können in A++ allgmeine 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 Prinzipien in A++ leiten lässt, wird Programme erstellen, die nicht nur funktionieren, sondern die auch schön sind, Programme, bei denen Leser und Leserinnen mit Bewunderung die Abstraktionen und Synthesen nachempfinden und genießen können.

Erlernen von neuen Programmiersprachen

In ‘Programmierung pur’ wird erstmalig der Versuch unternommen, den Weg zum Erlernen der Programmiersprachen Scheme, Java, Python, C und C++ anhand der mittles A++ erarbeiteten Denkmuster aufzuzeigen. ‘Programmierung pur’ behandelt diese Thematik nicht nur theoretisch, sondern präsentiert umfangreiche Fallstudien, um den Bezug zur Program­mierpraxis zu gewährleisten.

Adressatenkreis

Dieses Buch wendet sich ebenso wie ‘Programmierung pur’ 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 nahegelegten 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 undgrößerer Effizienz die Probleme der Programmierung meistern.

Das Buch wendet sich auch an Anfänger der Programmierung. Jedoch sollte ein großesInteresse für die Programmierung aufgrund einer persönlichen Eignung und Neigung vorhanden sein.

Zusammenfassend kann Zielgruppe des Buches wie folgt beschrieben werden:

Das Buch ist gedacht für Menschen, die einen Ausbildungsbedarf in denGrundlagen der Programmierung besitzen.

• Dies sind Studenten aller Fachrichtungen der Informatik sowie Studenten der Mathematik und Physik.

• Dies sind Lehrer und Schüler an Gymnasien, die in der Oberstufe Informatikunterrich gestalten oder an ihm teilnehmen.

• 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 dieses Büchleins gewiss eben­falls in Betracht.

Danksagung