7

我最近为 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         

好吧,这当然是无效的代码,它也是死的,因此不会造成任何不利影响(除了代码库膨胀)。但是为什么它会发出那个代码呢?为什么验证者会接受呢?

4

1 回答 1

7

ASC 或 compc 不优化。这是不幸的,但理论上是 JIT 完成了所有的优化工作。你可以想出更糟糕的例子,比如添加两个常量。所以答案是:对不起,它只是没有优化。将来可能会有更好的编译器。现在,您必须依靠 AS3 JIT 在运行时进行优化工作(它做得不错!)或使用不同的编译器。

于 2012-02-03T04:44:56.773 回答