jitrix是一个基于x86_64架构的虚拟机。jitrix读作J Tricks。- 正如项目名称的前三个字母
jit所言,本项目用于尝试开发一个极度轻量化的带有JIT功能的虚拟机。 jitrix只由不到一千行的C/C++代码组成,但却拥有基于Copy-and-Patch的JIT功能。经测试,启用JIT功能能使性能提升约20%。
doc存放着jitrix的相关文档。stencil存放着用于生成模板机器码的相关文件,其中:stencil.cpp存放着模板代码。- 构建项目时,会将
stencil.cpp编译到stencil.o,再反编译到stencil.objdump。 codegen.py负责解析stencil.objdump的关键数据,并生成jit_data.hpp。
src存放着虚拟机的核心代码,其中:config.hpp负责管理构建虚拟机所需的自定义配置。arena.hpp负责内存分配与管理。bin.hpp负责读取虚拟机字节码。vm.hpp存放着虚拟机的数据结构jit.hpp存放着JIT编译器。runner.hpp是虚拟机的运行器核心代码。main.cpp是项目的入口和命令行工具实现。
test存放着测试用的文件。
汇编器为assembler.py,采用AI生成,用法为:
python assembler.py <assembly filename> <bytecode filename>
在config.hpp中,JITRIX_JIT_ENABLED宏由于控制是否启用该项目的JIT功能。
项目提供了两种JIT方式:一种是将单条指令编译为一个JIT函数;另一种是将一个基本代码块编译成一个JIT函数,但这涉及了尾递归语法,即GNU语法中的__attribute__。显然后者能够带来更强的JIT优化,但后者也同样需要使用支持GNU语法的编译器才能编译。config.hpp会自动检测当前编译器是否支持相关语法,如果支持则设置JITRIX_JIT_MUSTTAIL为1并使用尾递归优化。
此项目目前支持在使用x86_64架构上的Windows和Linux平台上构建运行。
此项目的构建文件是Makefile,其中$(BIN)代表编译出来的可执行文件名,$(COMPILER)是用于编译项目主体的编译器。
构建此项目需要:
| 工具名 | 用途 | 参考版本 |
|---|---|---|
make |
运行构建脚本 | GNU Make 4.4.1 |
python 3 |
解析机器码并生成模板数据 | Python 3.12.13 |
clang++ |
编译机器码模板 | clang version 21.1.2 |
C++编译器 |
编译项目主体 | 可以选择clang++或其他编译器,例如gcc version 15.2.0 |
Makefile提供的构建命令如下:
| 构建命令 | 解释 |
|---|---|
make sten |
只编译机器码模板 |
make debug |
编译出未经优化且携带调试信息的可执行文件,通常用于调试 |
make |
可以编译出经过优化且未携带调试信息的可执行文件,通常用于编译发行版 |
使用jitrix version可以查看项目版本。
使用jitrix help可以获取帮助信息
由于此项目旨在提供一个具有JIT功能的VM的最小实现,因此没有提供详尽的错误捕获功能,这意味着在字节码编码、运行等过程中,由用户导致的任何错误都有可能使得虚拟机直接崩溃。
本项目目前没有为虚拟机加入错误捕获的打算。