Diciamo che stai scrivendo un compilatore Java (o sottoinsieme di Java) e vuoi generare bytecode per un'espressione non unaria, !E
. Hai passato il controllo di tipo in modo da sapere che è boolean
, ad esempio, se si preme un 1
o uno 0
nella pila degli operandi.Generazione di un bytecode JVM per un'espressione non unaria
Un modo per farlo è qualcosa di simile (nella sintassi Jasmin):
E
ifeq truelabel
iconst_0
goto stoplabel
truelabel:
iconst_1
stoplabel:
cioè se c'è uno 0 sulla spinta pila 1, altrimenti spinta 0. Un altro modo per farlo, approfittando del fatto che un boolean
è solo un int
con un valore 1
o 0
, vale a dire !E = (E + 1) % 2
e generare
E
iconst_1
iadd
iconst_2
irem
c'è un vantaggio di utilizzare uno sopra l'altro? O qualcos'altro interamente?
La specifica JVM dice: "La Java virtual machine codifica i componenti dell'array booleano usando 1 per rappresentare true e 0 per rappresentare false. Dove i valori booleani del linguaggio di programmazione Java sono mappati dai compilatori ai valori del tipo di macchina virtuale Java int, i compilatori devono utilizzare il stessa codifica. " http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.3.4 –
@isbadawi Descrive come la JVM codifica * array * di valori booleani e come i compilatori Java devono codifica booleans come ints * quando e se lo fanno affatto. * Non è immediatamente rilevante per la domanda. – EJP
@EJP Mi sembra un po 'ambiguo. La prima frase riguarda gli array booleani, ma la seconda riguarda i valori booleani. Probabilmente ho sbagliato comunque. –