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 がすべての最適化作業を行うというものです。2 つの定数を追加するなど、さらに悪い例を考え出すことができます。答えは次のとおりです。申し訳ありませんが、最適化されていません。将来的には、より優れたコンパイラが登場する可能性があります。現時点では、AS3 JIT に依存して実行時の最適化作業を行うか (適切な仕事をしています!)、別のコンパイラを使用する必要があります。

于 2012-02-03T04:44:56.773 に答える