rustc_codegen_jvm: 可生成JVM字节码的Rust编译器后端

Lobsters Hottest 工具

摘要

rustc_codegen_jvm 是一个自定义的Rust编译器后端,能够生成JVM字节码,从而将Rust代码编译成可在JVM 8+上运行的JAR文件。它支持多种Rust特性,包括控制流、数据结构、特征(traits)和闭包。

<p><a href="https://lobste.rs/s/lcldxn/rustc_codegen_jvm_rust_compiler_backend">评论</a></p>
查看原文
查看缓存全文

缓存时间: 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 文件。


目录

  1. 演示
  2. 特性
  3. 工作原理
  4. 先决条件
  5. 安装与构建
  6. 使用
  7. 运行测试
  8. 项目结构
  9. 贡献
  10. 许可证

演示

这些示例位于 tests/binary 目录下,已编译为 JVM 字节码,并在集成测试阶段的 CI 中进行验证。示例包括:


特性

  • 优化:常量折叠、常量传播和死代码消除,生成干净的 JVM 字节码。
  • 标准库支持:针对 JVM 输出的宿主目标提供基础 core 支持。
  • 算术运算:支持整数、浮点数和检查运算。
  • 操作:比较、位运算和逻辑运算。
  • 控制流:支持 if/elsematchforwhileloop
  • 类型处理:类型转换(as)和基本类型。
  • 函数:函数调用、递归以及在多种上下文中使用的函数指针(ADT 内部、作为变量、参数、返回值或泛型参数)。
  • 数据结构:数组、切片、结构体、元组和枚举(C 风格和 Rust 风格)。
  • 内存管理:可变借用、引用和解引用。
  • 面向对象结构:ADT 的实现,包括 self&self&mut self
  • Trait 与闭包:动态分发(&dyn Trait)和闭包捕获。
  • 联合体:支持基本类型(booli8/u8i16/u16i32/u32f32f64)以及包含这些类型组合的结构体。
  • 输出:为二进制 crate 生成可执行的 .jar
  • 测试:在 debug 和 release 两种模式下覆盖这些特性的综合集成测试。

当前里程碑:全面支持 Rust core crate。


工作原理

  1. Rustc 前端 → MIR
    标准 rustc 编译器将代码解析为中间表示(MIR)。

  2. MIR → OOMIR
    自定义的“面向对象 MIR”层将 MIR 简化为面向对象风格的构造(定义在 src/lower1.rs)。

  3. OOMIR 优化器
    使用以下技术优化 OOMIR(定义在 src/optimise1.rs):

    • 常量折叠:编译时计算常量表达式。
    • 常量传播:用常量值替换变量。
    • 死代码消除:移除未使用的执行路径。
    • 代数化简:利用代数恒等式简化表达式。
  4. OOMIR → JVM Class 文件
    使用 ristretto_classfile 将 OOMIR 转换为 .class 文件(定义在 src/lower2.rs)。

  5. R8 处理
    调用 r8 添加栈映射帧(JVM 8+ 必需)并应用进一步的优化。

  6. 链接与打包
    使用 java-linker.class 文件打包为可运行的 .jar,并附带适当的 META-INF/MANIFEST.MF


先决条件

  • Rust Nightlyrustup default nightly
  • Gradle 8.5+gradle 必须在系统 PATH 中)
  • JDK 8+java 必须在系统 PATH 中,且设置 JAVA_HOME
  • Python 3python3 必须在系统 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.tomljvm-unknown-unknown.json
  • 供应商依赖(如 R8)

后续运行 build.py 时会检查文件时间戳,只重新构建已修改的组件。


使用

  1. 配置你的项目
    在你的 Rust 项目目录中,创建或更新 .cargo/config.toml,复制本仓库根目录生成的模板。确保 Cargo.toml 包含以下特性标志以支持分离编译配置:

    cargo-features = ["profile-rustflags"]
    
  2. 使用 Cargo 构建

    cargo build             # 调试构建
    cargo build --release   # 优化构建
    
  3. 运行 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 双许可,你可任选其一:

相似文章

jank 现已拥有自己的自定义 IR

Lobsters Hottest

jank 是一种 Clojure 方言,现已引入一种在 Clojure 语义层面设计的自定义中间表示,以实现更好的优化并与 JVM 竞争。

CUDA-oxide:NVIDIA 官方 Rust 转 CUDA 编译器

Hacker News Top

CUDA-oxide 是由 NVIDIA 开发的实验性 Rust 转 CUDA 编译器,支持使用地道的 Rust 编写安全的 GPU 核函数,可直接编译为 PTX,无需借助领域特定语言或外部绑定。