2012-01-12 5 views
7

私は最近、AVM2/AS3用の逆コンパイラを作っています。私は、Flashコンパイラが多くの不必要なコードを出す傾向があることに気付きました。たとえば、特定のアプリケーションでは、コードの10%を削除して機能性を損なうことはありませんでした。これは、条件付きオペコードや例外処理ブロックによって参照されていない確かにデッドコードです。Flash ActionScript3コンパイラが不要なコードを発行するのはなぜですか?

また、このスニペットを見て:まあ、もちろんこれも死んでいるので、(コードベースの膨満感のを除く)任意の悪影響を引き起こすことはありません、無効なコード、

... 
    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   

です。しかし、なぜこのコードを発行するのですか?そしてなぜ検証者はそれを受け入れますか?

+0

例外テーブルからは参照されませんでした(他の多くの命令ではなく、10個の命令 - デッドコードブロック)。仕様から判断すると、ジャンプオペコードまたは例外です。ジャンプもありません。 – whitequark

+0

@wvxvwところで、最終的にブロックされるのはAS3で、奇妙で邪悪なハックです。コンパイラーが意図的に無効なオペコードを生成して検証者を騙し、VMは故意に無視します。 Flashはほんの巨大なWTFです。 – whitequark

+0

@wvxvw、私はあなたを正しく理解しましたか?特定のシーケンスのオペコードを実行すると、VMは実行中のコードが何らかの形でオペコード・ストリームを調べることを可能にします。もしあなたが参照を見つけることができたら+50。 – whitequark

答えて

7

ASCまたはcompcは最適化されません。これは残念ですが、JITがすべての最適化作業を行うという理論です。 2つの定数を追加するなど、さらに悪い例を考え出すことができます。答えは:申し訳ありませんが、最適化されていません。将来的にはより良いコンパイラがあるかもしれません。今では、実行時に最適化作業を行うためにAS3 JITに頼らざるを得ません(これはまともな仕事です)!あるいは別のコンパイラを使用しなければなりません。

+0

はい、もちろん、どこにでも不必要な強制は言わずに、定数などを追加しています。最悪の例はおそらく 'lookupswitch'がcodegenされた方法でしょう。 [LLVM](http://blog.llvm.org/)のように、そのように設計された理由についてのご意見はありますか?あなたが完全に頭を下げない限り、一定の折り畳みは実装するのが難しくありません。 – whitequark

+1

whitequark: "コンパイラ"は単なる栄光のパーサーであり、JITは他のすべてを世話するという理論です。私は個人的にそれが良いデザインだとは思わないが、それはどのようなものなのか。私はいずれかの良い参考文献も知らない。 – starmole

関連する問題