Python之父考虑重构Python解释器
发布日期:2021-06-27 04:05:09 浏览次数:87 分类:技术文章

本文共 923 字,大约阅读时间需要 3 分钟。

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解释器

 

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

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

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

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

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

转载地址:https://blog.csdn.net/weixin_42137700/article/details/97137212 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Lyft开源L5无人车数据集:55000个3D注释框架,还有空间语义地图
下一篇:中国机器人发展现状

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年03月18日 13时59分44秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java 执行 awk_3.1 biostar lesson3 linux学习日记;java版本;awk 2019-04-21
python函数代码块以什么开头_Python初体验-开篇 代码全析 2019-04-21
java闹钟程序设计_JAVA课程设计_闹钟的设计与实现项目-报告_附源代码.doc 2019-04-21
java中的无效的列类型_java.sql.SQLException: 无效的列类型: 1111 2019-04-21
php rewrite url_PHP_URL Rewrite的设置方法,URL Rewrite需要服务器的支持! - phpStudy 2019-04-21
php读取大文件某行内容,PHP读取和修改大文件的某行内容_PHP教程 2019-04-21
打印php错误日志,php怎样打印错误日志 2019-04-21
Calendar导入java,Java程序使用Calendar.add()方法将分钟添加到当前时间 2019-04-21
mysql中用户线程作用,mysql用户线程的建立与用户线程的状态源码解析 2019-04-21
php页面引用公共文件,WeiPHP插件模板中快速引入公共模板文件 2019-04-21
php tracy,admin.php 2019-04-21
php访问父类的所有属性,php – 在父类中使用$this仅在子类中显示父类属性 2019-04-21
oracle比较强大的函数,SQL和ORACLE函数比较 2019-04-21
oracle12c order by,oracle 数据库中order by 的一些高级用法 2019-04-21
oracle8i substr,Oracle中的INSTR,NVL和SUBSTR函数的用法详解 2019-04-21
导出oracle11g的空表,轻松解决oracle11g 空表不能 exp 导出 的问题。 2019-04-21
php把整数拆分成数组,数组拆分处理(整数时的处理),该怎么处理 2019-04-21
oracle numlist,oracle sql str2numlist numtabletype 2019-04-21
php红包平均分配,红包平均分配算法 2019-04-21
linux磁盘的命令是,linux磁盘相关的命令 2019-04-21