用 GCC 引导 Rust 编译器:一场与 Bug 的较量

2025-07-07

本文讲述了作者使用 GCC 而不是 LLVM 来引导 Rust 编译器的经历。这并非易事,作者遭遇了三个主要的 Bug:递归函数的 `#[inline(always)]` 属性、128 位 SwitchInt 终止符的错误实现以及一个与对齐相关的内存访问错误。作者通过“给编译器做开颅手术”式的调试方法,逐步定位并修复了这些问题,最终成功实现了 Rust 编译器的 Stage 2 构建,并朝着 Stage 3 迈进。过程中,作者分享了调试技巧,例如使用 core dump 分析段错误,并探讨了编译器优化的复杂性。

阅读更多
开发

Rust 到 C 编译器取得重大进展:96% 的核心测试通过!

2025-04-12

作者在 Rust 到 C 编译器项目上取得了显著进展,核心测试通过率达到 95.9%,并在 Rust Week 大会上进行了演讲。文章详细介绍了修复 128 位整数内在函数、检查算术运算和子切片错误等问题,并讨论了对 C 编译器兼容性的改进,以及对内存效率更高的内部 IR 的迁移。尽管遇到了一些挑战,例如在某些平台上获取编译器存在困难,但作者仍致力于提高 C99 兼容性并支持更多平台。

阅读更多
开发

Rust反射:安全与访问规则的博弈

2025-01-03

Rust语言缺乏反射机制,但人们对其需求强烈。本文探讨了在Rust中实现反射时面临的安全挑战。由于Rust的内存安全机制,反射API必须遵守严格的访问规则,不能随意访问私有字段,否则可能导致内存安全漏洞。文章深入分析了这种限制对反射API设计的影响,例如,如何处理反射失败,以及如何表达复杂的反射边界。作者还探讨了安全与非安全反射API的权衡,以及如何平衡功能性和安全性。总而言之,在Rust中实现安全的反射机制是一个复杂且充满挑战的问题,需要仔细权衡各种因素。

阅读更多
开发 反射

Rust 的底层恐慌机制及其在 .NET 中的实现

2024-09-23

本文深入探讨了 Rust 编译器中的恐慌(panicking)和展开(unwinding)机制。文章首先解释了恐慌和展开的区别,前者是 Rust 语言层面的错误处理机制,类似于异常,而后者是恐慌的一种具体实现方式,涉及堆栈回溯和资源清理。作者详细介绍了 MIR(Rust 中间表示)中的清理块(cleanup blocks)如何处理展开过程中的资源释放,并以代码示例说明了其工作原理。此外,文章还讨论了 Rust 中的丢弃标志(drop flags)如何处理变量初始化状态,以及 MIR 优化在提升编译速度方面的作用。作者还分享了在将 Rust 编译到 .NET 过程中遇到的挑战,特别是在优化异常处理方面,并提出了一些改进方案。

阅读更多
未分类

Rust 到 .NET 编译器 - 进展更新

2024-05-04

本文介绍了 Rust 到 .NET 编译器后端 (rustc_codegen_clr) 的最新进展。作者的 GSoC 项目被接受,目标是改进测试框架,以便运行 Rust 测试套件。文章详细讨论了实现命令行参数支持、原子操作、多线程和异常处理等方面的挑战。此外,还介绍了 .NET 运行时的一些特性,例如选择性符号处理、第三种二进制浮点类型和字符串长度限制,以及作者如何解决这些问题。最后,文章简要介绍了混合模式程序集和 NATIVE_PASSTROUGH 功能,允许将原生代码与编译为 .NET 的 Rust 代码捆绑在一起。

阅读更多
未分类 CLR .NET