Załóżmy, że piszesz kompilator Java (lub podzestaw Java) i chcesz wygenerować kod bajtowy dla jednoargumentowego wyrażenia, !E
. Sprawdziłeś typ, wiesz, że wiesz E
ma typ boolean
, to znaczy popchnie 1
lub 0
na stos operandów.Generowanie kodu bajtowego JVM dla jednoargumentowego nie wyrażenia
Jednym ze sposobów, aby to zrobić jest coś jak (w składni Jasmin):
E
ifeq truelabel
iconst_0
goto stoplabel
truelabel:
iconst_1
stoplabel:
czyli jeśli istnieje 0 Na naciśnięciem stosu 1, inny Push 0. Innym sposobem, aby to zrobić, korzystając z fakt, że boolean
jest tylko int
o wartości 1
lub 0
, to znaczy !E = (E + 1) % 2
i generować
E
iconst_1
iadd
iconst_2
irem
Czy jest zaletą przy użyciu jednego nad drugim? Lub coś zupełnie innego?
Specyfikacja JVM mówi: "Wirtualna maszyna Java koduje składniki tablicy logicznej, używając 1 do reprezentowania wartości true, a 0 do reprezentowania wartości false.Jeśli wartości logiczne języka programowania Java są mapowane przez kompilatory na wartości typu maszyny wirtualnej Java int, kompilatory muszą używać to samo kodowanie. " http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.3.4 –
@isbadawi To opisuje, w jaki sposób JVM koduje * tablice * booleans i jak kompilatory Java muszą koduj booleany jako ints * kiedy i jeśli to robią w ogóle. * Nie jest to bezpośrednio związane z pytaniem. – EJP
@EJP Wydaje mi się to trochę niejednoznaczne. Pierwsze zdanie dotyczy tablic logicznych, ale drugie dotyczy wartości logicznych. Prawdopodobnie nie mam racji. –