Awesome
<pre> __ __ __ __ __ __ ______ __ __ /\ "-./ \ /\ \ /\ "-.\ \ /\ \ /\ == \ /\ \_\ \ \ \ \-./\ \ \ \ \ \ \ \-. \ \ \ \ \ \ _-/ \ \____ \ \ \_\ \ \_\ \ \_\ \ \_\\"\_\ \ \_\ \ \_\ \/\_____\ \/_/ \/_/ \/_/ \/_/ \/_/ \/_/ \/_/ \/_____/ </pre>minipy
迷你Python解释器,Python实现的编译器+C语言实现的VM.
注意:本项目主要是用于学习编译器相关原理,如果需要用于生产环境,可以参考以下项目
如何开始
编译解释器
cd minipy
make && make test
# and enjoy yourself ^_^
打包成可执行文件
# 编辑 pack/main.py
# 打包
python3 build.py pack
# 执行打包后的文件
./pack_main
特性
编译器
位于 /src/python
mp_opcode.py
字节码定义mp_tokenize.py
词法分析器,将代码转换成单词(tokens
)- 运行
python mp_tokenize.py {script.py}
可以打印出单词
- 运行
mp_parse.py
语法分析器,将单词(tokens
)转换成语法树(Syntax Tree
)- 运行
python mp_parse.py {script.py}
可以打印出语法树
- 运行
mp_encode.py
代码生成器,将语法树(Syntax Tree
)转换成字节码(opcodes
)- 运行
python mp_encode.py {script.py}
可以打印出字节码(未处理过的)
- 运行
特性
- 基于栈的计算机模型,字节码定义在
src/python/mp_opcode.py
- 支持异常处理,基于
setjmp/longjmp
实现 - 支持Native方法扩展
- 支持常用的Python类型
- 支持函数定义、简单类定义
- Mark-Sweep垃圾回收
- 字符串常量池
- 尾调用优化
- [] DEBUG功能
- [] 用户级线程
- [] 类的继承
工具
- minipy -dis {test.py} 打印字节码(常量处理过)
代码结构
main.c
程序入口vm.c
虚拟机入口execute.c
解释器builtins.c
一些常用的内置方法obj_ops.c
对象的操作符实现argument.c
函数调用参数APIexception.c
异常处理gc.c
垃圾回收器string.c
字符串处理number.c
数字处理list.c
列表处理dict.c
字典处理function.c
函数/方法处理
类型系统
string
, 是不可变对象number
, 全部使用double类型list
, 列表(动态数组)dict
, 哈希表function
, 包括native的C函数和自定义的Python函数class
, 自定义Python类型None
, None类型data
, 自定义的C语言类型
相关项目
其他Python的实现
- CPython Python的官方实现版本
- micropython 嵌入式版本
- tinypy 64K的迷你版本,支持Python的部分子集
- cython Python的超集,可以把Python转换成C语言编译以提升运行速度,同时也可以简化Python的C语言扩展的开发
其他嵌入式脚本语言实现
更多有意思的编译器项目
协议
- MIT