Kurs:Programmieren in Aleph/Alles ist Objekt

Aus Wikiversity
Wechseln zu: Navigation, Suche

Objekte und Klassen[Bearbeiten]

In Aleph können nur Objekte verwendet werden. Diese Aussage ist wörtlich gemeint, womit Zahlen, Zeichen usw. ebenfalls Objekte sind. Es gibt nicht einmal Zahlen (z.B. int, long). Für Aleph ist alles Objekt.

Um den Einstieg in diese konsequente Anwendung der objektorientierten Programmierung zu erleichtern, ist dieser Abschnitt vorhanden. Er beginnt mit der Umkehrung des Objektgedankens. So wird hier der Weg von Objekten zu ihren Klassen gegangen. Diese Vorgehensweise hat sich bewährt, denn einen Weg einmal in die andere Richtung zu gehen, erweitert den Horizont.

Vorgang der Klassifizierung[Bearbeiten]

Objekt ist ein sehr allgemeiner Begriff. Vorstellungen von Objekten sind sehr individuell. Die Programmierung benötigt daher noch Klassen, von denen Objekte gebildet werden. Hier endet die individuelle Vorgehensweise.

Für die weitere Arbeit muss das Objekt jedoch einer Klasse zugeordnet werden. Dieser Vorgang wird Klassifizierung genannt und ist aus der Mathematik bekannt. Natürlich wird hier nur das Prinzip kurz vorgestellt.

Objekte sind stets Elemente einer Menge. Damit die Menge mehrere gleiche Objekte enthalten kann, werden die Orte der Objekte als zusätzliches Kriterium zur Unterscheidung herangezogen. Dadurch sind gleichartige Objekte unterschiedliche Elemente. Diese Feinheit ist notwendig, damit die Gesetze der Mathematik nicht verletzt werden. Die Informatik nennt diese Technik Adressierung.

Ausgangsmenge

Vorhanden ist eine ungeordnete Menge geometrischer Objekte. Um eine Klassifizierung zu ermöglichen, werden die Elemente nun entsprechend ihrer Größe und Form eingeteilt.

Faserung der Ausgangsmenge

Von oben nach unten ist die Form das ordnende Kriterium, von links nach rechts die Größe. In der Mathematik wird diese Einteilung als Faserung bezeichnet. Hier ist also jede senkrechte Faser einer bestimmten Objektgröße zugeordnet. Horizontale Fasern sind demnach den Formen zugeordnet.

Durch die Kreuzung der einzelnen Fasern entstehen in diesem Beispiel neun Bereiche mit gleichartigen Objekten. Diese Bereiche werden Zellen genannt. Jede Zelle ist nun eine Sammlung (keine Menge) von gleichartigen Objekten.

Der erste Schritt ist getan. Die Ortsangabe bei jedem einzelnen Objekt, zur Unterscheidung gleichartiger Objekte, kann entfallen.

Mathematiker (auch Zahlentheoretiker) sind wenig an den Werten von Zahlen interessiert. Von Interesse sind nur die Eigenschaften. Sind die Eigenschaften bekannt, kann jederzeit eine entsprechende Zahl erzeugt werden.

Übertragen auf die vorhandenen Fasern der Menge genügt nun jeweils ein Objekt in jeder Zelle, denn die Eigenschaften sind bekannt.

Repräsentanten

Jetzt liegen bereits die Grundlagen für Klassen vor. Jede Zelle ist Repräsentant eines Elements der Ausgangsmenge. Als letzter Schritt bleibt noch die Eigenschaft Größe. Wird sie mit klein, mittel, groß angenommen, können die horizontalen Fasern zu einer Zelle verschmelzen.

Klassifizierung

Ein beliebiges Objekt der Ausgangsmenge kann nun durch eine Angabe wie

Dreieck( klein) oder Kreis( groß)

bereitgestellt werden.

Es wurde eine Klasse erzeugt, die aus einem Fundus geometrischer Grundelemente eine beliebige Anzahl Objekte bereitstellt. Allein durch Angabe der Bezeichnung des Elements und der gewünschten Größe.

Diese Vorgehensweise liegt prinzipiell allen objektorientierten Sprachen zugrunde. Natürlich sind die Objekte oft komplexer und die Eigenschaften umfangreicher, aber das ändert nichts am Prinzip.

Aleph nutzt die Menge aller (erreichbaren) Java-Klassen in der eben beschriebenen Weise. Ein Element der Klassenmenge wird über den Namen angesprochen und ein Objekt mit den spezifizierten Eigenschaften (Creator mit Argumentliste) erzeugt.

Identität eines Objekts[Bearbeiten]

Aleph besitzt auch Eigenschaften der funktionalen Programmierung. Ein Aspekt, der in den meisten objektorientierten Sprachen durch das Attribut orientiert ausgedrückt wird. Diese Sprachen arbeiten zwar überwiegend mit Objekten, haben aber noch Elemente der rein sequentiellen (alloziierenden) Verwaltung.

Selbst C++ und Java sind damit behaftet, wie die folgenden Deklarationen zeigen:

int    a = 5;
double c = 3.14;

Diese Deklarationen sind in diesen Sprachen unverzichtbar und basieren auf sog. primitiven Klassen als Typenangabe. In Aleph existieren keine derartigen Deklarationen.

Symbole und Wertobjekte[Bearbeiten]

Wenn ein Objekt einen Wert verkörpert, so ist dieser Wert durch die Identität des Objekts gegeben. Was sich hier schwierig anhört, ist eigentlich ganz einfach.

Viele assoziieren 3.14 mit PI. Ungenau, aber gängig. Etwas seltener ist da schon die Verbindung von 345 mit den ersten pythagoreischen Zahlen. Zwar gehen Viele bei der Zeichenfolge 987 von dem Wert neunhundertsiebenundachzig aus, aber der Prozess zur Bestimmung des Wertes läuft unbewusst ab.

Es ist aber genau dieser Vorgang, den Aleph nutzt. Die Zeichenfolge (z.B. 987) ist eine Bezeichnung. Für Aleph ist sie also das gleiche wie eine Anweisung oder ein Befehl. Anweisungen und Befehle sind aber im System gespeichert, 987 nicht.

Nun probiert Aleph, ob die Zeichenfolge 987 in einen Wert gewandelt werden kann. Ist das der Fall, wird eine Identitätsfunktion mit dem Wert als Argument kompiliert. Die Kombination aus Funktion und Wert wird in Aleph Symbol genannt.

Die Zeichenfolge 987 ist also ein Symbol für den Wert neunhundertsiebenundachzig.

Symbole existieren für Zahlen, einzelne Zeichen (characters), Strings. Dem Programmierer steht es außerdem frei, weitere Symbole zu definieren.

Im Quelltext des Programms ist von diesen Vorgängen nichts zu sehen. Es ist aber sehr wichtig, diese Symbole als Identitätsfunktionen anzusehen. Aleph trennt Daten und Programm nicht, wohl aber Werte und Bearbeitung.

Anweisungen oder Commands[Bearbeiten]

Aleph kann wegen seiner konsequenten Auslegung des Objekgedankens nicht zwischen Daten und Programmen unterscheiden (siehe vorherige Punkte). Auch die beiden Paradigma funktionale und/oder prozedurale Programmierung sind Aleph fremd. Eigentlich existieren nur Anweisungen, die Daten bearbeiten und Daten liefern. Wie gezeigt, werden sogar Zahlenangaben als Anweisungen aufgefasst.

Dieser letzte Punkt in diesem Abschnitt dient nur dem Verständnis für die weiteren Abschnitte. Weil es für Aleph keinen Unterschied zwischen Daten, Werten, Objekten, usw. gibt, wird alles unter dem Begriff Command vereinigt. Ob es sich um eine Methode aus einer Java-Instanz oder nur um den booleschen Wert false handelt ist egal. Sogar die Interna der V2M (Alephs virtueller Maschine) können als Command verfügbar sein. Gleichzeitig können alle Commands und damit alle Programmsequenzen als Daten angesehen werden. Diese Gleichstellung ist die Konsequenz aus dem Ansatz der zu Aleph führte.

Vom Standpunkt der herkömmlichen Programmierung aus, ist jedes Command auch ein Objekt. Vom Standpunkt der Aleph-Programmierung ist jedes Objekt ein Command.

Aufgabe:
  • In herkömmlichen Sprachen sind "123" oder "true" Literale. Warum kennt Aleph keine Literale?
  • Was ist eine Identität?
  • Was stellt die Kombination aus Identitätsfunktion und Wert dar?

Lösungen

Aleph im Rechner[Bearbeiten]

Oft ist es hilfreich eine räumliche Vorstellung von Programmen zu haben. Nach all den sehr abstrakten Beschreibungen, ist es schwierig den Ort eines Systems wie Aleph zu lokalisieren.

Wenn Aleph Java braucht und Java eine virtuelle Maschine und diese wiederum eine physische, muss eine Übersicht her.

Aleph im PC

Dieses Diagramm zeigt, wie Aleph mit Java und dem Speicher arbeitet. Aleph betrachtet Java als untergeordnetes System, weshalb es ihm auch den meisten Speicherplatz überlässt. Aleph interessiert sich nicht für die JVM, denn es benutzt Java und damit indirekt auch die virtuelle Java-Maschine.

Die V2M fehlt in diesem Diagramm, denn sie ist in Java geschrieben. Dafür ist der Speicherplatz für Aleph hervorgehoben (Memory). Natürlich ist er im RAM vorhanden, verwendet aber eine eigene Verwaltung.

Organisation des Speichers[Bearbeiten]

Aleph benutzt eine listenartige Struktur zur Verwaltung seines Speichers. Es wird nicht die in Java vorhandene LinkedList-Klasse verwendet, sondern eine eigene.

Um auch hier eine bildhafte Vorstellung zu erhalten, ist diese Abbildung da.

Speicherorganisation in Aleph

Die Liste selbst ist aus Item-Instanzen aufgebaut. Diese existieren als solche in der V2M von Aleph. Der von Aleph benutzte Speicher (Memory) enthält Elemente der Items. Die mit ref bezeichneten Elemente referenzieren Objekte im RAM.

Natürlich sind alle Instanzen im RAM. Dieses Bild zeigt die Organisation aus Sicht des Aleph-Programmierers und nicht die physischen Gegebenheiten im PC.

Die Grundlagen sind nun vorhanden. Die Art und Weise, wie unter Aleph Objekte gesehen werden (können) wurde weidlich besprochen. Den ersten Programmen steht nun - außer der Formulierung - nichts mehr im Wege. Der nächste Abschnitt setzt sich genau damit auseinander.