Vora

动态类型脚本语言 · 类 JavaScript 语法 · Lua 级简单性 · Wren 式面向对象

双后端:字节码 VM(默认)+ AST 树遍历解释器(`--interpreter`)
~9,400 行 C++17 · 零外部依赖 · 📚 文档
github.com/Vora-lang/Vora

GitHub → 快速开始 ↓
func greet(name) {
    return "Hello, " + name + "!"
}

let names = ["World", "Vora", "你"]
for name in names {
    print(greet(name))
}

快速开始

一条命令构建,开箱即用。

# 构建(跨平台一键构建)
# Windows (PowerShell) — 默认 x64 Debug
PS> .\build.ps1
# Linux / macOS (bash) — 默认 x64 debug
$ ./build.sh

# 多架构 + 打包
PS> .\build.ps1 -Architecture arm64 -Config Release -Package # → .msi
$ ./build.sh -a arm64 -c release -p # → .deb/.rpm/.pkg.tar.xz

# 运行脚本(VM 模式,默认后端)
$ vora examples/main.va

# REPL 交互模式
$ vora --repl

# 树遍历解释器(参考实现)
$ vora examples/main.va --interpreter

# 打印 AST(S-expression 格式)
$ vora examples/main.va --ast-printer

# 打印 Token 流 / 字节码反汇编
$ vora examples/main.va --tokens

# 安装(Release 包)
# Windows: .msi 双击安装(自定义目录 + 自动 PATH)
# Linux: sudo dpkg -i vora-*.deb | sudo rpm -i vora-*.rpm
# macOS: tar xzf vora-*.tar.gz -C /usr/local/bin

语法速览

Vora 的语法受到 Lua 和 Wren 的启发,追求简洁与可读性。

类型与变量

let n = 42           // Number (double)
let f = 3.14
let b = true         // Boolean
let s = "hello"      // String
let a = [1, 2, 3]    // Array
let nothing = null

// 数字前缀
0xFF    // 255(十六进制)
0o77    // 63(八进制)
0b101   // 5(二进制)

字符串插值

let name = "World"
print("Hello ${name}!")
// → Hello World!

// 属性访问
Obj Person(n) { this.name = n }
let p = Person("Alice")
print("Hi ${p.name}")
// → Hi Alice

运算符

// 算术:+ - * / % **
// 比较:< <= > >= == !=
// 逻辑:&& || !(短路求值)
// 自增/自减:++ --
// 复合赋值:+= -= *= /= %=
// 三元:? :

let x = 10
x += 5           // x = 15
let result = x > 10 ? "big" : "small"

// 短路求值
false && crash()  // crash() 不会被调用
true || crash()   // crash() 不会被调用

函数与闭包

func add(a, b) {
    return a + b
}

// 闭包 —— 捕获定义时环境
func makeCounter() {
    let count = 0
    return func() {
        count = count + 1
        return count
    }
}
let c = makeCounter()
print(c())  // 1
print(c())  // 2

控制流

// if / else
if (x > 0) {
    print("positive")
} else {
    print("non-positive")
}

// while
while (n > 0) { n = n - 1 }

// for-in(数组 / 字符串 / range)
for item in [1, 2, 3] { print(item) }
for ch in "Vora"       { print(ch) }
for i in range(5)      { print(i) }

对象与继承

Obj Animal(name) {
    this.name = name
    func speak() { print("...") }
}

Obj Dog : Animal (name, breed) {
    this.breed = breed
    func speak() {
        print("Woof! I'm " + this.name)
    }
}

let d = Dog("Rex", "Husky")
d.speak()      // Woof! I'm Rex
print(d.name)  // Rex

异常处理

try {
    throw "something went wrong"
} catch (e) {
    print("Caught: " + e)
} finally {
    print("Cleanup")
}

// 抛出自定义错误对象
Obj ValidationError(msg) {
    this.message = msg
}
throw ValidationError("Invalid input")

Unicode 标识符

// 中文标识符
let 名字 = "小明"
let 年龄 = 20

func 打印信息(姓名, 岁数) {
    print("${姓名} 今年 ${岁数} 岁")
}
打印信息(名字, 年龄)
// → 小明 今年 20 岁

// 日文 / 带重音标识符
let ユーザー名 = "tanaka"
let café = "espresso"

内建函数

12 个内建函数 + 17 个数组/字符串内建方法。

函数 说明
print(...) 变参输出,空格分隔,末尾换行
clock() 返回 Unix 时间戳(秒,毫秒精度)
input(prompt?) 从 stdin 读取一行;可选 prompt 参数
int(value) 转为 int64(截断小数);接受 number/string/bool
float(value) 转为 float64;接受 number/string/bool
len(value) 返回数组长度或字符串字符数(int64)
type(value) 返回类型名:"int" / "float" / "string" / "array" / "boolean" / "null" / "function" / "object"
range(stop) 生成 0..stop-1 的数字数组
range(start, stop, step?) 生成指定范围的数字数组
assert(cond, msg?) 断言条件为真,否则抛出 RuntimeError
bin(num) 数字 → 二进制字符串(如 "0b101"
oct(num) 数字 → 八进制字符串(如 "0o12"
hex(num) 数字 → 十六进制字符串(如 "0xFF"

数组内建方法(7 个):
.add(item) .pop() .length .insert(idx, item) .remove(idx) .indexOf(item) .clear()

字符串内建方法(10 个):
.length .substring(start, end?) .include(sub) .startsWith(p) .endsWith(s) .upper() .lower() .trim() .replace(old, new) .replaceAll(old, new) .split(delim)

项目结构

~9,400 行 C++17,零外部依赖,清晰的模块划分。支持 Windows / Linux / macOS 多架构构建与原生打包。

Vora/
├── src/
│   ├── lexer/ 词法分析器(~687 行)
│   ├── ast/ AST 节点 + Visitor 接口 + AST Printer(~1,629 行)
│   ├── parser/ Pratt 解析器(~1,200 行)
│   ├── interpreter/ 树遍历解释器(~1,621 行)
│   ├── vm/ 字节码 VM:Compiler + 栈式虚拟机(~3,175 行)
│   └── runtime/ 值系统 / 作用域 / 可调用对象 / 错误(~719 行)
├── cmake/toolchains/ 交叉编译工具链(6 个)
├── res/ 图标、WiX 安装包、启动器
├── .github/workflows/ CI 多架构矩阵(18 个组合)
├── examples/ 24 个示例文件(按特性编号)
├── tests/ 13 个测试文件 + run_tests.ps1 / run_tests.sh
├── docs/ 开发文档(10 篇,中文)
├── std/ 标准库(规划中)
├── build.ps1 / build.sh 跨平台构建脚本
├── CMakePresets.json 20 个预设
└── CMakeLists.txt

路线图

三阶段演进:AST 解释器(✅)→ 字节码 VM(Phase 1-4 ✅)→ JIT(规划中)。

版本 特性 状态
v0.1 词法分析器(Lexer):Source → Token 流 ✅ 已完成
v0.2 语法分析器(Parser):Token → AST + Pratt 解析 ✅ 已完成
v0.3 AST 改进、分号语句分隔符 ✅ 已完成
v0.4 树遍历解释器、字符串插值、数组、对象、方法绑定 ✅ 已完成
v0.5 int()/float()、range()、++/--、break/continue、复合赋值、类型标注 ✅ 已完成
v0.6 字节码 VM Phase 1(表达式、全局变量、控制流)+ Visitor 模式重构 ✅ 已完成
v0.7 VM Phase 2+3:局部变量、break/continue、for-in、函数、对象(Obj)、继承、try/catch/throw ✅ 已完成
v0.8 VM Phase 3-4:闭包(upvalue)、字符串插值、运行时错误 catch 完善;VM 设为默认后端 ✅ 已完成
v0.9 VM 性能优化:全局变量驻留、快速数值操作码、常量折叠、移动语义 ✅ 已完成
v0.10 VM 异常处理完善(finally 路由、异常重抛、catch handler 清理) ✅ 已完成
v0.11 多架构构建系统 + 应用图标 + 原生打包(.msi/.deb/.rpm/.pkg.tar.xz)+ CI ✅ 已完成
v0.12 int64/float64 双数值类型 + `len()`/`type()` + 数组方法(7) + 字符串方法(10) ✅ 已完成
v0.13 模块系统(import / export) ⏳ 规划中
v1.0 标准库、LSP、包管理器 vpm 规划中
未来 优化 / JIT 编译(第三版) 长期

文档

10 篇开发文档(中文)+ 4 个用户文档页面(HTML)。

文档 内容
01-技术栈概览.md 技术栈、架构、构建命令
02-项目结构.md 项目结构与模块划分
03-词法分析器开发文档.md Lexer 设计(单遍扫描、错误恢复、Unicode)
04-AST开发文档.md AST 节点设计与 Visitor 模式
05-语法分析器开发文档.md Pratt Parser 设计
06-解释器开发文档.md Interpreter 设计(树遍历执行)
07-运行时系统开发文档.md Value / Environment / Callable 系统
08-已实现功能总结.md 所有已实现功能的完整总结 + 版本历程
09-构建系统指南.md 多架构构建、交叉编译、打包指南
10-程序员视角-深度分析与UX路线图.md ~747 行深度分析 + UX 路线图(2026-06-10 修订)

📚 用户文档 — 快速开始 · 语言参考 · 示例程序(HTML)