Left Up Right RAMS Konzepte

Ablaufmodell: Abstrakte Stapelmaschine

Ziel

Da es konzeptionell keine eingebauten Typen geben soll, müssen alle Typen im Prinzip gleichbehandelt werden.

Das unnötige Kopieren von Instanzen bei der Rückgabe von Funktionswerten wie in gängigen C++-Implementierungen soll vermieden werden.

Aufrufstack

Die Idee des Aufrufstacks wird übernommen. Beim Aufruf einer Funktion wird entsprechend Speicherplatz auf dem Stack allokiert.

Auf diesem Stack werden auch, weis es allgemein üblich ist, die lokalen Variablen der Funktionen allokiert.

Die Funktionen arbeiten als abstrakte Maschinenbefehle.

Rückgabe von Funktionswerten

Die Funktionswerte werden implementierungstechnisch durch einen impliziten call-by-reference - Parameter zurückgeliefert.

Dies hat den weiteren Vorteil, das die Ergebnisinstanz nicht erneut allokiert werden muß. Man stelle sich beispielsweise einen iterativen Algorithmus einer numerischen Anwendung vor. Die Größe der Matritzen ändert sich meist nicht. Wenn nun eine Funktion eine Matrix als Wert zurückliefert, müßte sie in herkömmlichen C++ Implementierungen immer wieder allokiert und dellokiert werden, was die Speicherverwaltung belastet.

Mit der hier vorgeschlagenen Implementierungstechnik können die Speicherstrukturen einfach bebehalten werden. (In C++ wird der erfahrene Programmierer auch daher die Klassen als Funktionsrückgabewerte vermeiden. Auf die schönen Operatoren in C++ muß man bei praktischen Anwendungen verzichten.)

Verbindung mit den parametrischen Typen

Wenn ein parametrierter Typ als Ergebnis einer Funktion zurückgeliefert wird, könnten die Parameter des Rückgabewertes aus den Parametern der Funktion berechnet werden.

Eine wichtige Anwendung ist die Matrizenrechnung. Wenn die Dimension einer Matrix feststeht, was in den meisten Anwendungen der Fall sein dürfte, kann der Typ matrix mit Parametern versehen werden:

   Typ matrix<dim_t n,dim_t m>
   {
   // ...
   }
Die Multiplikationsoperation könnte dann so angegeben werden:
   matrix<n,m> operator_*_(matrix<n,o> m1,matrix<o,m> m2);
Der Compiler kann nun prüfen, ob die Dimensionen der Matrizen übereinstimmen. Im obigen Beispiel unifiziert der Compiler die Parameter und merkt, wenn der Typparameter o unterschiedliche Werte hat.

Bei Zwischenwerten von arithmetischen Ausdrücken kann der Compiler automatisch Hilfsvariablen mit den entsprechenden Typparametern auf dem Stack anlegen lassen.

Vorteile:

detailierte Typprüfung zur Compilezeit
Dies bedeutet zusätzliche Sicherheit vor unliebsamen Überraschungen
Höhere Leistung durch Vermeidung der Belastung des dynamischen Speichers
Typen wie Matrizen, die feste Größen haben, können so ohne dynamischen Speicher auskommen, da Zwischenwerte ganz einfach vollständig auf dem Stack allokiert werden.
Eine weitere Anwendung sind beliebig genaue Ganzzahen bzw. Flieskommazahlen oder Festpunktzahlen.
Rudolf Weber