Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Kann jemand diesen Java-Code in IJVM-Code schreiben ohne lokalen Variablen, außer a und b?
Jaa.... INVOKEVIRTUAL braucht eigentlich noch eine OBJREF als erstes Argument, aber IJVM ist seeeeehr merkwürdig, was das angeht. Um "this" auf den Stack zu bekommen, scheint man BIPUSH 0 (also ein Byte-Literal mit Wert = 0) auf den Stack pushen zu müssen, da IJVM keine ALOAD Instruktion hat. Das ist aber _extremst_ weird, weil BIPUSH 0 heißt ja nicht: Lade die OBJREF, die im lokalen Variablenslot 0 liegt (was 'this' entsprechen würde), sondern: lade das Byte mit dem Wert 0 auf den Stack. Und INVOKEVIRTUAL scheint dann den Methodenempfänger als erstes Stack-Argument so zu interpretieren...
Ich verstehe die Aufgabe so, dass man die Methode ggt nach IJVM übersetzen soll, ohne dabei (in IJVM) lokale Variablen zum Speichern von Zwischenergebnissen zu verwenden.
Wo nun genau das Problem liegt, ist mir allerdings auch nicht klar.
Ich verstehe die Aufgabe so, dass man die Methode ggt nach IJVM übersetzen soll, ohne dabei (in IJVM) lokale Variablen zum Speichern von Zwischenergebnissen zu verwenden.
Wo nun genau das Problem liegt, ist mir allerdings auch nicht klar.
Genau wir sollen die Methode ggt nach IJVM übersetzen ohne lokale Variablen zum Speichern von Zwischergebnissen zu verwenden, dürfen nur das a und b verwenden, was auch bei der Methode ist und ich habe das nicht hinbekommen. Das oben waren die Vorgaben.
Also das was ich oben eingefügt habe, war einfach nur eine Vorgabe und unten drunter, sollte der Bytecode hin. Also sollen diese Methode ggt dahin übersetzen. Hatten paar Aufgaben, aber bei der komme ich gar nicht weiter.
Du hast noch nicht beschrieben, wo genau du denn jetzt ein Problem hast. Kannst du deinen möglichen Gedankengang zur eigenen Lösung der Aufgabe beschreiben und sagen, wo du Fragen hast bzw. wo genau du nicht weiterkommst, nachdem du dir lange genug eigene Gedanken zu einer Lösung gemacht hast?
Du hast noch nicht beschrieben, wo genau du denn jetzt ein Problem hast. Kannst du deinen möglichen Gedankengang zur eigenen Lösung der Aufgabe beschreiben und sagen, wo du Fragen hast bzw. wo genau du nicht weiterkommst, nachdem du dir lange genug eigene Gedanken zu einer Lösung gemacht hast?
Aso ja, also mein Problem ist eigentlich, hab bis jetzt immer mit Speicherung der Zwischenergebnissen gearbeitet und noch nie ohne und keinen Plan, wie ich da vorgehen soll.
IJVM ist ja eine stackbasierte Maschine. Der Trick ist hierbei, die Veränderung des Stacks zu simulieren und zu schauen, ob das Zwischenergebnis (welches ja auch erstmal auf dem Stack liegt) bereits "an der richtigen Stelle" liegt, um sofort von einem Methodenaufruf (z.B. INVOKEVIRTUAL ggt) konsumiert zu werden. Du brauchst also keine expliziten neuen lokalen Variablen für Zwischenergebnisse, wenn diese Zwischenergebnisse sowieso schon an der richtigen Stelle im Operand-Stack liegen.
IJVM ist ja eine stackbasierte Maschine. Der Trick ist hierbei, die Veränderung des Stacks zu simulieren und zu schauen, ob das Zwischenergebnis (welches ja auch erstmal auf dem Stack liegt) bereits "an der richtigen Stelle" liegt, um sofort von einem Methodenaufruf (z.B. INVOKEVIRTUAL ggt) konsumiert zu werden. Du brauchst also keine expliziten neuen lokalen Variablen für Zwischenergebnisse, wenn diese Zwischenergebnisse sowieso schon an der richtigen Stelle im Operand-Stack liegen.
Könnte jemand von euch ein Beispiel machen? Wie das funktioniert, dass ich das ohne zwischenvariablen mache? Muss auch nicht die Aufgabe sein, kann irgendetwas sein, damit man das mal sieht?
Jaa.... INVOKEVIRTUAL braucht eigentlich noch eine OBJREF als erstes Argument, aber IJVM ist seeeeehr merkwürdig, was das angeht. Um "this" auf den Stack zu bekommen, scheint man BIPUSH 0 (also ein Byte-Literal mit Wert = 0) auf den Stack pushen zu müssen, da IJVM keine ALOAD Instruktion hat. Das ist aber _extremst_ weird, weil BIPUSH 0 heißt ja nicht: Lade die OBJREF, die im lokalen Variablenslot 0 liegt (was 'this' entsprechen würde), sondern: lade das Byte mit dem Wert 0 auf den Stack. Und INVOKEVIRTUAL scheint dann den Methodenempfänger als erstes Stack-Argument so zu interpretieren, dass das Byte, was dort liegt, dann halt der lokale Variablenslot ist, wo der Receive als OBJREF gespeichert ist.
Ich finde IJVM extrem unintuitive, was das Handling von Objektreferenzen angeht.