- 语言运行时
- 编译器
- 高性能计算
【免费下载链接】HVM1
HVM1 (2022): a massively parallel, optimal functional runtime in Rust
HVM1 是 HVM(Higher-order Virtual Machine)的早期核心版本,一个用 Rust 编写的「大规模并行、beta-最优」函数式运行时(详见 README.md)。本文以仓库根目录的 BUILDING.md 为主线,系统讲解如何从源码克隆、用 Cargo 直接构建运行、安装全局可执行文件,以及如何通过 Nix 完成构建与打包,并结合src/main.rs、Cargo.toml、flake.nix等源码与配置文件,说明每个命令背后的实际行为。读完本文,你将能够在本地完整复现 HVM1 的构建环境,并掌握解释运行、编译为原生二进制、Nix 开发环境三种使用路径。
构建前置环境:Rust nightly 工具链
HVM1 的运行时与编译器全部由 Rust 编写,且依赖若干 unstable 特性。仓库根目录的 rust-toolchain.toml 只有一行关键配置:
[toolchain] channel = "nightly"这表示必须使用 Rust nightly 工具链才能编译本仓库。src/main.rs 第一行即#![feature(atomic_from_mut)],说明源码直接使用了仅 nightly 提供的 feature,使用 stable 工具链将无法通过编译。同时,Cargo.toml 声明了项目元信息:
- 包名
hvm1,版本1.0.12,edition 2021; - 同时构建
cdylib与rlib两种库形态(crate-type = ["cdylib", "rlib"]),便于被其他 Rust 项目以库方式引用; - 唯一的
[[bin]]可执行目标名为hvm1; [profile.release]显式将opt-level设为3,保证发布构建启用最高优化等级;- 依赖包括
clap(CLI 参数解析)、crossbeam(并发)、sysinfo(系统信息)、itertools等。
安装 nightly 工具链的典型做法(与 README.md 中的 "Getting Started" 一致):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup toolchain install nightly安装完成后,可用rustup show确认当前目录识别到 nightly 工具链。
第一步:克隆仓库
BUILDING.md 给出的第一步是克隆源码并进入目录:
git clone https://github.com/HigherOrderCO/HVM.git cd HVM本仓库对应的实际源码目录即当前工作区(项目名 HVM1,包名hvm1),克隆后即可直接进行下一步构建。仓库根目录包含构建相关的关键文件:BUILDING.md、NIX.md、Cargo.toml、rust-toolchain.toml、flake.nix、shell.nix、default.nix 与 flake.lock。
方式一:直接构建并以解释器运行
BUILDING.md 给出的核心命令是:
cargo run -- run foobar.hvm这条命令会先编译整个 crate,然后以解释模式执行foobar.hvm中的程序。它的语义由 src/main.rs 中的 CLI 定义决定:run子命令(别名r)接受一个file参数(-f/--file,默认值为空字符串)和一个表达式参数(默认值为Main)。当file为空时,load_code直接返回空字符串,因此run也可以直接接收一个内联表达式,例如 README 中的入门示例:
hvm1 run "(@x(+ x 1) 41)"若需要加载文件,则用-f显式指定,例如hvm1 run -f foobar.hvm。注意:当前仓库 Cargo.toml 中[[bin]]名称为hvm1,因此cargo run直接构建得到的可执行文件是hvm1;若你安装的是发布版hvm,命令前缀以实际安装名为准。
run子命令还提供以下可调参数(来自 src/main.rs):
| 参数 | 含义 | 默认值 |
|---|---|---|
-s, --size | 堆大小(按 64 位节点计数) | auto(调用runtime::default_heap_size()) |
-t, --tids | 使用的线程数 | auto(调用runtime::default_heap_tids()) |
-c, --cost | 显示执行的图重写次数 | false |
-d, --debug | 调试模式,逐步显示每次归约 | false |
-f, --file | 要加载的.hvm文件 | 空字符串 |
expr(位置参数) | 要运行的表达式 | Main |
值得注意的是,当开启-d调试模式时,src/main.rs 会将tids强制置为1,即单线程逐步执行。启用-c后,运行结束会在 stderr 输出耗时、重写次数与每秒重写率(RPS),例如 guide 中展示的格式[TIME: 0.96s | COST: 35000007 | RPS: 36.38m]。
仓库中的examples/hello/main.hvm是最简单的验证用例:
// HVM's "Hello, world!" is just a string! Main = "Hello, world!"可以运行cargo run -- run -f examples/hello/main.hvm来验证整条构建链路是否打通。
方式二:构建并安装全局二进制
如果希望将 HVM1 安装为系统级的可执行文件,BUILDING.md 给出的命令是:
cargo install --path .cargo install --path .会编译当前目录的 crate,并把生成的可执行文件安装到 Cargo 的 bin 目录(通常为~/.cargo/bin,由CARGO_HOME决定)。由于[profile.release]中opt-level = 3,cargo install默认使用 release 配置,因此安装的是高优化版本。
安装完成后,即可在任何目录直接调用该命令解释运行 HVM 程序,例如:
hvm1 run "(@x(+ x 1) 41)"如果你通过 crates.io 或 git 安装的是hvm包(参见 guide/README.md 中的cargo +nightly install --force --git https://github.com/HigherOrderCO/HVM.git),则命令前缀为hvm,且可用hvm --version验证安装是否成功。
进阶:将 .hvm 编译为 Rust 原生二进制
BUILDING.md 主文档未展开,但其引用的 NIX.md 与源码中均包含「编译到 Rust」的完整路径:run是解释执行,而compile子命令(别名c)会把.hvm文件编译为一个完整的 Rust 项目。src/main.rs 中该命令的实现为:读取.hvm源码,调用compiler::compile,将定义预编译进归约引擎,并打印Compiled definitions to '/<name>'.。
编译后的产物是一个独立的 Rust 仓库,其中所有.hvm顶层定义都被预编译进归约引擎(见 src/compiler/compile.rs,它通过模板替换把precomp.rs、reducer.rs中的//[[CODEGEN:...]]//占位符替换为生成的 Rust 代码),因此运行速度远高于解释模式。guide/README.md 展示的完整流程为:
hvm compile summation.hvm cd summation cargo install --path . summation run -c true "(Sum 0 0 100000000)"也就是说,编译产物的可执行文件行为与hvm命令一致,但无需再加载文件即可直接调用其中定义的函数(如Sum),并显著提速。仓库的 bench/benchmark.js 也印证了这一构建流程:先hvm compile main.hvm,再进入生成的main目录执行cargo build --release,最后将target/release/main移出作为基准测试用二进制。
方式三:使用 Nix 构建
BUILDING.md 最后一行将 Nix 构建指引指向 NIX.md。该文档给出了完整的 Nix 使用流程,此处完整继承其关键命令。
前提:安装 Nix 并启用 Flakes
先安装 Nix(官方安装手册),并启用 Flakes 特性,然后克隆仓库:
git clone https://github.com/HigherOrderCO/HVM.git cd HVM访问/安装 HVM 二进制
两种可选方式:临时进入开发 shell(不安装到系统)或永久安装到 Nix profile:
# 进入一个自带 hvm 命令的 shell(不安装) nix shell .#hvm # 安装到 Nix profile nix profile install .#hvm上述.#hvm指向 flake.nix 中声明的输出:该 flake 使用nix-cargo-integration(nci)自动生成 derivation,outputs.defaults将应用与包名均设为hvm,并配置clang作为 C 编译器、openssl作为运行时库。flake 还通过nix-filter只把构建必需目录(./src、Cargo.lock、Cargo.toml、rust-toolchain.toml)纳入 derivation,以减小构建体积(见 flake.nix)。
编写 HVM 文件
与普通使用方式相同,创建.hvm文件(参考 guide/README.md 的 "First program" 一节),例如:
// Sums all numbers in the (a .. b) range (Sum 1 a b) = a (Sum 0 a b) = let m = (/ (+ a b) 2) let n = (+ m 1) let l = (Sum (== a m) a m) let r = (Sum (== n b) n b) (+ l r)解释运行或编译运行
NIX.md 给出的运行/编译命令为:
# 解释 main.hvm 中的表达式,传入 "(Main 25)" 作为参数 hvm run -f main.hvm "(Main 25)" # 将其编译为 Rust hvm compile main.hvm cd main # 初始化 Nix 开发 shell nix develop .#hvm # 编译生成的 Rust 代码 cargo build --release # 运行得到的二进制 ./target/release/main run "(Main 25)"注意此处nix develop .#hvm与nix shell .#hvm的差异:nix develop会进入包含构建工具链(含ghc、nodejs等,见 flake.nix 的shell.commands配置)的开发环境,专用于在编译生成的 Rust 项目内执行cargo build;而nix shell .#hvm只提供现成的hvm可执行命令。
常见问题与注意事项
- 必须 nightly:仓库依赖
atomic_from_mut等 unstable 特性(src/main.rs),请确保rustup toolchain install nightly已执行,且工具链解析到 nightly。 - 二进制命名差异:本仓库 Cargo.toml 中 bin 名为
hvm1;BUILDING.md / NIX.md / README 中的命令示例使用hvm。实际使用时应以安装的包与二进制名为准,命令语义完全一致。 run与compile的区别:run走解释器路径(src/main.rs),compile生成预编译的 Rust 工程(src/main.rs),后者面向生产与基准测试场景,性能更高。- 性能观测:加
-c可输出图重写次数(COST)与 RPS,用于与机器无关的算法复杂度度量(详见 guide/README.md 与 PARALLELISM.md)。 - Hello World 验证:最小用例见 examples/hello/main.hvm,构建完成后可用它快速验证整条链路。
延伸阅读
- NIX.md:Nix 构建与开发的完整命令清单;
- guide/README.md:HVM 语言语法、并行函数设计、编译与内建函数的使用指南;
- guide/HOW.md:底层技术(Interaction Net、beta-最优归约)原理;
- src/main.rs:CLI 子命令与参数的全部定义;
- flake.nix:Nix flake 的 derivation 配置细节。
- 语言运行时
- 编译器
- 高性能计算
【免费下载链接】HVM1
HVM1 (2022): a massively parallel, optimal functional runtime in Rust
相关推荐
Nix 源码构建开发指南:从 devShell 到交叉编译的完整实践
Nix 源码构建开发指南:从 devShell 到交叉编译的完整实践 本文是 Nix(纯函数式包管理器)源码仓库的开发(Hacking)入门指南,基于仓库根目录
包管理器开发工具CLI构建工具3 步装好 eSearch:跨平台屏幕截屏与离线 OCR 工具快速上手指南
3 步装好 eSearch:跨平台屏幕截屏与离线 OCR 工具快速上手指南 eSearch 是一款覆盖 Windows、Linux 与 macOS 的跨平台屏幕
桌面应用OCR屏幕录制视频处理图像处理PowerInfer模型转换:从Hugging Face到GGUF格式的完整指南
PowerInfer模型转换:从Hugging Face到GGUF格式的完整指南 你是否曾经遇到过这样的困境:在Hugging Face上找到了心仪的大语言模型
人工智能大模型推理引擎本地部署
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考