2012-10-11 18 views
6

Ben string.dump() işlevi tarafından üretilen bytecode okuyabilen bazı Lua kodu yazıyorum. Varsayalım ki (birkaç optimizasyon ve daha az kodlamaya izin verdiği için) tüm OP_JMP komutları, eğer ifadeler için kullanıldığında talimat işaretçisini ileriye doğru yükseltir. Teknik olarak geriye doğru atlayabilirler çünkü sBx değerini kullanırlar (negatif olabilirler). Ben sadece standart Lua 5.1 uygulamasının ifadeleri ile ilgili bayt kodu ile ilgileniyorum.'Luo' ifadeleri için Lua bayt kodu geriye doğru atlayabilir mi?

Birkaç örnek için bytecode'a bakmak için chunkspy (harika araç btw) kullanılır.

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

Bu negatif hiçbiri dört atlayışları, üretir:

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

ben Lua source code Cevapları aradık ancak bu sadece sona erdi deyimi varsa burada

bir temel kafa karıştırıcı olmak (Eminim ki zamanla uğraşmak için harcadığım zaman süper zarif koddur).

lua'nın OP_JMP komutunun sBx için negatif bir değere sahip olduğu veya her zaman pozitif değerler olup olmadığını bilen 'if' ifadeleri için bir vaka bilen var mı?

+2

'luac -p -l' ayrıca bir bayt kodu listesi verir. – lhf

cevap

5

Kısa yanıt: IF ifadeleri, negatif JMP'ler (herhangi bir en iyi duruma getirilmiş derleyici, bağımsız olarak langauage) üretemez. Bu zaten çevrilmiş bazı kod tekrarlamak gerekirse bir geriye JUMP sadece herhangi bir derleyici tarafından oluşturulacak olmasından kaynaklanmaktadır (: Lua OP_JMP döngüler ve git tablolara (http://lua-users.org/wiki/GotoStatement)

Uzun Cevap için negatif olabilir için, döngüler ..). Eğer bir "yeni" IF-deyimine basarsa, her zaman bir koşullu JMP'yi ve sonuçta oluşan kod/bytecode'u sonraki talimatlar olarak koyar. Diğer yandan bir "garip" derleyici, negatif IF sıçramalarını üretebilir. Ama bu mantıklı değil. Belirli bir konuma negatif bir IF JMP'si olması için, geçmişte bu konumun atlanmasının (pozitif bir JMP ile) halihazırda atlanması gerekir, bu yüzden yürütme hızı açısından optimize edilmiş kod olamaz.

+0

Teşekkürler, bu bilmek çok yararlı! – Ryan