2012-01-12 2 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 Кстати, блоки «finally» выполняются в AS3 со странным и хитрым взломом, когда компилятор сознательно генерирует неверные коды операций для проверки трюков и виртуальной машины, снова сознательно игнорирует их. Flash - это просто огромная WTF. – whitequark

+0

@wvxvw, правильно ли я понял вас? если вы выполняете определенную последовательность кодов операций, то виртуальная машина позволяет запущенному коду каким-то образом проверять поток своего кода, предположительно, путем нажатия их в стек данных? +50, если вы можете найти ссылки. – whitequark

ответ

7

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

+0

Да, я, конечно, видел добавление констант и т. Д., Не говоря уже о ненужном принуждении повсюду. Худшим примером этого является, вероятно, то, как «lookupswitch» является codegen'd. Есть ли у вас какие-либо ссылки о том, почему он создан таким образом (например, [LLVM] (http://blog.llvm.org/))? Постоянное сгибание не *, которое * трудно реализовать, если вы не будете полностью braindead. – whitequark

+1

whitequark: Теория состоит в том, что «компилятор» - это просто прославленный парсер, и JIT позаботится обо всем остальном. Я лично не думаю, что это хороший дизайн, но как это. Я тоже не знаю никаких хороших ссылок, извините. – starmole

Смежные вопросы