|
|
||||
Folge 22: Variablenverwaltung |
||||
Schritt 1 - Berechnungen mit VariablenBetrachten Sie folgenden Java-Quelltext:radius = 10.0; pi = 3.14; umfang = 2 * pi * radius; Nicht besonders beeindruckend, oder? Hier wird der Umfang eines Kreises berechnet. Das Programm muss dazu drei Dinge wissen:
Hier haben wir ein gutes Beispiel für eine Berechnung, bei der Variablen eine wichtige Rolle spielen. In der Berechung des Kreisumfangs werdem folgende drei Variablen verwendet: radius, pi und umfang. |
||||
Schritt 2 - Was sind Variablen?Eine Variable besteht aus drei Komponenten
Die Variable radius aus dem obigen Beispiel hat z.B. die Bezeichnung "radius", der Datentyp ist double, und der Wert ist 10.0. |
||||
Schritt 3 - StackInterpreter mit VariablenUnsere Klasse StackInterpreter soll jetzt mit Variablen umgehen können; der Interpreter soll in der Lage sein, Berechnungen wie z.B. den Umfang eines Kreises auszuführen. Um die Sache nicht unnötig zu verkomplizieren, beschränken wir uns bei dem Interpreter auf einen Typ von Variablen, nämlich double. So müssen wir für jede Variable nur noch die Bezeichnung und den aktuellen Wert speichern. Da bei einer Berechnung häufig mehrere Variablen benötigt werden, muss unser Interpreter ebenfalls in der Lage sein, mehrere solcher Variablen zu verwalten. Wir werden diese Variablen in einer Liste speichern; allerdings nicht direkt in der Klasse Stackinterpreter, sondern in einem Objekt der Klasse Variablenliste, welche wir noch erzeugen müssen. |
||||
Schritt 4 - Die Klasse VariablenlisteDie Klasse Variablenliste ist für die Verwaltung von Variablen zuständig. Bevor wir auf die Einzelheiten der Implementation eingehen, wollen wir uns überlegen, welche Methoden eine Variablenliste benötigt.
|
||||
Schritt 5 - Code für eine Berechnung mit VariablenSchauen wir uns noch einmal die Berechnung des Kreisumfangs an: radius = 10.0; pi = 3.14; umfang = 2 * pi * radius; Wir müssen jetzt einen Stackmaschinen-Code entwickeln, der die Stackmaschine veranlasst, genau diese Berechnung durchzuführen. Anweisung 1: radius = 10.0;Die Variable mit dem Namen radius soll den Wert 10 erhalten. Dazu muss erst mal die Zahl 10 auf den Stack gepusht werden, und dann muss eine Anweisung kommen, die die Stackmaschine dazu veranlasst, a) eine neue Variable namens "radius" anzulegen und b) dieser Variablen den Wert 10 zuzuweisen. Folgender Stackmaschinencode leistet das Gewünschte: push 10.0 assign radius Der Stackmaschinenbefehl assign bewirkt Folgendes: Der Wert des obersten Stackelementes wird der angegebenen Variablen zugewiesen. Dann wird das oberste Stackelement gelöscht. Man könnte rein theoretisch natürlich auch folgenden Stackmaschinencode benutzen: assign radius 10 Das wäre ein Befehl mit zwei Argumenten, nämlich dem Variablennamen und dem Variablenwert. Ein solches direktes Vorgehen würde aber dem Charakter einer Stackmaschine widersprechen. Bei einer Stackmaschine werden alle wichtigen Operationen immer mit dem oder auf das oberste Stackelement ausgeführt - denken Sie nur an die add-Operation. Daher ist der assign-Befehl so konstruiert, dass grundsätzlich der Wert des obersten Stackelements in die Variable geschrieben wird. Also muss der Wert 10 zunächst in den Stack gepusht werden. Anweisung 2: pi = 3.14Diese Anweisung ist nach dem gleichen Muster aufgebaut wie die erste, also können wir den Code für die Stackmaschine direkt hinschreiben: push 3.14 assign pi Anweisung 3: umfang = 2 * pi * radiusZuerst muss die Berechnung auf der rechten Seite der Zuweisung codiert werden. Das ist nicht allzu schwer: push 2 varpush pi varpush radius mul mul Zunächst wird die Zahl 2 direkt auf den Stack gepusht. Dann muss der Wert der Variable pi auf den Stack gepusht werden, anschließend der Wert der Variable radius. Dazu wird der varpush-Befehl verwendet, der Folgendes leistet: In der Variablenliste wird nachgeschaut, welchen Wert die Variable hat. Dann wird dieser Wert auf den Stack gepusht. Da eine Variable wie radius oder pi im Laufe einer Berechnung mehrmals verwendet werden darf, wird die Variable nicht aus der Variablenliste gelöscht, sondern verbleibt in ihr. Nach der Berechnung der rechten Seite der Zuweisung steht das Ergebnis der Berechnung im obersten Stackelement. Dieser Wert muss nun an die Variable umfang zugewiesen werden: assign umfang Damit ist der Stackmaschinencode komplett. Fassen wir noch einmal zusammen: push 10.0 assign radius push 3.14 assign pi push 2 varpush pi varpush radius mul mul assign umfang |
||||
|
|
||||
|
|
||||
|
|
||||
So sieht das Klassendiagramm des Stackinterpreter-Projekts nach der Übung 22.3 aus, falls die Klasse Variable als eigenständige Klasse implementiert wurde. Es gibt auch noch die Möglichkeit, Variable als Klasse innerhalb der Klasse Variablenliste zum implementieren. Wer mehr über diese Möglichkeit wissen möchte, klickt bitte auf den Lexikon-Eintrag Unterklassen.
weiter mit dem Erweiterungsteil für FortgeschritteneWenn Sie den Erweiterungsteil der Folge 21 bearbeitet haben, sollten Sie auch diesen Erweiterugsteil der Folge 22 bearbeiten; immerhin sind noch drei weitere Punkte zu holen. Es geht "nur" darum, auch die Variablenliste mit einem graphischen Interface auszustatten und dann in den Interpreter einzubinden. weiter mit Folge 23: while-SchleifenBisher konnte unser Stackinterpreter nur rein lineare Programm abarbeiten. Wir wollen in dieser Folge den Interpreter dazu bewegen, while-Schleifen abzuarbeiten. Damit sind dann schon größere Berechnungen möglich, z.B. die Summe der Zahlen von 1 bis 10. |
||||
|
Diese HTML-Seite wurde erstellt von Ulrich Helmich am 22. Juli 2006 und stark überarbeitet am 14. Mai 2008. |
||||