将YJIT Ruby编译器移植到Rust的经验
最近Reddit上有一篇博文:“去年,我在Shopify的团队实现了YJIT,一个用于CRuby的新的即时编译器(JIT)。因为CRuby代码库是用C99实现的,所以我们也决定用C99实现YJIT,这样与CRuby代码库的其他部分的集成就会尽可能的简单。然而,我们发现用纯C语言实现JIT编译器很快就变得乏味了,而且随着我们不断为YJIT增加功能,我们发现我们项目的复杂性变得难以管理。”
虽然这篇文章是给Rust老手看的,但实际上一直在试图纠正新手对不安全区块的一个常见误解:
(1)unsafe并没有放松对现有语言结构的任何检查,也没有取消对如何使用它们的任何要求。它只是允许你访问额外的语言特性。
(2)无论你是否使用as和raw指针强行为同一分配创建第二个&mut,LLVM IR仍然会得到noalias这样的注解,因此,仍然会调用未定义行为(Undefined Behaviour),所以说unsafe不遵守这些规则,有点像暗示你可以走到高速公路上,因为unsafe拆除了安全栅栏。
unsafe块不是为编译器准备的。它们是为其他人准备的......尤其是未来十年或更久以后新加入的团队成员。
Rust的很多安全特性都让人意识到"经验证明,单个人也许能写出好的C和C++,但一群人却不能"。