以反向方式思考借用检查的新方法
向时间倒退,以便你已经知道未来2026年10月18日——你是否曾有过一个奇怪的想法,然后它成功了,但你真的无法相信?这正是我现在对Valen的借用检查器的感觉。因为它是向时间倒退的。更准确地说,它是向后走函数,这仍然是非常奇怪的。几年前,如果你告诉我反向迭代一个函数是好的,我会叫你疯了。事实证明,实际上有一些非常好的理由这么做,并且在进行例如优化的过程中相当常见。但我认为还没有人这样做用于检查内存安全。如果你想深入了解借用检查的世界,请继续阅读!我们即将看到一些奇怪的事情。这是对借用检查算法的一个相当深入的幕后观察。如果你想要一些史诗般且有趣的内容,可以查看我最近关于《金色的尖钉》和复活Vale(n)编程语言的帖子!关于借用检查的新思考(反向)或者是析构函数插入,现在,检查内存安全!这篇文章的0%是由AI撰写的。更多想法请见这里。我的立场是:如果你希望有人花时间阅读某些内容,就花时间手动编写它。感谢您的阅读=) 一种奇怪的借用检查器 这不会是你正常的共享异或可变借用检查。这是Valen的借用检查器,它使共享异或可变成为可选,并可以调用Rust函数以确保跨边界的内存安全。Valen仍然非常实验性。许多东西都有漏洞和尖锐的边缘,并且在v0.1于明年二月发布之前可能会保持如此。辉煌的数月重构大潮已经开始(因此有了这个新的借用检查器!)。欢迎查看Valen仓库,小心,这里有龙!它有点像Rust的借用检查器,但它还有内存安全的可变别名。如果你想知道更多关于这个内容,可以查看这篇文章,但对于本文的大部分内容你不需要了解这些。绿色龙,具体来说...而且还有一种奇怪的反向实现!Valen在四个阶段编译一个函数:它解析函数,将源文本转换成AST。它进行静态类型检查,确定每个变量、参数和表达式的类型。它进行静态分组,每个引用都知道它指向哪个变量(或哪个变量的哪个部分)。它安全检查函数,以确保引用在失效后不会被使用。我将在下面进一步解释这一切。最奇怪的部分是,第4步是反向进行的。它查看函数中的最后一条语句,然后向后走直到到达函数的顶部。这很奇怪,因为据我所知,这是唯一一个其安全检查是反向进行的借用检查器。进一步下文中,我将解释我们为何向后(提示:便利性、循环和速度)。但首先,让我们看看它是如何工作的,以及向后意味着什么。让我们跳过第1阶段,从第2阶段开始。还有一个秘密的第五阶段,我们计算要发送到LLVM以描述哪些操作可能改变哪些组的属性。但这是本文的范围之外。它还确定任何指令的任何变更效果所失效的所有组。例如:Rust(NLL和当前的Polonius)为区域推断执行约束求解,然后进行前向传递以检查冲突。(请注意,rustc确实会进行反向扫描以确定每个变量被使用的地方,但其实际的内存安全检查发生在前向传递中。)Vale的类型传递确定区域,然后后续的前向传递进行区域借用检查,以确定何时可以安全地跳过运行时生成检查。(Vale的区域借用检查器实际上与其实例化器/单态化器融合在一起。)Valen之前的借用检查器也像Vale一样;它的类型传递确定组,然后后续的前向传递会在每次使用时检查它是否是在“失效”之前更新的。有很多其他的借用检查器,但我还没有听说过有哪个以反向方式进行安全检查。如果有谁知道,请告诉我!第2阶段:静态类型 静态类型传递对你们一些人来说会很熟悉,它为变量分配类型。例如,它将这个程序:exported func main() { let fuel = 5; let force = fuel; } 转换为这个程序:exported func main() { let fuel i64 = 5; let force i64 = fuel; } 这是非常正常的,很多编译器都会这样做。编译器通常将其作为前向传递,从函数顶部走到底部,逐步确定类型。我们将在第3阶段做更奇怪的事情;第3阶段将进行静态分组。第3阶段:静态分组这个是另一个前向传递,用来确定每个引用指向哪里。例如,在这个程序:func print_first_fuel_cell(s &Ship) { let first_ref
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡