假设您正在编写Java(或Java子集)编译器,并且想要为一元非运算符
其中一种方法是使用以下类似的代码(以Jasmin语法表示):
有没有一种方法比另一种更有优势呢?还是完全有其他方法可行?
!E
生成字节码。您已经完成了类型检查,因此知道E
的类型为boolean
,即它将在操作数栈上推送1
或0
。其中一种方法是使用以下类似的代码(以Jasmin语法表示):
E
ifeq truelabel
iconst_0
goto stoplabel
truelabel:
iconst_1
stoplabel:
即,如果栈上有0,则推入1,否则推入0。另一种方法是利用一个布尔值只是一个带有值为1或0的int类型,可以使用!E =(E + 1)% 2
来生成。
E
iconst_1
iadd
iconst_2
irem
有没有一种方法比另一种更有优势呢?还是完全有其他方法可行?
^ 1
,这绝对比第二个更好。你知道为什么从前者切换到后者的原因吗?或者为什么一开始没有使用^ 1
呢? - Ismail Badawijavac 1.6.0_26
,它生成了第一个(除了ifne
而不是ifeq
),所以我猜他们又换回来了。我想我仍然在想其中一个与另一个的好处。 - Ismail Badawi