Python 的 decompiler
搜尋 python 的 decompiler,可以找到像是 decompyle, unpyc, 但似乎不是太舊,就是有沒有開放,總之就是沒辦法真的用(更正:原本寫得時候沒有注意到 uncompyle2,而 unpyc 其實也沒那麼舊)。
在注意 clyther (簡單來說,是 python to opencl compiler)時,發現了 meta 這個 package。
取這種名字通俗的名字,下場註定就是讓你很難用 google 搜尋到。但 decompile 的結果看起來還不錯。
比方用 meta.decompile(some_code_object),就能把 some_code_object 反編譯成 ast。
用 meta.decompiler.decompile_func(some_func),就能把函數反編譯 ast。
然後用 meta.dump_python_source(ast) ,就能把原始碼印出來了。
不過注意到的原因,還是因為 meta programming 的關係。
最近用 python 寫 psx emulator,效率當然很差,一個問題就是 python 沒有 inline 和 switch statement。當然硬用 if else 寫,然後手動 inline 也行,但是實在太醜。
後來的解法是用 pythonic 的寫法寫,但是用 meta programming 的方式(用 decorator)把 dict based 的寫法換成 switch,然後順便把 function inline。
但是問題是,讀取 source 只能用 inspect 來讀。但是程式碼本身如果已經是動態產生時,inspect 就讀不出來。因為寫 decompiler 工程浩大,我取巧的方式是動態產生程式碼的時候,順便把程式碼寫入暫存檔。附帶的好處是,除錯也方便些。
clyther 做的事情也類似,也是用 decorator 把 python function 轉換,翻譯成 opencl。查看之下,才發現他還真的把 decompiler 寫出。
不過試用了一下,就發現了好幾個 bug,看起來還不算完全成熟。
不過未來倒是挺看好這一塊進入 python 的標準 lib,補足 ast 的功能。
在注意 clyther (簡單來說,是 python to opencl compiler)時,發現了 meta 這個 package。
取這種名字通俗的名字,下場註定就是讓你很難用 google 搜尋到。但 decompile 的結果看起來還不錯。
比方用 meta.decompile(some_code_object),就能把 some_code_object 反編譯成 ast。
用 meta.decompiler.decompile_func(some_func),就能把函數反編譯 ast。
然後用 meta.dump_python_source(ast) ,就能把原始碼印出來了。
不過注意到的原因,還是因為 meta programming 的關係。
最近用 python 寫 psx emulator,效率當然很差,一個問題就是 python 沒有 inline 和 switch statement。當然硬用 if else 寫,然後手動 inline 也行,但是實在太醜。
後來的解法是用 pythonic 的寫法寫,但是用 meta programming 的方式(用 decorator)把 dict based 的寫法換成 switch,然後順便把 function inline。
但是問題是,讀取 source 只能用 inspect 來讀。但是程式碼本身如果已經是動態產生時,inspect 就讀不出來。因為寫 decompiler 工程浩大,我取巧的方式是動態產生程式碼的時候,順便把程式碼寫入暫存檔。附帶的好處是,除錯也方便些。
clyther 做的事情也類似,也是用 decorator 把 python function 轉換,翻譯成 opencl。查看之下,才發現他還真的把 decompiler 寫出。
不過試用了一下,就發現了好幾個 bug,看起來還不算完全成熟。
不過未來倒是挺看好這一塊進入 python 的標準 lib,補足 ast 的功能。