小巧快速的零依赖JIT/AOT编译器
- 最新CI构建
- /r/ProgrammingLanguages discord频道 - Projects Q-Y -> Vox
Vox编程语言
Vox是一种多范式编程语言,受D语言(60%)、Jai(30%)和Zig(10%)的启发。
主要特性
- 快速编译
- 强大的元编程
- 可用于脚本和独立程序(支持JIT和AOT编译)
- 无依赖(除D编译器外)
与D语言的相似之处
- 大部分语言部分的语法相同(结构体、函数、枚举、for、while、if、UFCS、切片、数组)
- 条件编译
- 模板、可变参数模板和函数
- C语言互操作性
- 模块/包
与D语言的不同之处
- 无GC、最小运行时、无类(仅结构体)、无异常
- 更多编译时特性、更快的CTFE
- 不鼓励使用模板进行繁重计算,而是可以使用CTFE进行内省和代码生成
- 宏(进行中)
- 无C++互操作性
平台
支持:
- windows-x64 - 主机和目标
- linux-x64 - 主机和目标
- macos-x64 - 仅JIT模式
计划:
- linux-arm64
- wasm
- windows-arm64?
- spirv (Vulkan/OpenCL/OpenGL着色器)
项目目标
- 重点关注应用程序扩展
- 最大化用户生产力
- 最大化应用性能
- AOT和JIT、插件支持、运行时编译、嵌入式编译器、分层编译
- 静态类型
- 优秀的错误消息
- 快速/增量编译
- 最小化安装、设置、集成所需的工作
- 最小依赖/将依赖封装到模块或包中
- 作为库的运行时/最小运行时/无运行时
- 嵌入/extern C
- 代码驱动编译,从正在编译的程序内部扩展编译器
- 处理器内部函数
- 条件编译
- CTFE、模板、内省、代码生成
语法示例
i32 fib(i32 number) {
if (number < 1) return 0;
if (number < 3) return 1;
return fib(number-1) + fib(number-2);
}
struct Point {
i32 x;
i32 y;
}
T min[T](T a, T b) {
if (a < b) return a;
return b;
}
-
跨平台Hello World https://gist.github.com/MrSmith33/34a7557ad5ac23ebe6cf27bef15a39a6
-
斐波那契 https://gist.github.com/MrSmith33/9645d9552b567fdbdc1a4d8822b4f1f7
-
Fannkuch https://gist.github.com/MrSmith33/ac14e66a83b9d047793adede464ca1ef
-
使用SDL2的Roguelike教程 - 仓库
-
使用Vox作为脚本语言的体素引擎: Voxelman 2
-
从D代码进行amd64 JIT编译的示例:
代码
// 源代码 string source = q{ void test(i32* array, i32 index, i32 value) { array[index] = value; } }; // 省略错误处理 Driver driver; driver.initialize(jitPasses); scope(exit) driver.releaseMemory; driver.beginCompilation(); driver.addModule(SourceFileInfo("test", source)); driver.compile(); driver.markCodeAsExecutable(); // 获取函数指针 auto testFun = driver.context.getFunctionPtr!(void, int*, int, int)("test"); // 使用编译后的函数 int[2] val = [42, 56]; testFun(val.ptr, 1, 10); assert(val[1] == 10);
运行和测试
在main.d
中取消注释以下行之一:
//version = bench; // 运行基准测试
//version = devtest; // 运行单个测试,具有精细调整的日志记录。对开发有用。使用tester.runDevTests()。在开发时切换选项以进行精确分析。
//version = test; // 运行测试套件。使用tester.runAllTests()。
然后运行:source> dmd -m64 -i main.d && main
基准测试:
ldc2 -d-version=bench -m64 -O3 -release -boundscheck=off -enable-inlining -flto=full -i main.d && main
调试CLI构建:
dmd -i -g -m64 -version=cli main.d -of=vox.exe
发布CLI构建:
ldc2 -d-version=cli -m64 -O3 -release -boundscheck=off -enable-inlining -flto=full -mcpu=native -i main.d -of=vox.exe
调试共享库构建:
ldc2 -m64 -shared -g -d-debug -fvisibility=hidden -link-defaultlib-shared=false -i c_api.d -of=libvox.dll
使用剖析引导优化进行编译:
ldc2 -d-version=test -m64 -release -fprofile-instr-generate -mcpu=native -i main.d -of=vox_instrumented.exe
vox_instrumented
ldc-profdata merge default.profraw -output vox.profdata
ldc2 -d-version=cli -m64 -O3 -release -boundscheck=off -enable-inlining -flto=full -mcpu=native -fprofile-instr-use=vox.profdata -i main.d -of=vox.exe
使用命令行界面
获取帮助
显示完整的标志列表
vox --help
输入文件
.vx
文件是源代码文件。.har
文件,即人类可读归档文件。一个文本文件,结合了多个文本文件。
每个文件必须以--- <path>
开头,三个破折号、空格和名称。
文件可以嵌套在目录中--- dir/dir2/file.txt
。
示例:
--- main.vx
import kernel32;
void main() { ExitProcess(42); }
--- kernel32.vx
@extern(module, "kernel32")
noreturn ExitProcess(u32 uExitCode);
可以用vox program.har
编译
CLI工具
编译器包含嵌入式工具:
PDB转储
将vox.pdb文件的内容打印到stdout。
vox pdb-dump vox.pdb
语法高亮
GitHub
要在GitHub上获得语法高亮,请在仓库中定义一个.gitattributes
文件,内容如下(文档):
*.vx linguist-language=D
所有.vx
文件都将被高亮显示并归类为D。
编辑器
编译器概述
统计数据
- 实现大小:40k行D代码,3MB可执行文件
- 编译时间:4秒(调试)/45秒(发布)
- 测试套件:361个测试用时95毫秒
- 编译1000万行斐波那契代码的时间:Windows上8秒,Linux上7.5秒
有关实现的更详细描述,请参阅internals.md