Aufgabe #3.2

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

Aufgabe #3.2

Beitrag von Echo » 16. Jan 2012 15:01

Hallo,
Aufgabe #3.2 hat geschrieben:Optimieren Sie, falls möglich, in Richtung einer
möglichst kurzen Instruktionssequenz.
Schließt das (1)speichern von Zwischenergebnissen mittels STORE/LOAD, (2)ausmultiplizieren und (3)ausklammern mit ein?
Danke fürs lesen.

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

Re: Aufgabe #3.2

Beitrag von Jens Huthmann » 16. Jan 2012 16:17

Echo hat geschrieben:Hallo,
Aufgabe #3.2 hat geschrieben:Optimieren Sie, falls möglich, in Richtung einer
möglichst kurzen Instruktionssequenz.
Schließt das (1)speichern von Zwischenergebnissen mittels STORE/LOAD, (2)ausmultiplizieren und (3)ausklammern mit ein?
Nur (1) das Speichern von Zwischenergebnissen mittels STORE/LOAD ist gemeint.

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

Re: Aufgabe #3.2

Beitrag von Flo S » 18. Jan 2012 15:18

Also, da mir das etwas merkwürdig vorkommt um ganz sicher zu sein nochmal die Frage:

Wir sollen den gegebenen Term also NICHT per ausklammern und ausmultiplizieren verkürzen
sondern nur durch Nutzung von Store/Load Befehlen.
Falls ja, können wir dann davon ausgehen, dass alle Befehle genau gleich viel "kosten", da es
ja nur um die Länge des Terms, nicht um die eigentliche Ausführungszeit geht?

Dennis Albrecht
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 222
Registriert: 4. Okt 2010 18:15

Re: Aufgabe #3.2

Beitrag von Dennis Albrecht » 19. Jan 2012 17:03

Aber wenn nur Optimierungen hinsichtlich STORE/LOAD gemeint sind, kann man sich das Optimieren komplett sparen, da man keine kürzeren Anweisungsketten erzeugen kann (Term berechnen, Ergebnis in einer Variablen zwischenspeichern (damit verschwindet der Wert vom Stack), Wert wieder auf den Stack laden, weiter rechnen, Wert erneut laden und verrechnen). STORE/LOAD kann einem nur dann Rechenschritte abnehmen, wenn man einen Term mehr als zweimal benötigt oder er mehr als eine Rechenoperation beinhält (a*b lohnt sich erst ab drei Erscheinungen; a*b*c schon, wenn es zweimal auftritt).

Aber zu der Frage, die mich eigentlich ins Forum getrieben hat:
ist -4 ein Literal (LOADL -4) oder eine Differenz (LOADL 0, LOADL 4, SUB)?
Flo S hat geschrieben:Falls ja, können wir dann davon ausgehen, dass alle Befehle genau gleich viel "kosten", da es
ja nur um die Länge des Terms, nicht um die eigentliche Ausführungszeit geht?
Davon würde ich in jedem Fall ausgehen.

Dennis Albrecht
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 222
Registriert: 4. Okt 2010 18:15

Re: Aufgabe #3.2

Beitrag von Dennis Albrecht » 25. Jan 2012 16:32

Dennis Albrecht hat geschrieben:Aber zu der Frage, die mich eigentlich ins Forum getrieben hat:
ist -4 ein Literal (LOADL -4) oder eine Differenz (LOADL 0, LOADL 4, SUB)?
Um mal meine eigene Frage nochmal etwas auszuweiten:
Ich hab mich eben nochmal in Scanner, Parser und Checker eingelesen. Weder Scanner und Parser noch der Checker können die Eingabe -4 ordentlich verarbeiten:
Aus dem Minus macht der Scanner ein Operator und aus der 4 ein Integerliteral. Der Parser produziert daraus eine UnaryExpression. Problematisch wird dann die Interpretation im Checker, da -4 nicht funktionieren kann, da Minus zwei Operanten braucht, aber nur die 4 bekommt. (Als (Zwischen-)Ergebnis ist eine negative Zahl kein Problem, es gibt aber anscheinend die Einschränkung, dass man nicht direkt negative Zahlen eingeben kann)

Jetzt stellt sich die Frage, ob wir diese Einschränkung im gegebenen Triangle-Compiler einfach ignorieren dürfen (was die Triangle-Spezifikationen zum Thema negative IntegerLiterale aussagen hab ich jetzt nicht nachgeschaut) und einen direkten LOADL -4 machen dürfen, oder beim Umsetzen in Befehle einen "0 - 4"-Ausdruck machen sollen.

Ungeachtet dessen ist mir immer noch nicht klar, ob wirklich nur LOAD/STORE-Optimierungen erlaubt sind, da ich dann kein Optimierungspotenzial sehe (auch ist die Analyse auf LOAD/STORE-Optimierungen eines algorithmischen Ausdrucks ähnlich "schwierig" wie eine komplette mathematische Optimierung eines solchen Ausdrucks).

Gruß

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

Re: Aufgabe #3.2

Beitrag von Jens Huthmann » 25. Jan 2012 16:45

Wir sind nochmal die Aufgabe durchgegangen und erlauben nun auch mathematische Optimierungen wie ausklammern, umstellen usw. Gefordert werden diese aber nicht sein.

-4 ist tatsächlich nicht erlaubt. Korrekt wäre 0-4, was zu LOADL 0, LOADL4, sub wird.

Code: Alles auswählen

let
  var x : Integer;
  const n ~ 0-1
in
  x := n + 1;
wird zu

Code: Alles auswählen

0:  PUSH        1
1:  LOADL       0
2:  LOADL       1
3:  CALL        sub     
4:  LOAD  (1)   1[SB]
5:  LOADL       1
6:  CALL        add     
7:  STORE (1)   0[SB]
8:  POP   (0)   2
9:  HALT  
Verwenden sie daher wenn möglich die 0-4 schreibweise oder stellen sie um. Ich lerne auch aus den Fehlern in der Aufgabestellung und hoffe das ich diese in der Klausur vermeiden kann.

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

Re: Aufgabe #3.2

Beitrag von Echo » 25. Jan 2012 19:51

Jens Huthmann hat geschrieben:Ich lerne auch aus den Fehlern in der Aufgabestellung und hoffe das ich diese in der Klausur vermeiden kann.
Wir würden uns bereit erklären im Vorfeld einen Blick über die Aufgaben zu werfen :wink: *scnr*

Spaß beiseite: Finde es gut, dass hier so transparent mit kleinen Fehlerchen in der Übung umgegangen wird und nicht stillschweigend eine neue Version der Übung hochgeladen wird, bei der man dann nicht volle Punktzahl bekommt, wenn man die neueste Version nicht 5 min vor Abgabeschluss nochmal runterlädt.
Danke fürs lesen.

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

Re: Aufgabe #3.2

Beitrag von Flo S » 25. Jan 2012 22:59

Jens Huthmann hat geschrieben:

Code: Alles auswählen

0:  PUSH        1
1:  LOADL       0
2:  LOADL       1
3:  CALL        sub     
4:  LOAD  (1)   1[SB]
5:  LOADL       1
6:  CALL        add     
7:  STORE (1)   0[SB]
8:  POP   (0)   2
9:  HALT  
.
Geht mir jetzt weniger um den Inhalt des Programms, als um einige wenige Zeilen, um genau zu sein Zeilen 3 und 6. In den Folien (Foliensatz 4, Folie 34) wird add und sub direkt als Befehl verwendet und nicht erst gecalled. Diese Operation steht uns auf Folie 33 auch nicht zur Verfügung. Daher schätze ich mal, dass wir die Befehle auch direkt so benutzen können und nicht callen müssen?

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

Re: Aufgabe #3.2

Beitrag von Jens Huthmann » 26. Jan 2012 09:09

Ja, sie müssen bei dieser Aufgabe kein Call benutzen. Der Assembler Code stellt nur das tatsächliche fertige Ergebniss da, welches die TAM ausführen kann.

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

Re: Aufgabe #3.2

Beitrag von JanM » 26. Jan 2012 09:33

Außerdem werden ja auch noch die Variablen nicht mit LOAD 1[SB] geladen, sondern direkt mit LOAD a (zum beispiel).
Wurde ja auch in der Vorlesung so gemacht, halt in einer vereinfachteten Schreibweise.

Von daher hab ich das jetzt auch so gemacht. Denke mal das ist ok, weil es ja auch in den Folien so gemacht wurde.

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

Re: Aufgabe #3.2

Beitrag von Echo » 26. Jan 2012 10:42

So wie ich die Sache verstehe, müsste es ohnehin abhängig von der Architektur der Stackmaschine sein, ob man nun einen eigenen Opcode für die grundlegenden mathematischen Operationen hat, oder ob eine entsprechende Funktion dafür gecallt werden muss. Semantisch ist es ohnehin das Gleiche. Bei der Syntax habe ich mich an Folie 33 / Foliensatz 4 gehalten.
Danke fürs lesen.

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

Re: Aufgabe #3.2

Beitrag von Jens Huthmann » 26. Jan 2012 12:18

Die vereinfachte Schreibweise reicht aus. Sorry für die Verwirrung durch das Beispiel.

AlexanderF
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 140
Registriert: 2. Mai 2010 17:55

Re: Aufgabe #3.2

Beitrag von AlexanderF » 26. Jan 2012 13:01

hallo,

ich habe noch eine Frage zu dem bisher geschriebenen.

"-4 ist tatsächlich nicht erlaubt"

Also ist als Triangle Ausdruck -4 nicht erlaubt, ok,
aber die Aufgabe lautet doch,
mit Hilfe der Instruktionen von Folie 4-33
eine möglichst kurzen Instruktionssequenz für angegebene Ausdrücke zu schreiben,
oder habe ich das falsch verstanden?

und von daher ist doch die Frage, ob -4 ein gültiger Triangle Ausdruck ist hier weniger von Bedeutung,
als die Frage, ob LOADL -4 ein gültiger TAM Befehl ist?

und das ist er, soweit ich erkennen kann,
denn wenn ich im Buch nachschlage für den Befehl LOADL d (Seite 410)
stoße ich darauf, dass das Feld d als ein 16 bit (signed)(also auch negative Zahlen möglich) angegeben ist (Seite 408).

oder habe ich an der Aufgabe irgendetwas falsch verstanden?

freundliche Grüße,
Alexander

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

Re: Aufgabe #3.2

Beitrag von Jens Huthmann » 26. Jan 2012 13:41

Machen Sie ein 0-4 daraus.

AlexanderF
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 140
Registriert: 2. Mai 2010 17:55

Re: Aufgabe #3.2

Beitrag von AlexanderF » 26. Jan 2012 14:46

hallo,

ich verstehe die Aussage

"Machen Sie ein 0-4 daraus."
nicht ganz

soll ich etwa aus

LOADL -4

ein

LOADL 0-4 machen?


oder aus dem

... LOADL -4 ADD

ein

...LOADL 4 SUB


gut, das lässt sich machen,

aber ich verstehe nicht ganz, warum das erfoderlich sein soll?


freundliche Grüße,
Alexander

Antworten

Zurück zu „Archiv“