2012-01-12 12 views
7

मैंने हाल ही में एवीएम 2/एएस 3 के लिए एक डिकंपेलर बनाया है, और मैंने देखा है कि फ्लैश कंपाइलर बहुत सारे असुरक्षित कोड को उत्सर्जित करता है। उदाहरण के लिए, एक निश्चित अनुप्रयोग के लिए मैंने कार्यक्षमता में किसी भी हानि के बिना कोड के लगभग 10% को हटा दिया है। यह केवल निश्चित रूप से मृत कोड था जिसे सशर्त ओपोड्स द्वारा संदर्भित नहीं किया गया था और न ही अपवाद हैंडलिंग ब्लॉक द्वारा।फ्लैश एक्शनस्क्रिप्ट 3 कंपाइलर अनावश्यक कोड क्यों छोड़ता है?

इसके अलावा, इस स्निपेट को देखो:

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

ठीक है, निश्चित रूप से यह अमान्य कोड है, जो भी मर चुका है और इसलिए (codebase सूजन के अलावा) कोई प्रतिकूल प्रभाव पैदा नहीं होगा। लेकिन यह कभी भी उस कोड को क्यों छोड़ देता है? और सत्यापनकर्ता इसे क्यों स्वीकार करता है?

+0

इसे अपवाद तालिका से संदर्भित नहीं किया गया था (जैसा कि बहुत अधिक नहीं था, बहुत अधिक - निर्देशों के 10 - मृत कोड ब्लॉक), और spec से निर्णय लेते हुए, आप या तो एक कूद ऑपोड के माध्यम से नियंत्रण स्थानांतरित कर सकते हैं या एक अपवाद। कोई कूद नहीं है। – whitequark

+0

@wvxvw वैसे, 'अंत में ब्लॉक एएस 3 में एक अजीब और भयानक हैक के साथ किए जाते हैं, जहां कंपाइलर जानबूझकर चालक और वीएम चाल करने के लिए अमान्य ऑपोडोड उत्पन्न करता है, फिर जानबूझकर, उन्हें अनदेखा करता है। फ्लैश सिर्फ एक विशाल डब्ल्यूटीएफ है। – whitequark

+0

@wvxvw, क्या मैंने आपको सही ढंग से समझा है? यदि आप ऑपकोड का एक निश्चित अनुक्रम निष्पादित करते हैं तो वीएम चलने वाले कोड को किसी भी तरह से अपने ओपोड स्ट्रीम की जांच करने की अनुमति देता है, संभवतः उन्हें डेटा स्टैक पर धक्का देकर? +50 यदि आप संदर्भ पा सकते हैं। – whitequark

उत्तर

7

एएससी या कॉम्प ऑप्टिमाइज़ नहीं करते हैं। यह दुर्भाग्यपूर्ण है, लेकिन सिद्धांत यह है कि जेआईटी सभी अनुकूलन कार्य करता है। आप दो स्थिरांक जोड़ने जैसे और भी बदतर उदाहरणों के साथ आ सकते हैं। तो जवाब है: क्षमा करें, यह सिर्फ अनुकूलन नहीं करता है। भविष्य में एक बेहतर संकलक हो सकता है। अभी आपको रनटाइम पर ऑप्टिमाइज़ेशन काम करने के लिए एएस 3 जेआईटी पर भरोसा करना है (जो यह एक सभ्य नौकरी करता है!) या एक अलग कंपाइलर का उपयोग करें।

+0

हां, मैंने निश्चित रूप से स्थिरांक जोड़ना देखा और इस तरह, हर जगह अनावश्यक जबरदस्ती का उल्लेख नहीं किया। इसका सबसे बुरा उदाहरण शायद 'लुकअपविच' को कोडजेन किया गया है। क्या आपके पास इस बारे में कोई संदर्भ नहीं है कि यह इस तरह क्यों डिज़ाइन किया गया है (जैसे [एलएलवीएम] (http://blog.llvm.org/) है)? लगातार फोल्डिंग * उस * को लागू करने के लिए कठिन नहीं है, जब तक कि आप पूरी तरह से braindead नहीं हैं। – whitequark

+1

व्हाइटक्वार्क: सिद्धांत यह है कि "कंपाइलर" सिर्फ एक गौरवशाली पार्सर है और जेआईटी अन्य सभी का ख्याल रखेगा। मैं व्यक्तिगत रूप से नहीं सोचता कि यह एक अच्छा डिजाइन है, लेकिन यह कैसा है। मुझे खेद है, किसी भी अच्छे संदर्भ के बारे में मुझे नहीं पता। – starmole

संबंधित मुद्दे