我几乎没看代码就重写了 PostHog 的 SQL 解析器,快了 70 倍

查看原文 HN 讨论

文章摘要

这篇文章讲述了作者如何借助 AI,在”几乎不看代码”的情况下重写了 PostHog 的 SQL 解析器,并实现了巨大的性能提升。

PostHog 最初使用 ANTLR(一个解析器生成器)在 C++ 中实现 SQL 解析器。ANTLR 虽然功能强大,但它通过图遍历解释器来运行,需要解释一个 ATN(增强转移网络,augmented transition network)。这一抽象层加上对任意动态前瞻(dynamic lookahead)的支持,使其比手写解析器要慢得多。

作者的新方案是借助 Claude 从零重写解析器,最终产出了”1.6 万行手写的解析器代码、5 千行工具代码”以及额外的测试覆盖。新实现是一个用 Rust 编写的”手写的、以预测式为主的递归下降解析器,核心采用 Pratt 表达式解析”。

整个过程中最关键的,是几项工程方法而非”让 AI 自己发挥”:

在性能结果上,针对生产查询,新解析器实现了 454 倍 的速度提升;标题中提到的 70 倍,是笔记本电脑基准测试的数据。

HN 评论精华

cespare(高赞) 挑战了”手写解析器很难”这一前提:”手写解析器比人们想象的要容易写好、也更容易维护得多。”他认为真正的价值在于可测试性和正交的复杂度,这恰恰让解析器成为 AI 辅助的理想对象——尽管作者最初对工期的预估有些夸大。

keeda 提出了一个有趣的框架:未来将是”凭感觉编码”(vibe-coding),工程师的重心从阅读生成的代码,转移到”精心打造全面而严密的验证机制”上。这代表着一种从”代码审查”到”严谨测试设计”的转变。

jakewins 点出了核心模式:”如果你有一个 Oracle,而你的问题在很大程度上只是一个纯函数,那么 AI 很擅长生成出既能正确工作又跑得快的东西。”

也有批判的视角。ncruces 从哲学层面质疑这套方法论:”这门源语言到底有什么问题,以至于用……随机代码生成器和模糊测试,反而比造一个足够聪明的编译器更好?”sscaryterry 批评了营销话术:”每次有人说什么东西快了 X 倍……都是纯粹的标题党”,尽管他也承认这项工作本身很扎实。duendefm 则表达了更宽泛的担忧:AI 让人能走捷径,长此以往可能拖慢这个行业的知识积累与进步。