2012-10-11 15 views
6

मैं कुछ लुआ कोड लिख रहा हूं जो bytecode को string.dump() फ़ंक्शन द्वारा उत्पन्न कर सकता है। मैं मान रहा हूं (क्योंकि यह कुछ अनुकूलन और कम कोडिंग के लिए अनुमति देता है) कि सभी OP_JMP निर्देश अगर कथन के लिए उपयोग किए जाने पर निर्देश सूचक को आगे बढ़ाते हैं। वे तकनीकी रूप से पीछे की तरफ कूद सकते हैं क्योंकि वे एसबीएक्स मूल्य का उपयोग करते हैं (जो नकारात्मक हो सकता है)। मुझे मानक लुआ 5.1 कार्यान्वयन से बयान के बाइटकोड में दिलचस्पी है।'if' statments के लिए लुआ बाइटकोड पीछे की तरफ कूद सकता है?

मैंने कुछ नमूने के लिए बाइटकोड देखने के लिए chunkspy (भयानक टूल बीटीडब्ल्यू) का उपयोग किया था।

यहाँ एक बुनियादी है अगर बयान:

a, b = 1, 2 
if a == b then 
    print '=' 
elseif a < b then 
    print '<' 
else 
    print '>' 
end 

यह चार छलांग, जिनमें से कोई भी नकारात्मक हैं पैदा करता है:

[08] jmp 4; to [13] 
[12] jmp 11; to [24] 
[16] jmp 4; to [21] 
[20] jmp 3; to [24] 

मैं Lua source code में जवाब की तलाश में करने की कोशिश की, लेकिन यह सिर्फ समाप्त हो गया भ्रमित होने (मुझे यकीन है कि यह सुपर सुरुचिपूर्ण कोड है अगर मैंने समय के साथ पकड़ने में समय बिताया)।

क्या किसी को 'if' कथन के मामले के बारे में पता है जहां लुआ के OP_JMP निर्देश के पास एसबीएक्स के लिए ऋणात्मक मूल्य है या पता है कि वे हमेशा सकारात्मक मूल्य हैं या नहीं?

+2

'luac -p -l' आपको एक बाइटकोड सूची भी देता है। – lhf

उत्तर

5

लघु जवाब: (किसी भी अनुकूलित संकलक पर, langauage स्वतंत्र) बयान नकारात्मक JMPs का उत्पादन नहीं कर सकते हैं। इस तथ्य यह है कि एक पिछड़े जम्प केवल किसी भी संकलक द्वारा उत्पन्न हो जाएगा अगर यह कुछ कोड है कि यह पहले से अनुवादित दोहराने की जरूरत है की वजह से है (: लुआ OP_JMP छोरों और गोटो बयान (http://lua-users.org/wiki/GotoStatement)

लांग उत्तर के लिए नकारात्मक हो सकता के लिए, जबकि loops ..)। यदि यह "नए" आईएफ-कथन पर कदम उठाता है तो यह हमेशा एक सशर्त जेएमपी और परिणामी कोड/बाइटकोड अगले अधिष्ठापन के रूप में रखेगा।

दूसरी तरफ एक "अजीब" कंपाइलर नकारात्मक IF कूद सकता है। लेकिन वह समझ में नहीं आता है। किसी निश्चित स्थान पर नकारात्मक IF JMP होने के लिए, किसी को पहले से ही उस स्थान को (सकारात्मक जेएमपी द्वारा) छोड़ दिया जाना चाहिए, इसलिए इसे निष्पादन गति के संदर्भ में अनुकूलित किया जा सकता है।

+0

धन्यवाद, यह जानना बहुत उपयोगी है! – Ryan

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