我是一個電腦專業的學生,在學編譯原理這門課程的過程中產生了自己製作一個python解譯器的想法,不過我們的課程中只講了前後文無關文法、詞法分析、文法分析和四元式表示這幾塊內容,而且只講了一些手動轉換的方法,對一些實際的應用講的不深。我瞭解到python語言是上下文相關的,在學校的課程中對這方面的文法也沒有過詳細的說明。我想在這裡問一下如果我準備手動寫一個python解譯器需要掌握哪些技能點?
回複內容:
對於實現一個解譯器,parser部分其實是相對比較無聊的工作,如果跳過這部分來實現的話,可能會更容易上手一些。
vinzenz/libpypa · GitHub
可以嘗試一下這個項目,獨立的Python parser,C++寫的,目前Dropbox的Python實現Pyston,就是使用這個庫做為Python的parser。
另外也可以直接嘗試直接調用CPython的ast模組,將parse好的AST匯出到檔案中去,再拿自己實現的解譯器直接讀取。Pyston在引入libpypa之前就是這麼做的。
還有另外一個思路,直接實現一個Python bytecode的解譯器,parse .pyc檔案就可以了。
之後需要瞭解的就是Python物件模型(比如說一個Python對象在記憶體是如何表示的)。如果是拿C語言來實現的話大概就是“一切都是堆上分配的結構體”就可以了。
剩下的一塊是GC,需要瞭解一下常見的集中GC實現方案。最簡單的應該是引用計數。如果是C/C++實現的話,還直接用Boehm GC,自己這塊就不用管了。
相關的Python實現:
Jython和IronPython不用說了,JVM和.net兩個平台上的Python實現,如果對這兩個平台熟悉的話可以直接拿來參考。
Dropbox的Pyston,C++實現,使用LLVM作為codegen,因為C++相對較難,並且還有JIT的部分,並不適合上手。
micronPython, https://micropython.org/
,專門針對嵌入式晶片實現的Python,ansi C的,可以研究一下。
tinypy tinypy :: home
, 64k代碼實現的比較完整的Python,可以參考。
另外推薦Python源碼剖析這本書,內容非常全面 Python源碼剖析 (豆瓣)
。
Vczh Free Script
Vczh Free Script 2.0 beta 發布
來看這個,大二寫的,除了文法不一樣以外沒有任何區別。
Parser 推薦用 PEG,可以方便地處理縮排。不考慮文法分析這一步,想著重瞭解python物件模型的話,可以去看看《python源碼剖析》。