__ __ __ __ __ __ ______ __ __
/\ "-./ \ /\ \ /\ "-.\ \ /\ \ /\ == \ /\ \_\ \
\ \ \-./\ \ \ \ \ \ \ \-. \ \ \ \ \ \ _-/ \ \____ \
\ \_\ \ \_\ \ \_\ \ \_\\"\_\ \ \_\ \ \_\ \/\_____\
\/_/ \/_/ \/_/ \/_/ \/_/ \/_/ \/_/ \/_____/
迷你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语言扩展的开发
其他嵌入式脚本语言实现
更多有意思的编译器项目
- ShivyC 一个Python编写的C语言编译器
- NASM 跨平台的x86汇编和反汇编器
- bdwgc 一个为C/C++语言打造的GC模块,生产环境广泛应用
- mkirchner/gc 一个更简单的C语言GC库,用于学习
- MIT