簡介
出于個人愛好和某種需求,我再16年對python的解釋器產(chǎn)生了濃厚興趣,并且下定決心重新實現(xiàn)一個版本。我個人再游戲服務(wù)器開發(fā)中,對c++嵌入lua和python都有著豐富應(yīng)用經(jīng)驗,自認為對二者的優(yōu)劣有著深刻的理解。
python針對lua的大優(yōu)勢是python是完備的程序語言,類、模塊包括豐富的庫和方便好用的字符串操作,可以說python用來實現(xiàn)功能會優(yōu)雅很多,而lua大的優(yōu)勢就是小巧高效,另外lua的lua_state是可以有多個實例的,這樣就可以多線程使用lua(一個線程單獨一個lua_state),而python解釋器因為有全局解釋器鎖,所以無法實現(xiàn)多python解釋器實例。
考慮到在嵌入python的應(yīng)用場景中,所用到python的功能都是比較簡單通用的功能,比如類、模塊,函數(shù),一些復(fù)雜的類庫也不常用,所以我就想實現(xiàn)一個不使用全局解釋器鎖,可以有多個python解釋器鎖的解釋器。所以16年底,我自己實現(xiàn)了一下python解釋器第一版,第一版是使用AST虛擬語法樹直接解析的,雖然做了必要的優(yōu)化,但是性能。。。。仍然不忍直視。
平常我一直吐槽python跑的沒有l(wèi)ua快,但是吐槽是一碼事,自己實現(xiàn)真的就是另一碼事了。我仔細分析了第一版性能低的原因是選錯了路!python的虛擬機是講語法樹翻譯成ByteCode,然后有個Virtual Machine不斷的解釋bytecode,而vm的運行又分堆棧模式和寄存器模式,python就是堆棧模式的,而lua是寄存器模式的,寄存器模式是現(xiàn)在的趨勢,這也是lua跑到更快的重要原因。我的第一版VM用AST直接跑,選錯了路,無論如何也太快不了。
但是我仍然把這個第一版打了個分支,分享出來,因為當(dāng)我實現(xiàn)用寄存器模式的VM的時候,感覺無論如何也無法設(shè)計的像AST直接解析的VM那樣優(yōu)雅、直接。AST直接解析的方式真的太直觀了,雖然效率很低,但是其仍然有很大的應(yīng)用價值。
比如protocolbuff、thrift這些通過定義語法文件生成代碼的這類工具,對語法解析的效率要求不高,那么這個版本的VM再這些領(lǐng)域還是有很大的參考價值。
內(nèi)部實現(xiàn)層次:
Python BNF
一提到實現(xiàn)腳本解釋器,估計很多人都會撓頭,不知道從何入手。剛開始我也是這樣,我把大學(xué)里的編譯原理從床底下一堆打入冷宮的數(shù)量翻出來,一頓猛看。但是仍然沒有找到很大頭緒,后來我就在python.org上一頓逛,也下載了python的源碼分析,源碼目錄有python的BNF描述文件,因為我已經(jīng)看過一遍編譯原理了,BNF就看的很懂,從頭到尾讀了一遍了以后,靈光乍現(xiàn)??!BNF就是完整的解析python語法的流程說明??!截取一小段做個說明:
compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] while_stmt: 'while' test ':' suite ['else' ':' suite] for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] try_stmt: ('try' ':' suite ((except_clause ':' suite)+ ['else' ':' suite] ['finally' ':' suite] | 'finally' ':' suite)) with_stmt: 'with' with_item (',' with_item)* ':' suite with_item: test ['as' expr] # NB compile.c makes sure that the default except clause is last except_clause: 'except' [test [('as' | ',') test]] suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。