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?
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: