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操作。
1jehuang/jcode
jcode 是一个开源编码代理工具,专为多会话工作流设计,资源占用低,提供CLI安装方式,并在性能上优于Claude Code和Cursor Agent等现有代理。
JEP 544: 提前代码编译
JEP 544 介绍了用于 Java 应用程序的提前代码编译,旨在通过在训练运行中将代码编译为原生代码来改善启动和预热时间,并利用动态 JIT 编译以适应不断变化的工作负载。
crustc: 整个rustc编译器,已翻译成C语言
一个名为cilly的Rust到C编译器工具链已成功将整个rustc编译器翻译成4600万行C代码,生成了一个可以用GCC构建的功能性Rust编译器。该项目旨在通过生成可移植的C代码,使Rust能够在老旧/冷门硬件上运行。
@1jehuang:我将20个编码代理并行运行作为我的日常工作流。今天,我发布Jcode。它是一个开源代理,内存效率提升20倍…
1jehuang发布了Jcode,这是一个用Rust编写的开源终端编码代理,声称内存效率比Claude Code高20倍,可以并行运行数十个代理。