☰
HVM1 构建指南:从源码编译、安装到 Nix 打包的完整实践
2026/10/2 17:21:57 网站建设 项目流程
  • 语言运行时
  • 编译器
  • 高性能计算

【免费下载链接】HVM1

HVM1 (2022): a massively parallel, optimal functional runtime in Rust

项目地址:https://gitcode.com/GitHub_Trending/hv/HVM1
点击查看免费下载

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

项目地址:https://gitcode.com/GitHub_Trending/hv/HVM1
点击查看免费下载

相关推荐

上一篇:为什么AtCoder Library能提升竞赛编程效率:内部实现原理揭秘
下一篇:iii Engine 协议深度解析:Worker 与引擎之间的 WebSocket 线级通信规范

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询