時(shí)間:2019-07-28 15:38:03 作者:Dorise 瀏覽量:53
大家好!小編在大學(xué)的時(shí)候?qū)W過(guò)C語(yǔ)言,但感覺(jué)太難了,學(xué)的馬馬虎虎,我們經(jīng)常說(shuō)Python,那么Python是什么?其實(shí)Python就是一個(gè)編程語(yǔ)言,現(xiàn)在,全世界差不多有600多種編程語(yǔ)言,但流行的編程語(yǔ)言也就那么20來(lái)種,總的來(lái)說(shuō),這幾種編程語(yǔ)言各有千秋。C語(yǔ)言是可以用來(lái)編寫(xiě)操作系統(tǒng)的貼近硬件的語(yǔ)言,所以,C語(yǔ)言適合開(kāi)發(fā)那些追求運(yùn)行速度、充分發(fā)揮硬件性能的程序。而Python是用來(lái)編寫(xiě)應(yīng)用程序的高級(jí)編程語(yǔ)言。
PYTHON解說(shuō)器將被重構(gòu)?圖1
在7 月 22 日,Python 之父 Guido 在 Medium 上發(fā)表了他的第一篇博文《PEG Parser》。在該文中,Guido 說(shuō)他正在考慮運(yùn)用 PEG Parser 替代現(xiàn)有的類 LL(1) Parser(名為pgen),來(lái)重構(gòu) Python 解說(shuō)器。原因是現(xiàn)在的 pgen 約束了 Python 語(yǔ)法的自由度,使得一些語(yǔ)法難以完成,也讓當(dāng)時(shí)的語(yǔ)法樹(shù)不行整齊,必定程度上影響了語(yǔ)法樹(shù)的表意,不能最好地體現(xiàn)設(shè)計(jì)者的目的。
那 PEG Parser 和現(xiàn)有的 LL(1) Parser 有什么區(qū)別呢?能夠這樣簡(jiǎn)略地了解,PEG 語(yǔ)法解說(shuō)器在解析語(yǔ)法的時(shí)分,會(huì)一次性加載全部代碼,所以解說(shuō)器能夠根據(jù)任意位置的符號(hào)來(lái)判別語(yǔ)法的語(yǔ)義。而現(xiàn)在的 LL(1) Parse 解析語(yǔ)法的時(shí)分只會(huì)向前檢測(cè)一個(gè)符號(hào),來(lái)猜測(cè)語(yǔ)義,導(dǎo)致部分語(yǔ)法有二義性的體現(xiàn),進(jìn)而約束了Python言語(yǔ)的語(yǔ)法定義方式。當(dāng)然,一次性加載全部代碼,也意味著 PEG Parser 需要更大的內(nèi)存來(lái)運(yùn)轉(zhuǎn)。
說(shuō)當(dāng)時(shí)解說(shuō)器約束了 Python 的語(yǔ)法完成,很多同學(xué)可能沒(méi)有明顯的感觸,所以 Guido 又舉了一個(gè)例子:在 Python3.8 之前,下面這段代碼都是能夠正常運(yùn)轉(zhuǎn)的,而不像我們直觀感觸的第二行代碼應(yīng)該報(bào)錯(cuò)。
PYTHON解說(shuō)器將被重構(gòu)?圖3
這就是 Python 解說(shuō)器處理不了帶來(lái)的后遺癥。這也導(dǎo)致 Python 團(tuán)隊(duì)不得不在代碼里添加一些不受歡迎的“特例”來(lái)處理這些邊緣情況。
PYTHON解說(shuō)器將被重構(gòu)?圖4
Guido 說(shuō),Python 剛呈現(xiàn)的時(shí)分,內(nèi)存還很貴,運(yùn)用 LL(1) Parser 是非常合理的。不過(guò)在現(xiàn)在這個(gè)內(nèi)存以 G 為單位的時(shí)代,解說(shuō)器多添加幾百k甚至上兆的內(nèi)存消耗,現(xiàn)已底子不算什么了。所以是時(shí)分運(yùn)用更抱負(fù)的 PEG Parser 來(lái)重構(gòu) Python 解說(shuō)器了。
PYTHON解說(shuō)器將被重構(gòu)?圖5
最后,也是我們最關(guān)心的問(wèn)題,這個(gè)重構(gòu)會(huì)對(duì) Python 言語(yǔ)的開(kāi)發(fā)者形成什么影響呢?Guido 說(shuō),應(yīng)該是沒(méi)有影響的,底層重構(gòu)不會(huì)影響 Python 的語(yǔ)法。
看來(lái),不管是多么成功的項(xiàng)目,也存在著因?yàn)闀r(shí)代的約束而留傳的一些令人不快的問(wèn)題,完美的設(shè)計(jì)和完成,歷來(lái)不是一蹴而就的呀~