2012-01-12 39 views
7

Kısa bir süre önce AVM2/AS3 için bir decompiler ürettim ve Flash derleyicisinin çok fazla gereksiz kod yayma eğiliminde olduğunu fark ettim. Örneğin, belirli bir uygulama için kodun% 10'unu işlevselliğe herhangi bir bozulma olmaksızın kaldırdım. Koşullu opcodes tarafından atıfta bulunulan ve kesinlikle istisna tutma blokları tarafından atıfta bulunulan bir kesinlikle ölü koddu.Flash ActionScript3 derleyicisi neden gereksiz kod yayar?

Ayrıca, bu pasajı bakmak:

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

Tabii bu da öldü ve dolayısıyla (kod temeli şişkinlik hariç) herhangi bir olumsuz etkilere neden olmaz geçersiz koddur. Ama neden bu kodu yayıyor? Ve neden doğrulayıcı bunu kabul ediyor?

+0

Bir istisna tablosundan referans alınmadı (diğer pek çok, daha büyük - 10'lu yönergeler - ölü kod blokları gibi) ve speklerden yargılanarak, ya bir kontrol opoğu aracılığıyla denetimi aktarabilirsiniz veya bir istisna. Ya atlayış yok. – whitequark

+0

@wvxvw Bu arada, 'nihayet' blokları AS3'te garip ve dolambaçlı bir hack ile yapılıyor, burada derleyici kasıtlı olarak doğrulayıcı kodları ve VM'yi kasten geçersiz kılar ve bunları kasten yok sayar. Flash sadece büyük bir WTF. – whitequark

+0

@wvxvw, seni doğru anladım mı? Belirli bir opcodes dizisini yürütürseniz, VM, çalışan kodun veri kümesine iterek muhtemelen bir şekilde opcode akışını incelemesine izin verir. Referansları bulabiliyorsanız +50. – whitequark

cevap

7

ASC veya compc optimize etmiyor. Bu talihsiz bir durumdur, ancak teori JIT'in tüm optimizasyon çalışmalarını yapmasıdır. İki sabit eklemek gibi daha da kötü örneklerle gelebilirsiniz. Yani cevap: Üzgünüm, sadece optimize etmiyor. Gelecekte daha iyi bir derleyici olabilir. Şu anda çalışma zamanında optimizasyon çalışmasını yapmak için AS3 JIT'e güvenmeniz gerekiyor (bu da iyi bir iş yapıyor!) Veya farklı bir derleyici kullanıyor.

+0

Evet, elbette sabitleri ve benzerlerini ekledim, her yerde gereksiz zorlamalardan bahsetmiyorum. Bunun en kötü örneği muhtemelen 'lookupswitch' kodeksidir. Neden bu şekilde tasarlandığına dair herhangi bir referansınız var mı ([LLVM] (http://blog.llvm.org/) gibi)? Sürekli katlama, * tamamen güçlenmedikçe, uygulamak zor değildir. – whitequark

+1

whitequark: Teori, "derleyici" nin sadece yüceltilmiş bir ayrıştırıcı olması ve JIT'in diğer her şeyle ilgilenmesidir. Ben şahsen iyi bir tasarım olduğunu düşünmüyorum, ama nasıl olduğunu. Hiç iyi referanslar bilmiyorum, üzgünüm. – starmole

İlgili konular