Python 之父考虑重构 Python 解释器​​​​​​​

2019-08-28

JiangRen Mr

7 月 22 日,Python 之父 Guido 在 Medium 上发表了他的第一篇博文《PEG Parser》。在该文中,Guido 说他正在考虑使用 PEG Parser 代替现有的类 LL(1) Parser(名为pgen),来重构 Python 解释器。原因是现在的 pgen 限制了 Python 语法的自由度,使得一些语法难以实现,也让当前的语法树不够整洁,一定程度上影响了语法树的表意,不能最好地体现设计者的意图。

那 PEG Parser 和现有的 LL(1) Parser 有什么区别呢?可以这样简单地理解,PEG 语法解释器在解析语法的时候,会一次性加载全部代码,所以解释器可以根据任意位置的符号来判断语法的语义。而目前的 LL(1) Parse 解析语法的时候只会向前检测一个符号,来猜测语义,导致部分语法有二义性的表现,进而限制了Python语言的语法定义方式。当然,一次性加载全部代码,也意味着 PEG Parser 需要更大的内存来运行。

说当前解释器限制了 Python 的语法实现,很多同学可能没有明显的感受,所以 Guido 又举了一个例子:在 Python3.8 之前,下面这段代码都是可以正常运行的,而不像大家直观感受的第二行代码应该报错。

这就是 Python 解释器处理不了带来的后遗症。这也导致 Python 团队不得不在代码里增加一些不受欢迎的“特例”来处理这些边缘情况。

Guido 说,Python 刚出现的时候,内存还很贵,使用 LL(1) Parser 是非常合理的。不过在现在这个内存以 G 为单位的时代,解释器多增加几百k甚至上兆的内存消耗,已经根本不算什么了。所以是时候使用更理想的 PEG Parser 来重构 Python 解释器了。

最后,也是大家最关心的问题,这个重构会对 Python 语言的开发者造成什么影响呢?Guido 说,应该是没有影响的,底层重构不会影响 Python 的语法。

看来,不管是多么成功的项目,也存在着因为时代的限制而遗留的一些令人不快的问题,完美的设计和实现,从来不是一蹴而就的呀~

英文原文地址:https://medium.com/@gvanrossum_83706/peg-parsers-7ed72462f97c

 

本文章转自开源中国。

近期开课hot
logo

Follow Us

linkedinfacebooktwitterinstagramweiboyoutubebilibilitiktokxigua

We Accept

/image/layout/pay-paypal.png/image/layout/pay-visa.png/image/layout/pay-master-card.png/image/layout/pay-stripe.png/image/layout/pay-alipay.png

地址

Level 10b, 144 Edward Street, Brisbane CBD(Headquarter)
Level 8, 11 York st, Wynyard, Sydney CBD
Business Hub, 155 Waymouth St, Adelaide SA 5000

Disclaimer

footer-disclaimerfooter-disclaimer

JR Academy acknowledges Traditional Owners of Country throughout Australia and recognises the continuing connection to lands, waters and communities. We pay our respect to Aboriginal and Torres Strait Islander cultures; and to Elders past and present. Aboriginal and Torres Strait Islander peoples should be aware that this website may contain images or names of people who have since passed away.

匠人学院网站上的所有内容,包括课程材料、徽标和匠人学院网站上提供的信息,均受澳大利亚政府知识产权法的保护。严禁未经授权使用、销售、分发、复制或修改。违规行为可能会导致法律诉讼。通过访问我们的网站,您同意尊重我们的知识产权。 JR Academy Pty Ltd 保留所有权利,包括专利、商标和版权。任何侵权行为都将受到法律追究。查看用户协议

© 2017-2024 JR Academy Pty Ltd. All rights reserved.

ABN 26621887572