文章摘要
文章介绍了作者开发的Rust转C编译器Eurydice,指出虽然Rust在内存安全等方面有优势,但在某些场景(如跨平台开源库)中仍需要将Rust代码转换为C代码以确保兼容性。作者提到Rust采用率正在提升,但在多样化环境中仍存在支持不足的问题,因此这类反向编译工具具有实际需求。
文章总结
标题:Eurydice:一个将Rust编译为C的工具(是的)
文章主要介绍了Eurydice这一将Rust代码编译为C语言的工具,探讨了其设计理念、实现细节以及应用场景。
Rust采用面临的障碍
尽管Rust在采用率上取得了显著进展,尤其在新代码开发中表现出色,但在某些场景下仍面临挑战。例如,开源库需要在多样化的目标架构、操作系统和工具链上编译,而某些环境可能不支持Rust。此外,一些遗留系统或内部工具可能仅支持C语言,这使得完全转向Rust变得困难。
Eurydice的作用
Eurydice的主要目标包括: 1. 渐进式过渡:允许代码库逐步迁移到Rust,同时保留C版本以兼容现有用户。 2. 单一版本维护:Rust代码作为权威版本,C代码通过自动化工具生成,减少维护负担。 3. 问题场景统计:通过将Rust版本设为默认选项,可以更清晰地识别那些暂时无法切换到Rust的用户。
设计特点
Eurydice的设计注重生成可读性强的C代码,尽管由于Rust的全局单态化特性,生成的C代码可能会更冗长。其设计特点包括: - 基于MIR层:直接操作Rust的中间表示(MIR),避免处理语法糖,确保翻译更贴近Rust语义。 - 代码优化:通过多种优化手段(如识别迭代器、优化数组初始化等)提升生成代码的质量。 - 兼容性处理:支持生成符合C11和C++20标准的代码,同时提供对C++17的兼容选项。
实现细节
Eurydice的实现涉及约3000行OCaml代码,用于将MIR转换为KaRaMeL的内部AST,随后通过约30个“纳米级”处理阶段简化AST,最终生成C代码。其中,处理变量初始化和优化模式匹配是较为复杂的部分。
局限性
Eurydice目前存在一些限制,例如:
- 无法保证对象布局在C和Rust中完全一致。
- 生成的代码可能违反严格别名规则,需通过编译选项(如-fno-strict-aliasing)解决。
- 对多平台代码的支持需要额外技巧。
未来展望
Eurydice正在被整合到微软和谷歌的加密库中,未来计划支持动态特质(dyn traits)和更完整的Rust标准库提取。长远目标是到2026年实现Rust标准库的全面支持。
项目名称的由来
Eurydice的名称源于希腊神话,与项目的基础设施(如Aeneas和Charon)一脉相承,象征着从“生成C代码的地狱”中逃脱的尝试,尽管这一过程充满挑战。
通过Eurydice,开发者可以在享受Rust现代特性的同时,保持对C环境的兼容性,为代码迁移和跨平台支持提供了新的可能性。
评论总结
以下是评论内容的总结:
相关项目介绍
- 有评论提到类似的Rust转译项目,如rustccodegenclr(将Rust转译为.NET或C)和mrustc(另一个Rust转C编译器)。
- "rustccodegenclr is an experimental Rust compiler backend..." (mustache_kimono)
- "Another Rust compiler with a C backend..." (nutjob2)
- 有评论提到类似的Rust转译项目,如rustccodegenclr(将Rust转译为.NET或C)和mrustc(另一个Rust转C编译器)。
工具依赖问题
- 有评论对比了Nix和Cargo的易用性,认为Cargo更便捷。
- "Cargo has really spoiled me." (oconnor663)
- 有评论对比了Nix和Cargo的易用性,认为Cargo更便捷。
语言前景讨论
- 部分评论认为C语言仍将长期存在,而Rust的普及尚不确定。
- "I currently have no reason to believe C won't outlive it, by a lot." (apitman)
- 部分评论认为C语言仍将长期存在,而Rust的普及尚不确定。
项目动机质疑
- 有评论质疑这种转译的必要性,认为这更像是编译器原生支持前的临时方案。
- "Seems like the kind of thing that happens before a language is natively supported..." (BobbyTables2)
- 有评论质疑这种转译的必要性,认为这更像是编译器原生支持前的临时方案。
技术债务管理
- 有评论认为这类工具对未来管理Rust的技术债务很有帮助。
- "These tools would be needed in the near future to manage the tech debt..." (opem)
- 有评论认为这类工具对未来管理Rust的技术债务很有帮助。
技术实现讨论
- 有评论认为直接为LLVM编写后端可能比转译更高效。
- "I'm pretty surprised that building this transpiler was considered a better use of time..." (bloppe)
- 有评论认为直接为LLVM编写后端可能比转译更高效。
反向转译设想
- 有评论幽默地提出是否可以将Rust编译器本身转译为C。
- "I wonder if it could be used to translate Rust compiler itself to C" (pankajdoharey)
- 有评论幽默地提出是否可以将Rust编译器本身转译为C。
语言特性讨论
- 有评论指出Rust的整数溢出检查默认只在调试模式下启用。
- "By default, this is only in debug mode." (Aissen)
- 有评论指出Rust的整数溢出检查默认只在调试模式下启用。
密码学应用担忧
- 有评论认为将密码学代码通过多层高级编译器转译存在安全隐患。
- "Cryptography while going through two high level compilers...is an exercise fraught with peril." (exDM69)
- 有评论认为将密码学代码通过多层高级编译器转译存在安全隐患。
语言争议
- 有评论认为这类新闻容易引发反对Rust的声音。
- "The perfect headline to bring the anti-Rust luddites out..." (IshKebab)
- 有评论认为这类新闻容易引发反对Rust的声音。