Hacker News 中文摘要

RSS订阅

《欧律狄刻:一款Rust转C的编译器(没错)》 -- Eurydice: a Rust to C compiler (yes)

文章摘要

文章介绍了作者开发的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环境的兼容性,为代码迁移和跨平台支持提供了新的可能性。

评论总结

以下是评论内容的总结:

  1. 相关项目介绍

    • 有评论提到类似的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)
  2. 工具依赖问题

    • 有评论对比了Nix和Cargo的易用性,认为Cargo更便捷。
      • "Cargo has really spoiled me." (oconnor663)
  3. 语言前景讨论

    • 部分评论认为C语言仍将长期存在,而Rust的普及尚不确定。
      • "I currently have no reason to believe C won't outlive it, by a lot." (apitman)
  4. 项目动机质疑

    • 有评论质疑这种转译的必要性,认为这更像是编译器原生支持前的临时方案。
      • "Seems like the kind of thing that happens before a language is natively supported..." (BobbyTables2)
  5. 技术债务管理

    • 有评论认为这类工具对未来管理Rust的技术债务很有帮助。
      • "These tools would be needed in the near future to manage the tech debt..." (opem)
  6. 技术实现讨论

    • 有评论认为直接为LLVM编写后端可能比转译更高效。
      • "I'm pretty surprised that building this transpiler was considered a better use of time..." (bloppe)
  7. 反向转译设想

    • 有评论幽默地提出是否可以将Rust编译器本身转译为C。
      • "I wonder if it could be used to translate Rust compiler itself to C" (pankajdoharey)
  8. 语言特性讨论

    • 有评论指出Rust的整数溢出检查默认只在调试模式下启用。
      • "By default, this is only in debug mode." (Aissen)
  9. 密码学应用担忧

    • 有评论认为将密码学代码通过多层高级编译器转译存在安全隐患。
      • "Cryptography while going through two high level compilers...is an exercise fraught with peril." (exDM69)
  10. 语言争议

    • 有评论认为这类新闻容易引发反对Rust的声音。
      • "The perfect headline to bring the anti-Rust luddites out..." (IshKebab)