Variablen in Methoden

Parameter und lokale Variablen der Methoden werden gegenüber den globalen Variablen in Bezug zur Methode gesetzt. Globale Variablen stehen demgegenüber in Bezug zur Klasse in der sie dimensioniert wurden. Im Hauptprogramm wäre dies die Basisklasse "Avr". Implementiert man eine Methode mit Parametern und/oder innerhalb der Methode zusätzliche Variablen, sind Diese lokal auf die Methode bezogen (sie sind nur in der Methode selbst sichtbar). Parameter und temporär dimensionierte Variablen, belegen nur während der Ausführung der Methode den benötigten Speicherplatz im Arbeitsspeicher. Zusätzliche dimensionierte Variablen können in Methoden auch statisch dimensioniert werden. Siehe auch: dim, static

Konzepte

Für temporär existierende Variablen gibt es verschiedene Konzepte, wie man die dafür notwendigen lokalen Speicherbereiche verwaltet. Jedes dieser Konzepte hat entsprechende Vor- und Nachteile. eines der Konzepte ist, zusätzlich zum normalen Stack einen extra-Stack für lokalen Speicher zu verwalten. Dies macht es jedoch notwendig, dass ein programmweit verfügbarer Zeiger mitgeführt werden muss und die Gefahr besteht, dass beide Stacks kollidieren (sich gegenseitig überschreiben). Zusätzlich werden zumeist eine Konfiguration zur Größe des extra-Stack und extra verwaltende (interne) Unterprogramme notwendig. ein weiteres Konzept ist die Nutzung des normalen Programmstack. Auch hier ist ein Zeiger notwendig, jedoch ist eine Kollision verschiedener Stacks nicht möglich. Zudem werden Konfigurationsfehler eines zweiten Stacks vermieden. Luna nutzt letzteres Konzept für Parameter und temporäre, lokale Variablen.

Veranschaulichung

Nehmen wir an es wurde folgene Methode implementiert:

procedure test(a as byte, b as integer)
  dim c,d as byte
  [..]
endproc

Diese Methode reserviert bei Aufruf vier verschiedene temporäre Variablen im Arbeitsspeicher. Als erstes landen die Parameter auf dem Stack. Dies geschieht von rechts nach links, also umgekehrt wie in der Parameterdefinition der Methode schriftlich angegeben. Der Ablauf beim Aufruf einer Methode

  1. Rücksprungadresse auf den Stack legen
  2. Parameter „b“ auf den Stack legen
  3. Parameter „a“ auf den Stack legen
  4. Speicherplatz für Variable „d“ auf dem Stack reservieren
  5. Speicherplatz für Variable „c“ auf dem Stack reservieren
  6. Aktuelle Stackposition merken (Zeiger)

Der Compiler weiß beim erstellen des Programms wo und wieviele Variablen auf dem Stack abgelegt werden und passt die entsprechenden Aufrufe innerhalb der Methode an. Wird in der Methode auf eine temporäre, lokale Variable zugegriffen, passiert Folgendes:

  1. Zeiger holen
  2. Variablenposition hinzurechnen
  3. Zugriff durchführen

Bei globalen Variablen, sowie bei in der Methode statisch dimensionierten Variablen entfallen die ersten beiden Schritte, wodurch Zugriffe schneller sind. Bei zeitkritischen Zugriffen, sind also globale oder statische, lokale Variablen vorzuziehen, sofern dies technisch möglich ist. Verlassen der Methode Beim Verlassen der Methode wird der Stack auf die ursprüngliche Position zurückgesetzt, wobei die Rücksprungadresse auf dem Stack verbleibt. Der abschließende Maschinenbefehl „ret“ (Return) holt sich diese Rücksprungadresse vom Stack und springt dann zu der Position hinter dem Methodenaufruf zurück. Damit ist der auf dem Stack vorübergehend belegte Speicher wieder freigegeben.