返回

文章详情

crustc:整个 `rustc` 的 C 语言翻译版

Hacker News2026年7月2日 22:57

crustc - rustc 1.98.0-nightly (c712ea946 2026-06-16),转换为 4600 万行 C 代码。这是一个功能齐全的 Rust 编译器,可以使用 GCC 和 make 构建。# 我们需要提供 LLVM 的路径(`libLLVM.so.22.1-rust-1.98.0-nightly`) # 我 *可以* 在项目中包含预构建的 LLVM,但我更愿意不在项目中嵌入随机的二进制文件。 make -j20 LLVM_LIB_DIR=~/.rustup/toolchains/nightly-2026-06-16-aarch64-unknown-linux-gnu/lib 这只是 C 代码 [1],编译后会给你一个功能齐全的 Rust 编译器。# 它工作正常 - (库路径指向 libLLVM.so.22.1-rust-1.98.0-nightly - rustc 使用 llvm) LD_LIBRARY_PATH=~/.rustup/toolchains/nightly-2026-06-16-aarch64-unknown-linux-gnu/lib:./rustc_driver ./rustc/rustc --version rustc 1.98.0-nightly (c712ea946 2026-06-16) 这个 Rust 编译器可以编译代码 - 构建 core,alloc,std - 你说得出名字的!这是什么?这是我新的 Rust 到 C 编译器工具链的演示/预告。完整的 cilly 工具链可以将您自己的 Rust 编译为 C,以便于任意目标。这个仓库只是展示了编译器自己编译自己的过程,因为我相信这是我所能做的最精彩的展示。 这是怎么做到的?在过去的 3 年里,我一直在致力于将 Rust 编译为 C。我做了一些公开的尝试,比如 rustc_codegen_clr,还有许多私下的尝试。根据我的计算,这是第 14 次尝试:cilly。它是一个用于生成 C 代码的 Rust 库和一个 Rust 编译器后端(即插件),允许您将 Rust 编译为 C。cilly 背后的主要创新在于它可以适应 C 编译器。它可以生成“见证”程序,以检查给定编译器和平台支持的内容:/* 只有当我们的 C 编译器支持 _Thread_local 时,此代码才会编译。 */ _Thread_local int KEYWORD_TLS_SUPPORTED;这意味着 cilly 将生成 C 代码,以使您特定的奇怪“Blorbo OS 的 Shminky C 编译器”满意。/* 这将在一些 C 编译器中通过。 */ assert(sizeof(float)== sizeof(double));查询所有类型布局、大小、对齐、字符编码(ASCII)和整数格式(补码)。尽可能提供后备机制。我努力确保不假设除 ANSI C[2] 以外的任何内容 - 包括现代 C 标准下的解决方法,如严格别名。遗憾的是,这意味着 cilly 输出的代码是特定于编译器的(即,您不能将为 Arm64 生成的 cilly C 代码在 riscv32 上运行,但您可以专门为 riscv32 生成 cilly C 代码)。这个 rustc 的构建(生成的 C 代码)是“面向” ARM64 Linux,因为这正是我工作站的指令集。 为什么要这么做?主要目标是支持没有 LLVM/GCC 支持的旧/偏僻硬件。仍然有一些系统不支持 Rust,但支持 C。每当某个项目从 Rust 转向 C,或者一个 Rust 替代的 C 项目被创建时,针对这些目标的支持有效地被提出作为 Rust 的缺点 [3]。这个项目的目标是消除这个问题。cilly 包装了 rustc 和 C 编译器,并实时将 Rust 代码转换为 C。从用户的角度来看,这就像是为给定目标定义要使用的 C 编译器一样简单。 "triple": ["sdcc_z180-unknown-none"], "tool_def": { "kind": "local", "compile": { "base": { "executable": "/usr/bin/sdcc", "base_args": ["-mz180", "--std-c89", "-c"], "input_arg_template": ["{input}"], // JSON 截断以简化内容. } } } 网络透明性。cilly 是网络透明的,可以通过 TCP 与 C 编译器进行通信(如果需要,可能扩展到奇怪的东西,如 UART)。这是解决引导悖论/没有 C 交叉编译器的平台的解决方案。您在 Blorbo OS 上构建一个小的 C 服务器,在 Linux 等正常平台上运行 rustc,让 cilly 通过网络进行通信。我已经成功地在 Arm64 linux 上运行 rustc 的同时,为 x86 Plan9 虚拟机编译了小的 Rust 程序。 term% echo `{cat /dev/sysname} osversion `{cat /dev/osversion} cputype $cputype gnot osversion 2000 cputype 386 term% /tmp/hello_plan9 你好,世界!term% nm /tmp/hello_plan9 | grep rust_begin_unwind 1020 T _RNvCshfEkAwg4zv6_7___rustc17rust_begin_unwind 生成 makefile。cilly 可以选择在其目标文件中嵌入标记,并将其 IR 保存到缓存目录。然后,它可以读取这些标记,通过定义位置拆分函数/全局变量,并生成一个带有 makefile 的目录 - 以允许您使用 C 编译器和 make 构建 Rust。 ABI 兼容性 cilly 生成的代码在大多数情况下与普通 rustc 编译的代码 ABI 兼容。我说是“基本上”,因为在某些平台上(...例如 arm64),rustc 选择的 ABI 是无法从 C 表示的 [4]。复制要求 此 rust 编译器是在以下环境下构建的: uname -a Linux spark-2773 6.17.0-1021-nvidia # 21-Ubuntu SMP PREEMPT_DYNAMIC Wed May 27 19:14:05 UTC 2026 aarch64 aarch64 aarch64 GNU/Linux 这是我使用的 C 编译器: readelf -p .comment ./rustc/rustc '.comment' 部分的字符串转储: [ 1] GCC: (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0 [ 2e] 链接器: Ubuntu ...

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡