Haifa Python 是一个教学友好、可视化友好的“字节码编译器 + 虚拟机”实验平台。在统一的 Core VM 上,项目同时承载:
- jq 风格 JSON 处理运行时(JQ)
- Lua 子集解释执行(Lua)
你可以从“源代码/脚本 → AST → 字节码 → 虚拟机执行”的完整链路中学习、实验和扩展,并用 GUI/终端可视化器实时观察执行过程。
-
环境准备
- Python 3.11+(推荐虚拟环境)
- 一键创建/激活并安装依赖:
source scripts/activate_venv.sh # 如需 GUI 可视化,请额外安装 pygame pip install pygame
- 运行测试:
pytest
-
体验 Lua(pylua)
- 运行脚本:
pylua examples/hello.lua
- 单行执行:
pylua -e 'x=1; y=2; return x+y' --print-output
- REPL:
pylua --repl
- 可视化执行:
- GUI:
pylua examples/coroutines.lua --visualize
- 终端:
pylua examples/coroutines.lua --visualize curses
- GUI:
- 运行脚本:
-
体验 jq(pyjq)
- 从文件:
pyjq '.items | map(.name)' --input data.json
- 从标准输入:
cat data.json | pyjq '.items[] | .price'
- 可视化(终端):
python -m compiler.jq_cli '.[]' --input data.json --visualize curses
- 从文件:
提示:GUI 可视化器依赖 pygame;若没有图形环境或导入失败,会自动回退到 curses 终端模式。
- 完整流水线:源/脚本 → 词法/语法 → AST → 字节码 → Core VM → 可视化
- 分层设计:核心指令集精简通用;JQ/Lua 分别在其上提供语义与标准库
- 可视化调试:pygame GUI 与 curses 终端两种形态;支持协程事件时间线、寄存器变更高亮、指令搜索、执行轨迹导出
- 测试与样例:200+ 测试与多份示例脚本,覆盖从指令到 CLI 的端到端路径
-
Core 层(
compiler/
)bytecode.py
:指令与调试元信息bytecode_vm.py
:字节码虚拟机(寄存器模型、调用栈、事件/快照)- 可视化:
vm_visualizer.py
(GUI)、vm_visualizer_headless.py
(curses)
-
JQ 层(
compiler/
)jq_parser.py
/jq_ast.py
/jq_compiler.py
:jq 解析与编译jq_vm.py
:JQVM(在 Core VM 上扩展)jq_cli.py
:命令行入口(pyjq
)
-
Lua 层(
haifa_lua/
)- 前端:
lexer.py
、parser.py
、compiler.py
- 运行时:
runtime.py
、environment.py
、stdlib.py
、coroutines.py
- 命令行:
cli.py
(pylua
)
- 前端:
-
指令分层
- Core Opcode:算术/逻辑/跳转/表/闭包/多返回等通用操作(
compiler/bytecode.py
) - JQ Opcode:对象访问、迭代、聚合、字符串等(
compiler/jq_*
) - 执行单元:
BytecodeVM
仅实现 Core;JQVM
在其上扩展 JQ 指令
- Core Opcode:算术/逻辑/跳转/表/闭包/多返回等通用操作(
-
CLI 与示例
- CLI:
pylua
与pyjq
- 示例:
examples/*.lua
;基准:benchmark/scripts/*.lua
- 可视化:
--visualize [gui|curses]
(Lua 与 jq 均支持)
- CLI:
-
语言/运行时与计划
docs/lua_sprint.md
:Lua 解释器里程碑与计划(含协程 API 完备)docs/lua_guide.md
:Lua 实践指南与示例docs/jq_design.md
:jq 设计与指令分层
-
可视化与调试
knowledge/07-debugger-architecture.md
:调试器架构与原则knowledge/09-coroutine-visualizer-and-error-plan.md
:协程事件与错误展示计划
-
性能与基准
docs/performance_benchmark.md
:Lua 解释器性能基准方案benchmark/
:脚本、运行器与报告示例
附注
- GUI 中文显示:若 pygame GUI 无法显示中文,可在
compiler/vm_visualizer.py
中改用指定字体文件,例如:也可以将字体文件放入项目并用相对路径加载。# 替换 SysFont 为系统字体文件(示例) self.font = pygame.font.Font('/System/Library/Fonts/PingFang.ttc', FONT_SIZE)
- 在非图形环境下,使用
--visualize curses
进入终端可视化模式。