ASC或compc不进行优化。这很不幸,但理论上JIT完成了所有的优化工作。你可以想出更糟糕的例子,比如加两个常数。所以答案是:对不起,它只是没有优化。将来可能会有更好的编译器。现在,您必须依靠AS3JIT在运行时完成优化工作(它在这方面做得很好!),或者使用不同的编译器。
我最近为AVM2/AS3做了一个反编译器,我注意到Flash编译器往往会发出很多不必要的代码。例如,对于某个应用程序,我删除了大约10%的代码,而没有对功能造成任何损害。它只是一个毫无疑问的死代码,既没有被条件操作码引用,也没有被异常处理块引用。
另外,看看这个片段:
...
313 setproperty y
315 getlocal 12
317 returnvalue
318 jump L9
L3:
322 getlocal 8
324 returnvalue
L9:
325 jump L10 ; L10 (opcode #331) does not ever exist.
; Technically, it is a jump beyond
; the end of function. This is invalid code!
L2:
329 pushnull
330 returnvalue
当然,这是无效的代码,它也是死的,因此不会造成任何不利影响(除了代码库膨胀)。但为什么它会发出这种代码呢?为什么验证者会接受这一点?