2013年2月26日火曜日

pythonのバイトコード命令の比較(1)

Python-on-a-Chip(p14p) pymite の pmImgCreator.py が python のバージョンを 2.6 に制限していたので各 python のバイトコードの命令を比較してみた。

2.5 から 2.6 は STORE_MAP が追加されただけだが、

2.6 から 2.7 へは BUILD_MAP,LOAD_ATTR,COMPARE_OP,IMPORT_NAME,IMPORT_FROM はコード値の入れ替わり。
LIST_APPEND は引数付きに変更。
JUMP_IF_FALSE,JUMP_IF_TRUE は削除、同じコード値の JUMP_IF_FALSE_OR_POP,JUMP_IF_TRUE_OR_POP と互換性があるのかは不明。
そもそも命令名が同じでも全く同じ動作をするのかはまだ分かってないです。

全てのバージョンは dis.HAVE_ARGUMENT=90 です。

pymite は pmImgCreator.py だけを動かして読んでみただけ vm では動かしてないのだが、
2.7 ではイメージは出来るが、既存の vm との互換性がなくて動かないだろう。 2.5 なら動くかもしれない。

,pyMite(p14p),python2.5,python2.6,python2.7
18,LIST_APPEND,LIST_APPEND,LIST_APPEND,None
54,STORE_MAP,None,STORE_MAP,STORE_MAP
94,None,None,None,LIST_APPEND
104,BUILD_MAP,BUILD_MAP,BUILD_MAP,BUILD_SET
105,LOAD_ATTR,LOAD_ATTR,LOAD_ATTR,BUILD_MAP
106,COMPARE_OP,COMPARE_OP,COMPARE_OP,LOAD_ATTR
107,IMPORT_NAME,IMPORT_NAME,IMPORT_NAME,COMPARE_OP
108,IMPORT_FROM,IMPORT_FROM,IMPORT_FROM,IMPORT_NAME
109,None,None,None,IMPORT_FROM
111,JUMP_IF_FALSE,JUMP_IF_FALSE,JUMP_IF_FALSE,JUMP_IF_FALSE_OR_POP
112,JUMP_IF_TRUE,JUMP_IF_TRUE,JUMP_IF_TRUE,JUMP_IF_TRUE_OR_POP
114,None,None,None,POP_JUMP_IF_FALSE
115,None,None,None,POP_JUMP_IF_TRUE

以下、比較に使ったプログラムです。


rem opcmp.bat
c:\python27\python opdump.py > py27.py
c:\python26\python opdump.py > py26.py
c:\python25\python opdump.py > py25.py
c:\python26\python opcmp.py > opcmp.csv

# opdump.py
import dis
opname = dis.opname
for i in range(256):
    if opname[i][0] == "<":
        opname[i] = None
print "opname=" + str(opname)

# opcmp.py
import py27
import py26
import py25
import pmImgCreator
import dis

pic = pmImgCreator.PmImgCreator("pmfeatures.py")

print ",pyMite(p14p),python2.5,python2.6,python2.7"
for i in range(256):
    if len(set([pic.bcodes[i], py25.opname[i], py26.opname[i], py27.opname[i]])) > 1:
        print"%d,%s,%s,%s,%s" % (i, pic.bcodes[i], py25.opname[i], py26.opname[i], py27.opname[i])


(2013/2/26)
---

0 件のコメント: