Skip to content

xupingmao/minipy

Repository files navigation

 __    __     __     __   __     __     ______   __  __    
/\ "-./  \   /\ \   /\ "-.\ \   /\ \   /\  == \ /\ \_\ \   
\ \ \-./\ \  \ \ \  \ \ \-.  \  \ \ \  \ \  _-/ \ \____ \  
 \ \_\ \ \_\  \ \_\  \ \_\\"\_\  \ \_\  \ \_\    \/\_____\ 
  \/_/  \/_/   \/_/   \/_/ \/_/   \/_/   \/_/     \/_____/ 
                                                           

minipy

Build Status

迷你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功能
  • [] 用户级线程
  • [] 类的继承

工具

  1. minipy -dis {test.py} 打印字节码(常量处理过)

代码结构

  1. main.c 程序入口
  2. vm.c 虚拟机入口
  3. execute.c 解释器
  4. builtins.c 一些常用的内置方法
  5. obj_ops.c 对象的操作符实现
  6. argument.c 函数调用参数API
  7. exception.c 异常处理
  8. gc.c 垃圾回收器
  9. string.c 字符串处理
  10. number.c 数字处理
  11. list.c 列表处理
  12. dict.c 字典处理
  13. function.c 函数/方法处理

类型系统

  1. string, 是不可变对象
  2. number, 全部使用double类型
  3. list, 列表(动态数组)
  4. dict, 哈希表
  5. function, 包括native的C函数和自定义的Python函数
  6. class, 自定义Python类型
  7. None, None类型
  8. data, 自定义的C语言类型

相关项目

其他Python的实现

  • CPython Python的官方实现版本
  • micropython 嵌入式版本
  • tinypy 64K的迷你版本,支持Python的部分子集
  • cython Python的超集,可以把Python转换成C语言编译以提升运行速度,同时也可以简化Python的C语言扩展的开发

其他嵌入式脚本语言实现

更多有意思的编译器项目

  • ShivyC 一个Python编写的C语言编译器
  • NASM 跨平台的x86汇编和反汇编器

协议

  • MIT