ccebinger / SWPSoSe14

2 stars 1 forks source link

String and int distinction #76

Closed Zelldon closed 10 years ago

Zelldon commented 10 years ago

Moin Jonas,

wir hatten ja am Montag im TS darueber geredet das wir das nur mit Strings alles machen koennen.

Ich hab eventuell eine alternative gefunden mithilfe von instanceof (c1)* Wir koennen wenn wir die Konstanten pushen( im Compiler) pruefen ob das arg jetzt ein int ist oder string und pushen je nachdem das richtige auf den Stack.

Wenn jetzt eine arithmetische operation kommt rechnen wir einfach die Integer zusammen ohne zu casten (wenn ein arg ein String ist crashed es, genauso wie in der Rail spec) Wenn wir jetzt Strings appenden wollen, koennen wir einfach pruefen ob es sich um ein String handelt via instanceof. Falls nicht rufen wir z.B. einfach Integer.toString(i) auf.

Das ermoeglicht uns dann spaeter auch korrekte Listen zu unterstuetzen und somit muessen wir nicht den kram mit den semikolon seperierten Strings machen.

Also hast du einwende?

LG Chris

*http://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf SEITE 472

jdettlaff commented 10 years ago

Klingt gut. Wir müssen dann allerdings Integer pushen (nicht int!!), da instanceof immer Objektreferenzen bekommt. Und vor arithmetischen Ops die Integer zu int unboxen mit Integer#intValue().

Am 03.06.2014 20:42, schrieb Zelldon:

Moin Jonas,

wir hatten ja am Montag im TS darueber geredet das wir das nur mit Strings alles machen koennen.

Ich hab eventuell eine alternative gefunden mithilfe von instanceof (c1)* Wir koennen wenn wir die Konstanten pushen( im Compiler) pruefen ob das arg jetzt ein int ist oder string und pushen je nachdem das richtige auf den Stack.

Wenn jetzt eine arithmetische operation kommt rechnen wir einfach die Integer zusammen ohne zu casten (wenn ein arg ein String ist crashed es, genauso wie in der Rail spec) Wenn wir jetzt Strings appenden wollen, koennen wir einfach pruefen ob es sich um ein String handelt via instanceof. Falls nicht rufen wir z.B. einfach Integer.toString(i) auf.

Das ermoeglicht uns dann spaeter auch korrekte Listen zu unterstuetzen und somit muessen wir nicht den kram mit den semikolon seperierten Strings machen.

Also hast du einwende?

LG Chris

*http://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf SEITE 472

— Reply to this email directly or view it on GitHub https://github.com/ccebinger/SWPSoSe14/issues/76.

Zelldon commented 10 years ago

Jo das stimmt aber das ist denke ich besser als alles mit Strings zu machen.

ODER:

man prueft nur auf String und wenns kein String war (ergo int was keine referenz hat) gibt instanceof 0 zurueck. Oder meinste das funzt nicht?

jdettlaff commented 10 years ago

Objektreferenzen und sonstige Dinge sind auf dem Operandenstack von außen nicht zu unterscheiden. Man muss selbst wissen, was draufliegt.

Am 03.06.2014 21:19, schrieb Zelldon:

Jo das stimmt aber das ist denke ich besser als alles mit Strings zu machen.

ODER:

man prueft nur auf String und wenns kein String war (ergo int was keine referenz hat) gibt instanceof 0 zurueck. Oder meinste das funzt nicht?

— Reply to this email directly or view it on GitHub https://github.com/ccebinger/SWPSoSe14/issues/76#issuecomment-45008311.

Zelldon commented 10 years ago

Ja das ist mir klar naja is auch egal dann machen wir das so mit den Wrapper Klassen wuerde ich sagen.

jdettlaff commented 10 years ago

Hi, das wird erst bei Listen interessant, die eh Referenzen sind. Wie auch Strings und alle Object-Referenzen aufm Operandenstack. Wir haben keine Wahl, die Referenzarchitektur ist von der JVM eh vorgegeben.

Ich sehe auch nicht so recht, wo wir da Spielraum hätten? Und wodurch genau wir "unfassbar viel RAM" sparen?

Am 03.06.2014 21:24, schrieb SilverBln:

Also eigentlich sollte generell nur mit Referenzen gearbeitet werden. Das spart unfassbar viel RAM, benötigt dann halt Reference Counting...

Esolang Wiki: All variables are really references. Binding a variable or pushing it onto the stack merely copies the reference. This should be relatively transparent as all variables are also immutable and garbage collected. All variables are immutable because no built-in command changes a variable. All built-in commands operate on the variables on the stack.

— Reply to this email directly or view it on GitHub https://github.com/ccebinger/SWPSoSe14/issues/76#issuecomment-45008820.

Zelldon commented 10 years ago

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.instanceof

Jonas hast du ne Idee wie ich an den index im constant pool komme?

EDIT: hat sich denke erledigt

jdettlaff commented 10 years ago

Dafür muss halt eine Klassenreferenz (java/lang/String bzw. java/lang/Integer) im Constant Pool sein, wie du die bekommst frag halt Maurice oder guck in die Doku vom Constant Pool.

Zelldon commented 10 years ago

Wie bereits da steht hat es sich erledigt...habs ja jetzt umgesetzt...

jdettlaff commented 10 years ago

Ach. Hehe. Guten Morgen. Ich bin wieder da.

jdettlaff commented 10 years ago

Ist dies jetzt komplett erledigt?

Zelldon commented 10 years ago

ja also im grunde existieren jetzt methoden zu unterscheidung die muessen dann nur verwendet werden ordentlich :D

ich schliesse damit mal das ticket