Aufgabe 2.2

Benutzeravatar
JanM
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 157
Registriert: 24. Aug 2010 10:58

Aufgabe 2.2

Beitrag von JanM »

Ich habe mal eine frage zu der Aufgabe mit dem Constant Folding:
Auf dem aufgabenblatt steht man soll "x := n * 1;" zu " x := n" vereinfachen.
Wie weit sollen wir das Prinzip ausreizen? Soll auch "true \/ ..." zu true, "false /\ ..." zu false, ... vereinfacht werden?
Wenn man das ganze auf die Spitze treiben will, könnte man dann ja auch "4 < n +5", wenn n ein Integer ist zu true auswerten?

Das zweite Problem, das ich hab ist, dass wenn ich das Programm so abtippe und den Compiler anwerfe kommen folgende Fehlermeldungen:
ERROR: "b" is not declared 11..11
ERROR: LHS of assignment is not a variable 11..11
ERROR: "x" is not declared 12..12
ERROR: "n" is not declared 12..12
ERROR: LHS of assignment is not a variable 12..12
ERROR: "y" is not declared 13..13
ERROR: LHS of assignment is not a variable 13..13
ERROR: "z" is not declared 14..14
ERROR: "y" is not declared 14..14
ERROR: LHS of assignment is not a variable 14..14
Was mache ich falsch?

Benutzeravatar
JanM
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 157
Registriert: 24. Aug 2010 10:58

Re: Aufgabe 2.2

Beitrag von JanM »

Eine kleine Erweiterung zu meiner ersten Frage:
Sehe ich das richtig, dass wenn ich 2 Konstanten mit op verknüpfe das Ergebnis davon ausgerechnet und gesetzt wird?
Falls ja warum ist n in "x := n * 1" eine Konstante und in "const m ~ n +1" nicht?

Jens Huthmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 192
Registriert: 10. Nov 2011 19:42

Re: Aufgabe 2.2

Beitrag von Jens Huthmann »

Auf dem aufgabenblatt steht man soll "x := n * 1;" zu " x := n" vereinfachen.
Wie weit sollen wir das Prinzip ausreizen? Soll auch "true \/ ..." zu true, "false /\ ..." zu false, ... vereinfacht werden?
Wenn man das ganze auf die Spitze treiben will, könnte man dann ja auch "4 < n +5", wenn n ein Integer ist zu true auswerten?
Wenn Sie den Visitor als eine Post-Order Traversierung implementieren, sollte so automatisch jede Ausdruck maximal minimiert werden. Wahlweise können sie auch ihre Optimierung so oft aufrufen bis nichts mehr ändert, was aber weniger geschickt ist.

Und ja sie sollen Typ Änderungen beachten. 4 < (n + 5) kann aber nicht weiter vereinfacht werden da sie hierfür Constant Propagation machen müßten, d.h. den Wert einer konstanten Variable (welche eine Konstante sein kann) in die Ausdrücke eintragen.


Die Vereinfachung von x := n * 1 zu n kommt nicht daher das n eine Konstante ist, sondern das die 1 das Neutralelement der Multiplikation ist.
Das zweite Problem, das ich hab ist, dass wenn ich das Programm so abtippe und den Compiler anwerfe kommen folgende Fehlermeldungen:
ERROR: "b" is not declared 11..11
ERROR: LHS of assignment is not a variable 11..11
ERROR: "x" is not declared 12..12
ERROR: "n" is not declared 12..12
ERROR: LHS of assignment is not a variable 12..12
ERROR: "y" is not declared 13..13
ERROR: LHS of assignment is not a variable 13..13
ERROR: "z" is not declared 14..14
ERROR: "y" is not declared 14..14
ERROR: LHS of assignment is not a variable 14..14
Was mache ich falsch?
Ich sehe das ich hier das begin ... end um das Programm herumvergessen habe.

Benutzeravatar
JanM
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 157
Registriert: 24. Aug 2010 10:58

Re: Aufgabe 2.2

Beitrag von JanM »

Ja aber auch der Fall x := n * 1, ist zwar das neutrale Element der Mutliplikation, aber das ist trotzdem nicht die auf dem Aufgabenblatt beschriebene Constant Folding, da n ja nicht konstant ist.... Das klingt für mich halt auch eher nach konstant propagation... Naja egal.
Welche Sonderfälle sollen wir denn dann noch zusätzlich abdecken, außer dem neutralen Element bei Mutliplikation und Addition?

Jens Huthmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 192
Registriert: 10. Nov 2011 19:42

Re: Aufgabe 2.2

Beitrag von Jens Huthmann »

Decken Sie die neutral Elemente bei den vier Grundrechenarten und zusätzlich die Fälle von false /\ x = false bzw. true \/ x = true ab.

insi
Neuling
Neuling
Beiträge: 8
Registriert: 8. Okt 2009 17:18

Re: Aufgabe 2.2

Beitrag von insi »

müssen wir bei der visitBinaryExpression(..) prüfen, ob die Declaration eine Instanz von BinaryOperatorDeclaration ist, oder können wir davon ausgehen, dass das vorher schon geprüft worden ist? Im Moment gehen wir von letzterem aus.

Und noch ne andere Frage:

in der Compiler.java kann man folgendes finden

Code: Alles auswählen

            //if (showingAST) {
            //    drawer.draw(theAST);
            //}
jedoch passiert beim einkommentieren (sowie showingAST = true setzen) nichts.

Kann man sich den AST irgendwie darstellen lassen? Das würde beim Debuggen enorm helfen.

Jens Huthmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 192
Registriert: 10. Nov 2011 19:42

Re: Aufgabe 2.2

Beitrag von Jens Huthmann »

insi hat geschrieben:müssen wir bei der visitBinaryExpression(..) prüfen, ob die Declaration eine Instanz von BinaryOperatorDeclaration ist, oder können wir davon ausgehen, dass das vorher schon geprüft worden ist? Im Moment gehen wir von letzterem aus.
Wenn sie den Aufruf Ihrer Optimierung nach dem Checker einbauen können sie davon ausgehen das dies bereits überprüft wurde. Der Checker macht dies nämlich.
insi hat geschrieben: Und noch ne andere Frage:

in der Compiler.java kann man folgendes finden

Code: Alles auswählen

            //if (showingAST) {
            //    drawer.draw(theAST);
            //}
jedoch passiert beim einkommentieren (sowie showingAST = true setzen) nichts.

Kann man sich den AST irgendwie darstellen lassen? Das würde beim Debuggen enorm helfen.
In der Drawer Klasse ändern sie dazu

Code: Alles auswählen

frame.show();
zu

Code: Alles auswählen

frame.setVisible(true);
Dann erscheint das Fenster, wird aber gleich wieder mit der Programmterminierung geschlossen. Entweder bauen Sie sich hier einen extra Thread oder Sie verwenden die Quick&Dirty Methode. Einfach einen Breakpoint nach dem drawer.draw() setzen und per Debugger starten.

Echo
Mausschubser
Mausschubser
Beiträge: 46
Registriert: 9. Okt 2009 12:27

Re: Aufgabe 2.2

Beitrag von Echo »

Zum Anzeigen des AST:

1) show(); ist lediglich deprecated - funtioniert aber noch ohne Probleme und muss nicht gegen setVisible(true) getauscht werden (Ist aber sauberer).
2) Das Einkommentieren kann man sich sparen, damit wird der AST lediglich zweimal gezeichnet (vgl. Complier.java Zeile 87 und 92)
3) Zum Anzeigen des Fensters muss der dritte Parameter beim Aufruf der Funktion compileProgram in Compiler.java Zeile 127 auf true gesetzt werden.
4) Damit das Fenster mit dem AST nicht direkt wieder geschlossen wird, reicht das Auskommentieren von System.exit(...) in Compiler.java Zeile 128. (Quicker&Dirtier ;))
Danke fürs lesen.

Flo S
Windoof-User
Windoof-User
Beiträge: 34
Registriert: 27. Apr 2010 22:50

Re: Aufgabe 2.2

Beitrag von Flo S »

Eine Frage zur Vereinfachung:
Können wir auch "mehr" vereinfachen als in der Aufgabe gefordert wird?
z.B. wenn wir einen ifCommand haben, jedoch die Expression immer "true" ist, wir den ifCommand durch den Command aus dem ersten Unterbaum ersetzen, oder das gleiche bei ifExpression uvm

Jens Huthmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 192
Registriert: 10. Nov 2011 19:42

Re: Aufgabe 2.2

Beitrag von Jens Huthmann »

Echo hat geschrieben:Zum Anzeigen des AST:

1) show(); ist lediglich deprecated - funtioniert aber noch ohne Probleme und muss nicht gegen setVisible(true) getauscht werden (Ist aber sauberer).
2) Das Einkommentieren kann man sich sparen, damit wird der AST lediglich zweimal gezeichnet (vgl. Complier.java Zeile 87 und 92)
3) Zum Anzeigen des Fensters muss der dritte Parameter beim Aufruf der Funktion compileProgram in Compiler.java Zeile 127 auf true gesetzt werden.
4) Damit das Fenster mit dem AST nicht direkt wieder geschlossen wird, reicht das Auskommentieren von System.exit(...) in Compiler.java Zeile 128. (Quicker&Dirtier ;))
Das stimmt, darauf hab ich nicht geachtet. Danke!
Flo S hat geschrieben:Eine Frage zur Vereinfachung:
Können wir auch "mehr" vereinfachen als in der Aufgabe gefordert wird?
z.B. wenn wir einen ifCommand haben, jedoch die Expression immer "true" ist, wir den ifCommand durch den Command aus dem ersten Unterbaum ersetzen, oder das gleiche bei ifExpression uvm
Das können Sie machen ist aber nicht gefordert. Für mehr Leistung werden wir Sie sicherlich nicht bestrafen.

Antworten

Zurück zu „Archiv“