Registermaschine

minzee

Bekanntes Mitglied
Hallo :)

Auf Beispielprogramme gibt es im Kapitel 6 Klassen für eine Registermaschine. Hierfür braucht man die folgenden Programme:

- 6.2
- 6.3
- 6.6-6.7
- 6.8

Und dann ja nach Programm noch:

- 6.4
- 6.5
- 6.9
- 6.10
- 6.11

Dazu habe ich einige Fragen.

1) Im zur Webseite zugehörigen Buch sind folgende Befehle definiert:

LOAD, CLOAD, STORE, ADD, CADD, SUB, CSUB, MULT, CMULT, DIV und CDIV.

Da frage ich mich, warum ausgerechnet diese Befehle. Hat das irgendeinen bestimmten Grund? Oder hat der Buchautor einfach nur irgendwelche beliebigen Befehle selbst spontan definiert?

2) Im Programm 6.6-6.7 wird in der Methode setProgram das Array prog kopiert.

Warum ist es nötig, das Array zu kopieren?

3) Wozu gibt es überhaupt diese Methode setProgram im Programm 6.6-6.7?

Ein Universitätsprofessor hatte mal gemeint, was man sofort machen kann, soll man auch sofort machen. Ist keine setter-Methode nötig, soll man sie weglassen.

Das würde wohl bedeuten, dass man das Array prog direkt der Methode run übergeben soll. Seht ihr das auch so? Oder gibt es irgendeinen bestimmten Grund, warum es hier diese setter-Methode setProgram gibt?

4) Wozu gibt es die END-Instruction?

Die End-Klasse ist im Programm 6.8 definiert. Im Grunde genommen macht die gar nichts. Das einzige wichtige an ihr ist die Methode toString. Die muss END zurückgeben. Das ist dafür entscheidend, dass das Programm nicht mehr weiter nach irgendwelchen Befehlen sucht. Das sieht man im Programm 6.6-6.7 in der Methode run.

Die End-Klasse muss unbedingt das Interface Instruction (Programm 6.3) implementieren, obwohl die darin deklarierte Methode eval nie aufgerufen wird. Das erscheint mir alles irgendwie seltsam.

Warum beendet man die Programmabarbeitung nicht einfach dann, wenn der Instruction-Counter (siehe Programm 6.2, Eigenschaft ic) auf eine Zeile verweist, die gar nicht mehr definiert ist? Beim Markov-Algorithm macht man das so.

5) Ist das wirklich gut, die Programmsteuerung von dem Abhängig zu machen, was toString zurückliefert?

Das ist - wie schon erwähnt - bei der End-Klasse der Fall. Warum kontrolliert man im Programm 6.6-6.7 in der Methode run nicht den Datentyp? Ist die Instruction vom Typ End, wäre das Programm zu Ende.

6) Warum instanziert man Configuration innerhalb der Klasse Machine?

Das sieht man im Programm 6.6-6.7 im Konstruktor der Klasse Machine.

Würde man Configuration im Hauptprogramm instanzieren und dann direkt der Methode run der Klasse Machine übergeben, könnte man im Hauptprogramm noch einige Parameter definieren. Man könnte den Registern noch einige Werte vordefinieren.

Ich denke hier z. B. an eine Funktion. Zuerst definiert man sie mal ganz allgemein. Man kann sie dann jedoch immer mit unterschiedlichen Parametern ausführen. Wäre das so nicht besser?
 
Zuletzt bearbeitet:

JavaMeister

Gesperrter Benutzer
Da frage ich mich, warum ausgerechnet diese Befehle. Hat das irgendeinen bestimmten Grund? Oder hat der Buchautor einfach nur irgendwelche beliebigen Befehle selbst spontan definiert?

Sieht aus wie die Grundrechenarten und ein paar Laden und Speichern sachen.

Warum ist es nötig, das Array zu kopieren?

Hierfür ist natürlich die eigene Erfahrung notwendig, um das zu erkennen. Was mich zu dem Schluss führt, dass du zu schnell die Grundlagen überflogen hast.

Wenn du das Array nicht kopierst, dann führst du Operationen auf dem Array aus, dass du übergibst und veränderst damit den Übergabeparameter.

Warum beendet man die Programmabarbeitung nicht einfach dann, wenn der Instruction-Counter (siehe Programm 6.2, Eigenschaft ic) auf eine Zeile verweist, die gar nicht mehr definiert ist? Beim Markov-Algorithm macht man das so.

Reine Definitionssache.

Das ist - wie schon erwähnt - bei der End-Klasse der Fall. Warum kontrolliert man im Programm 6.6-6.7 in der Methode run nicht den Datentyp? Ist die Instruction vom Typ End, wäre das Programm zu Ende.

Nein, pauschal würde ich sagen,d ass das nicht ok ist.

Ich denke hier z. B. an eine Funktion. Zuerst definiert man sie mal ganz allgemein. Man kann sie dann jedoch immer mit unterschiedlichen Parametern ausführen. Wäre das so nicht besser?

Ja normalerweise würde man sowas über Dependency Injection machen. Aber hier ist das nicht notwendig, weil du Maschine ehh nicht ändern kannst und neue Parameter machen daher keinen Sinn.
 

JavaMeister

Gesperrter Benutzer
Die toString() -Methode liefert eine StringRepresenation eines Objekts.

Es ist in Object definitert und dort vorgegeben, was diese Methode zurückliefern soll. Wenn ich in meinem Programm das umdefiniere, wie das hier der fall ist, dann mache ich etwas falsch. Ich kann mich nicht darauf verlassen, dass jeder das so weiß. Ich kann die Methode nicht zur Implementierung zwingen. Also (man kann schon) aber sauber ist das nicht.

Man würde hier eine neue Methode schreiben, die genau das macht.

Wo würde ich denn etwas verändern, wo nichts verändert werden darf?

Keine Ahnung, ich weiß nicht, was deine Methoden machen noch wie sie implementiert sind. Generell kopiert man das, um nicht versehentlich was falsches zu ändern.
 

Neue Themen


Oben