借用检查可以倒着做
这是 verdagon 2026 年 10 月 18 日发在 r/rust 的文章,讲 Valen 编译器里一种从函数末尾往回走的安全检查。采集时 67 分、21 条评论。文章日期是 2026 年 10 月 18 日。
Valen 是实验性编程语言的编译器,仓库在 https://github.com/valen-lang/valen ,许可证 Apache-2.0。采集时 GitHub 有 586 个 star,最近推送时间是 2026 年 10 月 18 日。作者写,v0.1 预计在 2 月前后。文章写,这篇文字 0% 由 AI 写成。
文章写,编译一个函数分四步:解析成 AST,静态类型,静态分组,安全检查。静态分组记下每个引用指向哪个变量、或变量的哪一段。安全检查确认引用在失效之后还有没有被使用。这一步从函数最后一条语句往前扫到函数开头。作者写,据他所知,这是把内存安全检查本身做成反向扫描的借用检查器。文章对照了 rustc:NLL 和目前的 Polonius 先做 region 约束求解,再向前检查冲突。rustc 会向后扫描,用来确定变量用到哪里,内存安全检查仍向前走。Vale,以及 Valen 的上一版,也是先确定 region 或 group,再向前检查。
反向扫描维护一个 pending 列表。遇到 USE,把变量放进 pending。遇到 MUTATE,检查 pending 里有没有被这次修改失效的变量。遇到 DECLARE,把变量从 pending 里拿掉。文章用 add_buff 修改 Entity 之后仍使用指向 buffs 的引用,作为 use-after-free 的例子。作者给出的反向理由有三条:少一次先记下最后使用位置再跳回去的查找,循环里更容易判断引用有没有被重新赋值,以及每个节点在分组阶段和检查阶段各处理一次。作者写,速度这一点还没有做过基准测试。循环还要额外记录 mutations_after_this 和 revived_after_this。
评论里 Zde-G(27 分)写,更意外的是 rustc 的借用检查向前走,因为很多编译优化本来就是从 use 走到 def。verdagon(11 分)回复,反向扫描在编译器里常见,他 2024 年的 LLVM 演讲讲过析构插入;他认为新的地方是把这种扫描用在内存安全检查上。protestor(6 分)问,Polonius 的性能问题能不能靠改成反向实现缓解。
原文链接:https://verdagon.dev/blog/reverse-borrow-checking
穷举搜索给 FPU 模拟器找到更短公式
这是 purplesyringa 的文章,kibwen 在 2026 年 10 月 18 日把它发到 r/rust。采集时 60 分、3 条评论。文章日期是 2026 年 10 月 16 日。
文章要算的是:给定一个 f32,返回只保留最低置位的那个浮点数。例子写,二进制 1.01101×2^10 应返回 2^5。直接按位处理在 2 的幂上会出错,所以原先有一个 if:去掉尾数后仍等于自己就返回 x,否则用 x - from_bits(bits & (bits - 1))。
作者用穷举搜索找不超过 5 次运算的公式。可选运算包括整数加减、按位 AND/OR/XOR,以及最后一步的浮点减法。5 个运算位、每个 6 种运算、42 种括号组合,一共 7776。输入可以是 x,或 64 个覆盖浮点字段的常数。搜索按运算次数归纳构造表达式,并用 FxHashSet 按输出值去重。作者写,去重之后整次搜索大约 4 分钟。测试用例后来加到 20 个,每条表达式存 80 字节。
搜索找到若干 5 运算公式。作者没有找到 4 运算公式。这个搜索把重复子表达式算成多次运算。手工检查后,最后一条 5 运算公式可以复用一次 x.to_bits() & !f32::MANTISSA_MASK,写成 let a = x.to_bits() & !f32::MANTISSA_MASK; return f32::from_bits(x.to_bits() & (a - x.to_bits())) - f32::from_bits(a);。作者写,这个公式对 2 的幂会翻转符号位。代码在 https://github.com/purplesyringa/fpu-v/blob/d3c3f72c691698e5095d259a79610e5293911651/src/ops/multiplication.rs#L485 。仓库采集时 5 个 star,最近推送 2026 年 10 月 16 日。
评论里 dnew(16 分)写,几十年前有人用穷举最短指令序列实现 FORTRAN 的 ABS 和 SIGN。Zde-G(2 分)写,Intel 编译器里也有人对小整数乘法做过类似的事。
原文链接:https://purplesyringa.moe/blog/superoptimizing-an-fpu-emulator/
职业用户给 Rust 求职的建议
这是 scol2n 2026 年 10 月 18 日发在 r/rust 的提问,问用了大约 3 个月 Rust 之后,怎样开始用 Rust 工作。采集时 50 分、72 条评论。
tibbon 的评论有 249 分,写不要把职业绑在一种语言上,做能换工具的工程师。brainrotbro(24 分)写,很少看到只用 Rust 的职位,更常见的是同时要 C++ 和 Rust。solidiquis1(15 分)写,在航空航天、机器人和防务方向,南加州创业公司里的纯 Rust 职位在变多。bentNail28(4 分)建议先学 C++,理由是 C++ 有助于理解 Rust,而且需求更大,很多系统项目以 C++ 为主再接入 Rust。professionalnuisance(12 分)写,也有 Rust 加 Python(PyO3)的工作。juniperico(9 分)写,传统 Python 岗位里用 Rust 做优化的机会在变多。MishkaZ(1 分)写,自己在东京找到过一份 Rust 工作,之后再看到的 Rust 职位很少,而且常常和 crypto 或生成式 AI 有关。
原文链接:https://www.reddit.com/r/rust/comments/1x93thf/for_those_who_use_rust_professionally_what_advice/
自写 SQL 字面量替换器
这是 Lightforce_ 2026 年 10 月 18 日发在 r/rust 的说明,讲一个只替换 SQL 字面量、不建语法树的 tokenizer。采集时 0 分、3 条评论。帖子正文直接发在 Reddit,外部仓库链接已从正文里去掉。
作者写,目标是从生产 SaaS 的 trace 里看 N+1 和重复查询。该服务大约有 20 万客户。作者要查询结构,字面量不进入报告,因为数据在欧盟,适用 GDPR。WHERE id = 42 和 WHERE id = 43 要变成同一个模板。作者先试了正则,再看了 sqlparser。作者希望二进制小于 10 MB,只替换字面量。
tokenizer 读一条 SQL,返回把字面量换成 ? 的模板,以及按出现顺序抽出的值。作者给的例子里,status = 'active' 和 total > 100 变成两个 ?,参数是 ["active", "100"]。同一请求里五十条同模板、不同参数的查询可以看成 N+1。值只留在当次比较的内存里。模板可以进报告或看板。
实现是六状态状态机:Normal、InString、InNumber、InDoubleQuote、InBacktick、InDollarQuote。双引号和反引号标识符原样保留。美元引号覆盖 PostgreSQL 的 $$ 和 $tag$。主循环按当前状态调用对应函数,对字节走一遍。作者写,它不识别列和 join,也不建语法树。
原文链接:https://www.reddit.com/r/rust/comments/1x988uz/why_i_wrote_a_dumb_sql_tokenizer_instead_of_using/
From Rust中文社区 Mike
社区学习交流平台订阅:
评论区
写评论还没有评论