2012-01-23 17 views
8

2-tuples listesinden opcodes ve argümanlarıyla Python bayt kodu oluşturmanın kolay bir yolu var mı? ÖrneğinOpcodes ve argümanlar listesinden Python bayt kodu oluşturun?

:

>>> bytecode_compile([ 
     ('LOAD_CONST', 2), 
     ('STORE_FAST', 'a'), 
     ('LOAD_FAST', 'a'), 
     ('RETURN_VALUE',)]) 
'd\x01\x00}\x00\x00|\x00\x00S' 
+1

Python kodunu yazarken ve bunu yapmak için Python derleyicisini kullanmanın nesi yanlış? –

+2

http://code.google.com/p/byteplay/ – reclosedev

+0

@ S.Lott Yeterince adil. Neden bu kadar zor şeyler yapmaya çalıştığımı bilmiyorum. – exupero

cevap

2

Ben montajcı var olan bir Python "bayt kodu takımını" sanmıyorum, ama çok zor kendiniz bir inşa etmek olduğunu olmayabilir. Python-X.Y.Z/Include/opcode.h'daki python kaynak kodunda, opcodes için tüm bayt kodları aldıkları argümanlarla listelenir.

+0

döndürmek için 'dis' modülü ile benzer bir liste de alabilirsiniz, örn. 'len (dis.opmap)', 101 opcode'unda Python 3.4.3'ün 103. koduna karşı 101 değerini döndürür. – ilyaigpetrov

1

Bu here hakkında yazdım, bu yüzden tekrar etmeyeceğim, ancak bazı özet yorumlar vereceğim.

Bu kesinlikle yapılabilir, ancak ne kadar kullanışlı olacağı merak ediyorum. Bağlantı, böyle şeylerin nasıl çalıştırılacağını ve yazılacağını anlatıyor.

Bayt kodunun her ikisi de opcode veya opcode adları veya opcodes'lerin sürümleri arasındaki anlam açısından değişebilir. Aslında, Python 3.6'da ve bir bayt kodunun ötesinde bir kelime kodu olur.

Ancak, bu yolda xdis aşağıya doğru gitmeye karar verirseniz, yalnızca bunu yapmak için list2bytecode() işlevini eklediniz.