vibe
vibe 是一种小型的、带效果类型的语言,拥有一个仅自托管的编译器:
解析器、类型检查器和 WASM 代码生成器均使用 vibe 本身编写
(lib/@vibe/compiler/, lib/@vibe/cli/),并通过 wasm 运行器从已提交的种子构建——构建或运行它不需要 MoonBit 工具链(原始的 MoonBit 宿主已在 #594 中退役)。
安装
vibe 以一个小巧的 wasmtime 运行器(viberun)和一个便携式编译器
wasm 的形式发布;安装程序在安装时为你的机器 AOT 编译该编译器。
从源码构建运行器需要 git、bash 和 cargo;传入
--runner PATH 可改用预构建的版本。参见
docs/install.md 获取完整的前置条件列表。
curl -fsSL https://raw.githubusercontent.com/mizchi/vibe-lang/main/scripts/installer.sh | bash
. "$HOME/.vibe/env" # or restart the shell — ~/.vibe/bin is the PATH entry
vibe version
echo 'fn main with Stdout { Stdout::write_stream("42\\n") }' > hello.vibex
vibe run hello.vibex # -> 42
参见 docs/install.md 了解安装布局、选项以及如何独立于 runner 更新编译器。
示例代码
// Effect-typed error handling: failure travels in the effect row, not in the
// return type, so the success value flows straight through to the caller.
fn safe_div(a: Int, b: Int) -> Int with Exception[String] {
match b {
0 => throw("division by zero"),
_ => a / b
}
}
// Structs and module-local helpers
struct Point { x: Int; y: Int } derive(Eq, Show)
fn Point::manhattan(p: Point) -> Int {
p.x + p.y
}
fn main with Stdout {
// `handle` is where the row is discharged — no per-call unwrapping.
let result = handle {
safe_div(10, 2) + Point::manhattan(Point::{ x: 3, y: 4 })
} with Exception[String] {
Throw(msg) => {
Stdout::write_stream("failed: \{msg}\n")
0 - 1
}
}
Stdout::write_stream("\{result}\n")
}
刚接触这门语言?从可运行的教程开始:
docs/tutorial/ — 每一章都是一份 *.vibe.md
可执行文档 (#1142):代码块会被编译并运行,且打印的
输出直接嵌入在 Markdown 中,因此示例及其结果
不会发生偏差。
设计政策
三项承诺驱动着每一个设计决策。当两个目标冲突时,
优先级顺序为:绝不静默出错 > 诚实表示 > 表面
便利性。(面向 Agent 的版本及具体先例:AGENTS.md。)
1. 一门现代、静态类型的函数式语言,其中副作用是
显式的。 语法和纪律源自 Rust / MoonBit / Koka /
Verse 的血统:副作用存在于行类型(with Exception + Fs)中,而非返回类型
包装器中。类型和诊断信息针对 LLM 评估循环进行了调优——
最糟糕的故障类别是静默出错(在分诊中其优先级高于“崩溃”),
诊断信息必须以可操作的编辑建议开头,而不是内部路径名称,
一个概念只有一种拼写方式,并且文档中的每个代码块都会
针对当前编译器进行编译检查。单一拼写规则正在作为已决定但待落地的
工作应用:== 在所有上下文中变为结构化
(ADR-0097, #1526 — 目前裸 Array/Bytes == 仍然是引用
相等性),迭代收敛于两层——急切 Array::* 和拉取
AsyncIter(ADR-0099, #1559)——并且 Exception 是规范拼写,
Error 在 1.0 冻结时弃用(ADR-0085, #1564)。
2. 在 wasm 上自托管,利用 wasm 的最新能力。 编译器
使用 vibe 编写,并从已提交的种子构建——无需其他工具链。内部
表示与 wasm 和 WIT 保持无缝衔接,而非将其隐藏:
值为带标签的 i64,String 正式定义为按字节
偏移索引的字节字符串(ADR-0098 — 内存实际存储的内容),而哪些内容可以跨越 WIT
边界则由名义规则决定(ADR-0089)。续体是
针对 wasm-gc(类型化引用通道,ADR-0095)、栈切换(当前为带栈
提升 + waitable-set,JSPI 作为替代后端)以及线程设计的——
并发目前采用无共享模式(TaskGroup + Send/区域
检查),且表示方式经过选择,以便后续能够引入真正的线程。
3. 对权限和效果的显式控制,面向 vibe 编程时代。
Deno 风格的权限与 Koka 风格的效果系统相结合:能力在
效果行中传递,调用点保持为普通函数调用,且权限在尽可能早的阶段固定
(构建 → 应用 → 实例化;运行时不可变 — ADR-0075/0084/0088)。增量构建支持笔记本风格的
迭代(vibe check 通道默认复用类型检查)。在构建时解析的能力驱动目标 wasm
运行时的渐进式代码生成:--allow-* 标志会对未授予的
能力进行常量折叠和死代码消除,并且生成的二进制文件会声明其所需的 wasm 特性级别。
特性
- 带有行多态效应的类型推断(
with Async,with Exception) - 模式匹配与解构,包括 struct/record 形式
- 带有 import/export 的模块系统,
.vpkg包契约 - Async/await 语法(运行时门控:
--unstable-async) - 带有占位符简写形式的 Lambda 表达式(
_+1)
运行时目标
| 目标 | 描述 |
|---|---|
| Native CLI | 通过宿主运行时进行编译执行(run / test / shell) |
| WASM (linear) | 生产默认:compile --wasm, build --release, test, bench(tagged-i64, bump allocator) |
| WASM + js-string | 带有 JS 字符串内置函数的 WASM,用于嵌入 |
| WASM GC | 长期主要目标;后端已存在(lib/@vibe/compiler/codegen/gc/)但尚未接入 CLI 编译路径 — 参见 docs/spec/memory-contract.md |
| Component Model | 用于组合的 WASI/component 打包 |
编辑器与调试
vibe lsp 是一个 stdio Language Server(诊断、类型悬停、符号、
跳转定义、作用域精确的引用/重命名、补全、签名
帮助),外加一个函数粒度的交互式调试器
(vibe run --break <fn> / --trace)和一个 VS Code DAP 适配器。参见
docs/editor-and-debugging.md.
包与依赖
依赖项通过 git/URL 分发(Deno/Go 风格 — 无中央
注册表),并通过内容哈希固定版本。参见
docs/module-system.md
了解完整的 vibe.deps / vibe add / vibe fetch 工作流。
文档
从这里开始:
- docs/cheatsheet.md — 语言速查表,涵盖所有 已实现的语法/特性
- docs/tutorial/ — 可运行、经 CI 检查的导览
- docs/vibe.md — 语言规范(针对 已实现行为的规范性文档)
参考索引:
- docs/cli-commands.md — 完整的
vibeCLI 命令参考 - docs/module-system.md — 模块系统 + 软件包分发
- docs/adding-modules.md — 如何添加/修复
lib/@vibe/*模块 - docs/editor-and-debugging.md — LSP、调试器、DAP
- docs/builtin_contract_table.generated.md — 内置函数契约
- docs/effect-wit-mapping.md — 效果系统 ↔ WASI WIT 映射
- docs/registry-design.md — 软件包注册表设计
- docs/release-roadmap.md — 路线图和发布主题
- docs/adr.md — 架构决策记录
- docs/known-issues.md — 已知问题及变通方法
贡献
构建编译器本身、运行自托管门禁、项目布局以及 用于开发的完整 CLI/任务运行器参考位于 CONTRIBUTION.md。
许可证
MIT