rustc_codegen_jvm: 可生成JVM字节码的Rust编译器后端
摘要
rustc_codegen_jvm 是一个自定义的Rust编译器后端,能够生成JVM字节码,从而将Rust代码编译成可在JVM 8+上运行的JAR文件。它支持多种Rust特性,包括控制流、数据结构、特征(traits)和闭包。
查看缓存全文
缓存时间: 2026/06/02 15:50
IntegralPilot/rustc_codegen_jvm 源码:https://github.com/IntegralPilot/rustc_codegen_jvm
rustc_codegen_jvm 许可证:MIT/Apache-2.0 (https://opensource.org/licenses/MIT) CI(https://github.com/IntegralPilot/rustc_codegen_jvm/actions)
一个自定义的 Rust 编译器后端,用于生成 Java 虚拟机字节码。可将 Rust 代码编译为兼容 JVM 8+ 的可运行 .jar 文件。
目录
演示
这些示例位于 tests/binary 目录下,已编译为 JVM 字节码,并在集成测试阶段的 CI 中进行验证。示例包括:
- RSA 加密/解密
- 二分查找 算法
- 斐波那契 序列生成器
- 考拉兹猜想 验证器
- 大素数 生成器
- 枚举 和 结构体(嵌套数据结构:结构体、元组、数组和切片)
- 实现块 和 Trait(包括动态分发)
- 联合体(演示某些
unsafe操作)
特性
- 优化:常量折叠、常量传播和死代码消除,生成干净的 JVM 字节码。
- 标准库支持:针对 JVM 输出的宿主目标提供基础
core支持。 - 算术运算:支持整数、浮点数和检查运算。
- 操作:比较、位运算和逻辑运算。
- 控制流:支持
if/else、match、for、while和loop。 - 类型处理:类型转换(
as)和基本类型。 - 函数:函数调用、递归以及在多种上下文中使用的函数指针(ADT 内部、作为变量、参数、返回值或泛型参数)。
- 数据结构:数组、切片、结构体、元组和枚举(C 风格和 Rust 风格)。
- 内存管理:可变借用、引用和解引用。
- 面向对象结构:ADT 的实现,包括
self、&self和&mut self。 - Trait 与闭包:动态分发(
&dyn Trait)和闭包捕获。 - 联合体:支持基本类型(
bool、i8/u8、i16/u16、i32/u32、f32、f64)以及包含这些类型组合的结构体。 - 输出:为二进制 crate 生成可执行的
.jar。 - 测试:在 debug 和 release 两种模式下覆盖这些特性的综合集成测试。
当前里程碑:全面支持 Rust core crate。
工作原理
-
Rustc 前端 → MIR
标准rustc编译器将代码解析为中间表示(MIR)。 -
MIR → OOMIR
自定义的“面向对象 MIR”层将 MIR 简化为面向对象风格的构造(定义在src/lower1.rs)。 -
OOMIR 优化器
使用以下技术优化 OOMIR(定义在src/optimise1.rs):- 常量折叠:编译时计算常量表达式。
- 常量传播:用常量值替换变量。
- 死代码消除:移除未使用的执行路径。
- 代数化简:利用代数恒等式简化表达式。
-
OOMIR → JVM Class 文件
使用ristretto_classfile将 OOMIR 转换为.class文件(定义在src/lower2.rs)。 -
R8 处理
调用r8添加栈映射帧(JVM 8+ 必需)并应用进一步的优化。 -
链接与打包
使用java-linker将.class文件打包为可运行的.jar,并附带适当的META-INF/MANIFEST.MF。
先决条件
- Rust Nightly(
rustup default nightly) - Gradle 8.5+(
gradle必须在系统 PATH 中) - JDK 8+(
java必须在系统 PATH 中,且设置JAVA_HOME) - Python 3(
python3必须在系统 PATH 中)
安装与构建
克隆仓库并使用主构建脚本构建所有组件:
# 克隆仓库
git clone https://github.com/IntegralPilot/rustc_codegen_jvm.git
cd rustc_codegen_jvm
# 使用 Python 构建所有组件
# 在 Linux 或 macOS 上:
./build.py all
# 在 Windows 上:
python build.py all
该脚本按照正确的依赖顺序构建必要的组件:
- Kotlin 库 shim(
library/) - shim 元数据文件(
core.json) java-linker可执行文件rustc_codegen_jvm后端库- 配置文件(
config.toml、jvm-unknown-unknown.json) - 供应商依赖(如 R8)
后续运行 build.py 时会检查文件时间戳,只重新构建已修改的组件。
使用
-
配置你的项目
在你的 Rust 项目目录中,创建或更新.cargo/config.toml,复制本仓库根目录生成的模板。确保Cargo.toml包含以下特性标志以支持分离编译配置:cargo-features = ["profile-rustflags"] -
使用 Cargo 构建
cargo build # 调试构建 cargo build --release # 优化构建 -
运行 JAR 文件
java -jar target/debug/deps/your_crate*.jar # 运行调试构建 java -jar target/release/deps/your_crate*.jar # 运行发布构建
运行测试
首先确保工具链已构建:
# 在 Linux/macOS 上:
./build.py all
# 在 Windows 上:
python build.py all
使用测试运行器运行测试套件:
# 以调试模式运行测试
python Tester.py
# 以发布模式运行测试
python Tester.py --release
测试结果将输出到控制台。临时测试产物会被写入 .generated/ 目录以便调试。
项目结构
.
├── src/ # rustc_codegen_jvm 编译器后端
│ ├── lib.rs
│ ├── lower1.rs # MIR → OOMIR 转换
│ ├── lower2.rs # OOMIR → JVM 字节码翻译
│ └── oomir.rs # OOMIR 数据定义
├── java-linker/ # 将编译后的 .class 文件打包为 .jar 归档
├── tests/binary/ # 集成测试和源码示例
├── library/ # Rust core 库的 Kotlin shim 实现
├── shim-metadata-gen/ # 生成 core.json 元数据的工具
├── proguard/ # Proguard / R8 配置规则
├── build.py # 编排构建脚本
├── config.toml.template # cargo 项目的配置模板
├── jvm-unknown-unknown.json.template
├── Tester.py # 自动测试运行器
└── LICENSE, LICENSE-Apache
贡献
欢迎提交贡献、问题报告和拉取请求。
许可证
本项目采用 MIT 许可证 和 Apache 许可证,版本 2.0 双许可,你可任选其一:
相似文章
H2JVM - 用于编写JVM字节码的Haskell库
H2JVM 是一个Haskell库,允许开发者直接在Haskell中编写JVM字节码,支持底层JVM操作。
jank 现已拥有自己的自定义 IR
jank 是一种 Clojure 方言,现已引入一种在 Clojure 语义层面设计的自定义中间表示,以实现更好的优化并与 JVM 竞争。
CUDA-oxide:NVIDIA 官方 Rust 转 CUDA 编译器
CUDA-oxide 是由 NVIDIA 开发的实验性 Rust 转 CUDA 编译器,支持使用地道的 Rust 编写安全的 GPU 核函数,可直接编译为 PTX,无需借助领域特定语言或外部绑定。
cuda-oxide: 一款实验性的 Rust-to-CUDA 编译器
cuda-oxide 是 NVIDIA 发布的一款实验性 Rust-to-CUDA 编译器后端,支持纯 Rust GPU 内核开发,无需外部语言绑定。
Zerostack – 一个受Unix启发的纯Rust编写的编码助手
Zerostack 是一个完全用 Rust 构建的受 Unix 启发的编码助手,旨在帮助开发人员进行代码生成和自动化。