Почему компилятор Flash ActionScript3 генерирует ненужный код? - PullRequest
7 голосов
/ 12 января 2012

Я недавно сделал декомпилятор для AVM2 / AS3 и заметил, что Flash-компилятор имеет тенденцию выдавать много ненужного кода.Например, для определенного приложения я удалил около 10% кода без ущерба для функциональности.Это был просто мертвый код, на который не ссылались ни условные коды операций, ни блоки обработки исключений.

Также посмотрите на этот фрагмент:

    ...
    313     setproperty         y
    315     getlocal            12
<b>    317     returnvalue         
    318     jump                L9</b>

    L3: 
    322     getlocal            8
    324     returnvalue         

    L9: 
<b>    325     jump                L10</b> ; 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         

Ну, конечно, это неверный код,также мертв и, следовательно, не будет вызывать каких-либо побочных эффектов (кроме вздутие живота кодовой базы).Но почему он вообще испускает этот код?И почему верификатор принимает это?

1 Ответ

7 голосов
/ 03 февраля 2012

ASC или compc не оптимизировать. Это прискорбно, но теория заключается в том, что JIT выполняет всю работу по оптимизации. Вы можете привести еще худшие примеры, такие как добавление двух констант. Итак, ответ: извините, это просто не оптимизировать. Там может быть лучший компилятор в будущем. Прямо сейчас вы должны положиться на AS3 JIT, чтобы выполнить работу по оптимизации во время выполнения (что она делает достойно!) Или использовать другой компилятор.

...