CPython开发实战:魔改lambda函数(一)

最近研究了cpython的前端,并尝试着根据devguide魔改了Python语法。整个过程不是很流畅,尤其在debug环节还是有很大的提升空间。现在我打算新开一个系列的文章来展示研究成果。

本次实战内容是受到Javascript的启发,将Python为人诟病已久的lambda函数改成Javascript风格的箭头函数,效果如下:

由于项目庞大复杂,在整个实战中我会用加粗字体标出需要改动的步骤,其余内容均为说明。同时也需要读者和我的环境尽量保持一致(Windows环境)。本次采用的cpython版本为Python3.13.0 alpha 0。另外还需准备以下工具:

  • GIT:用来下载cpython依赖,比如sqlite、bzip、zlib等
  • MSVC:用来编译cpython项目,可以直接下载Visual Studio 2022
  • 低版本的Python:用来生成部分编译文件
  • Visual Studio 2022(可选):用来debug

准备好后立刻开始------

1. 在命令行中运行PCBuild/build.bat编译cpython

Windows环境下是通过该脚本编译cpython项目的。在默认情况下该脚本会先下载cpython依赖,生成编译文件,最后编译链接生成可执行文件python。同时可以添加选项--regen让它只生成编译文件。

2. 在Grammar/Tokens文件中第46行添加如下代码

arduino 复制代码
EQARROW                 '=>'

传统的编译器都至少需要五个步骤------词法分析(Tokenizer)、语法分析(Parser)、中间表示(IR)生成、中间表示优化以及最终代码生成。Python作为解释型语言也需要这几个过程------词法分析、语法分析、抽象语法树(AST)生成、控制流图(CFG)生成、字节码生成和虚拟机执行字节码。而所谓的cpython前端是指前面五个步骤,我们当前位于第一个步骤:

词法分析是将Python源码转换成合法的字符流供语法分析处理。过程中,它会剔除不必要的空格符并检查词法的合法性。和众多现代编程语言一样,cpython的词法分析是通过程序读取词法文件生成词法分析程序的。该词法文件为Grammar/Tokens,记录着Python程序中所有的词法类别。

本步骤新增的词法类别是EQARROW,包含一个字符组合=>,是用来表示箭头函数中的箭头符号。

3. 在命令行中运行PCBuild/build.bat --regen生成词法分析程序

本步骤将根据改动的Grammar/Tokens生成词法分析程序。读者可以运行git status查看改动的文件内容:

  • Doc/library/token-list.inc: Token相关文档说明,不参与构建
  • Grammar/Tokens: 刚改动的词法文件
  • Include/internal/pycore_token.h: 词法分析头文件,cpython前端会用此文件中字符解析Python源码
  • Lib/token.py: 词法分析python文件,不参与构建
  • Parser/parser.c: 语法分析程序
  • Parser/token.c: 词法分析c文件,pycore_token.h的实现

在cpython中,词法分析不是单独的模块,它是通过语法分析程序parser.c体现的。具体流程是pycore_token.h会被语法分析程序的生成程序pegen.h引用。然后pegen.h生成词法分析程序parser.c

4. 在Parser/Python.asdl文件中第65行添加如下代码

scss 复制代码
    | ArrowLbd(arguments args, expr body)

本步骤将修改语法分析器相关代码:

和众多现代编程语言一样,语法结构是通过抽象语法树(AST)描述的。抽象语法树以树状的形式表现的语法结构,树上的每个节点都表示源代码中的一种结构。这里的语法并不会表示出真实语法中出现的每个细节。

本步骤修改的Parser/Python.asdl文件是cpython描述AST的文件。因为箭头函数也是Lambda函数,本质是一个表达式,所以它被挂在表达式(expr)节点下。

声明一个箭头函数需要指定参数(args)和函数体(body),类型分别为argumentsexpr。两者在asdl文件其他地方已经定义过了。

5. 在命令行中运行PCBuild/build.bat --regen生成语法分析程序相关文件

本步骤将根据改动的Parser/Python.asdl生成语法分析程序相关文件。读者可以运行git status查看改动的文件内容:

  • Include/internal/pycore_ast.h: AST结构的C语言表示,在parser的很多环节都需要
  • Include/internal/pycore_ast_state.h: AST结构类型
  • Parser/Python.asdl: 刚改动的asdl文件
  • Python/Python-ast.c: AST相关函数的实现,比如生成AST节点。

本篇文章介绍了词法分析和AST构造的相关知识,这只是一个开始。后续会介绍语法分析程序的生成和AST遍历等相关知识。涉及到的内容会更加晦涩抽象,但能全部消化理解也会收获满满。

相关推荐
电商API&Tina11 分钟前
跨境电商速卖通(AliExpress)数据采集与 API 接口接入全方案
大数据·开发语言·前端·数据库·人工智能·python
工业互联网专业18 分钟前
基于python的旅游景点推荐系统_flask+spider
python·flask·毕业设计·源码·课程设计·spider·旅游景点推荐系统
编程乐学(Arfan开发工程师)20 分钟前
信息收集与分析详解:渗透测试的侦察兵 (CISP-PTE 核心技能)
java·开发语言·javascript·python
superman超哥21 分钟前
仓颉语言中异常处理入门的深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
深蓝海拓26 分钟前
PySide6从0开始学习的笔记(十四)创建一个简单的实用UI项目
开发语言·笔记·python·qt·学习·ui·pyqt
Echo_NGC223729 分钟前
【传统JSCC+Deep JSCC】联合信源信道编码完全指南
人工智能·python·深度学习·神经网络·conda·无人机·jscc
东方佑29 分钟前
使用Python标准库将Word文档转换为HTML:深入解析.docx文件处理脚本
python·html·word
祁思妙想36 分钟前
Python中CORS 跨域中间件的配置和作用原理
开发语言·python·中间件
天才测试猿1 小时前
Postman常见问题及解决方法
自动化测试·软件测试·python·测试工具·职场和发展·接口测试·postman