ITADN
mizchi/vibe-lang
mizchi/vibe-lang · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

vibe

vibe 是一种小型的、带效果类型的语言,拥有一个仅自托管的编译器: 解析器、类型检查器和 WASM 代码生成器均使用 vibe 本身编写 (lib/@vibe/compiler/, lib/@vibe/cli/),并通过 wasm 运行器从已提交的种子构建——构建或运行它不需要 MoonBit 工具链(原始的 MoonBit 宿主已在 #594 中退役)。

安装

vibe 以一个小巧的 wasmtime 运行器(viberun)和一个便携式编译器 wasm 的形式发布;安装程序在安装时为你的机器 AOT 编译该编译器。 从源码构建运行器需要 gitbashcargo;传入 --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 工作流。

文档

从这里开始:

参考索引:

贡献

构建编译器本身、运行自托管门禁、项目布局以及 用于开发的完整 CLI/任务运行器参考位于 CONTRIBUTION.md

许可证

MIT