中文 | English
这是一个Python的前端编译器,主要用于把Python代码编译成LLVM的IR代码,最后生成可执行文件的过程由Clang来完成。
目前来说这仅仅只是一个玩具的地步,因为要实现真正的编译器不应该一上来就开始搓代码。而是应该先了解Python的各种语法和特性之后,先确定下来整体架构在开始编写代码。但是我却逆其道而行之,只是按照自己的印象来实现一个简易的Python编译器,估计连Python的子集都算不上,因为有很多功能确实和原版Python有出入。我不知道我的兴趣还能够支撑这个项目多久。
目前该项目完全是按照
example.py中所需要的功能来实现的,其他的功能暂时没有实现。所以其实暂时没有什么介绍的必要性
- 高精度计算(GMP默认256精度):
- 支持
float浮点数 - 支持
int整数 - 支持
bool布尔值 - 支持
complex复数(暂无计划)
- 支持
- 支持
None空值 - 支持
Any任意类型 - 支持函数对象
- 自定义类对象
- 支持
Ellipsis省略号 (暂无计划)
- 支持
string字符串- 支持转义字符
- 支持字符串拼接
-
f-string(暂无计划)
- 支持
list列表- 支持多维列表 ,支持混合类型
- 支持
dict字典- 支持混合类型的 key-value(RunTime中支持hash的都可以key-value)
- 支持
set集合(暂无计划) - 支持
tuple元组(暂无计划)
-
支持复杂的加减乘除乘法运算符
- 支撑
string字符串拼接 - 支持
list的拼接([1,2] + [3,4]*2)
- 支撑
-
支持大多数运算符:
- 支持
==!=><>=<= - 支持逻辑短路
- 支持
isinnot inis not - 支持
&|^<<>>(Lexer和RunTime支持了但是,Parser和CodeGen没有) - 支持容器对象的表比较
- 支持
-
支持
if-elif-else语句 -
支持
def函数定义 :- 支持泛型
- 支持函数对象
- 支撑函数内定义函数
-
支持
lambda表达式 -
支持列表推导式
-
支持
while-else语句 -
支持
for-else语句 -
支持
try-except语句 -
支持
with语句 -
支持
class -
支持
asyncawait语句(暂无计划)
- 目前只支持单文件main()作为入口点,全局执行也可以
- 支持多文件编译
- 支持
importfrom-importimport asfrom-import as语句 - 支持
__name____main__语句 (暂无计划) - 支持
__all__(暂无计划) - 支持
__init__.py
详细的功能测试请参考tests_auto/中的测试用例.
alltest.sh是一个自动化测试脚本,可以自动化运行所有的测试用例:
tests_auto/checkneeds: 检查return 0\return 1\if-else之类最基础功能的是否正常因为他们是接下来其他测试的依赖.他们是特殊的,所以这下面的测试用例需要同名的*.sh脚本特判tests_auto/: 测试复杂功能,通过自我的if-else-if语句来实现,所以需要tests_auto/checkneeds的支持
compile.sh是一个简单的编译脚本,可以直接编译./test.py文件,并且运行
- 调用
GMP的mpz来实现高精度计算,但是性能上来说还是有点差的,因为mpz的性能比int要差很多 LLVM的IR代码生成器是一个简单的实现,所以性能上来说还是有点差的,因为没有做很多的优化- 使用了
libffi来实现未知签名调用,比原生的C函数调用要慢1.5倍左右 - 静态分析做的特别差
本项目采用
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License
进行许可。