Python之父考慮重構(gòu)Python解釋器
7月22日,Python之父Guido在Medium上發(fā)表了他的第一篇博文《PEG Parser》。
在該文中,Guido說他正在考慮使用PEG Parser代替現(xiàn)有的類LL(1) Parser(名為pgen),來重構(gòu)Python解釋器。原因是現(xiàn)在的 pgen 限制了Python語法的自由度,使得一些語法難以實(shí)現(xiàn),也讓當(dāng)前的語法樹不夠整潔,一定程度上影響了語法樹的表意,不能最好地體現(xiàn)設(shè)計者的意圖。
那 PEG Parser 和現(xiàn)有的 LL(1) Parser 有什么區(qū)別呢?可以這樣簡單地理解,PEG 語法解釋器在解析語法的時候,會一次性加載全部代碼,所以解釋器可以根據(jù)任意位置的符號來判斷語法的語義。而目前的 LL(1) Parse 解析語法的時候只會向前檢測一個符號,來猜測語義,導(dǎo)致部分語法有二義性的表現(xiàn),進(jìn)而限制了Python語言的語法定義方式。當(dāng)然,一次性加載全部代碼,也意味著 PEG Parser 需要更大的內(nèi)存來運(yùn)行。
說當(dāng)前解釋器限制了Python的語法實(shí)現(xiàn),很多同學(xué)可能沒有明顯的感受,所以Guido又舉了一個例子:在Python3.8之前,下面這段代碼都是可以正常運(yùn)行的,而不像大家直觀感受的第二行代碼應(yīng)該報錯。
這就是Python解釋器處理不了帶來的后遺癥。這也導(dǎo)致Python團(tuán)隊(duì)不得不在代碼里增加一些不受歡迎的“特例”來處理這些邊緣情況。
Guido說,Python剛出現(xiàn)的時候,內(nèi)存還很貴,使用 LL(1) Parser 是非常合理的。不過在現(xiàn)在這個內(nèi)存以G為單位的時代,解釋器多增加幾百k甚至上兆的內(nèi)存消耗,已經(jīng)根本不算什么了。所以是時候使用更理想的 PEG Parser 來重構(gòu)Python解釋器了。
最后,也是大家最關(guān)心的問題,這個重構(gòu)會對Python語言的開發(fā)者造成什么影響呢?Guido說,應(yīng)該是沒有影響的,底層重構(gòu)不會影響Python的語法。
看來,不管是多么成功的項(xiàng)目,也存在著因?yàn)闀r代的限制而遺留的一些令人不快的問題,完美的設(shè)計和實(shí)現(xiàn),從來不是一蹴而就的呀~
英文原文地址:https://medium.com/@gvanrossum_83706/peg-parsers-7ed72462f97c