“一更多重夜魔编译器”

这是关于 one-more-re-nightmare 正则表达式引擎的介绍,包含以下主要内容:

  • 发展历程:大致分为旧编译器和新编译器阶段。旧编译器 2020 年 6 月至 8 月开发,通过移植函数实现,性能尚可;新编译器 2021 年 4 月开始开发,主要特点是实现了子匹配和克林闭包匹配,使用 Mealy 机而非离散有限自动机。
  • 旧编译器相关:通过将函数从[Regular-expression derivatives reexamined]移植到 Lisp 实现,代码中derivative函数用于计算正则表达式的导数。最初性能不错,比 cl-ppcre 快约 13.4 倍,能每秒扫描约 550 兆字符,但随着时间推移,作者想在引擎中实现其他功能,如子匹配,发现旧编译器存在一些问题,于是开始开发新编译器。
  • 新编译器相关

    • Mealy 机:DFA 简单消费事件流,Mealy 机在状态转换时输出信号,如标记分配。处理正则表达式时会遇到歧义,需复制寄存器,避免不必要的复制,还需去除重复子表达式。
    • 回溯处理:寄存器用于正确实现克林闭包,通过包装正则表达式在未命名子匹配中跟踪匹配,避免“回溯”,提高性能。
    • SIMD:旧编译器可使用 Boyer-Moore-Horspool 算法搜索正则表达式的常量前缀,提高效率。新编译器支持在字节向量上扫描,通过映射字符范围处理符号比较,在扫描 Unicode 字符串和simple-base-string时性能提升显著。
  • 未来方向:可更像 Hyperscan 允许在任意位置查找常量字符串和简单表达式;研究“混合”构造,减少回溯;实现 POSIX 正则表达式解析器等。
  • 结论:one-more-re-nightmare 实现了类似 cl-ppcre 的功能,但仍有局限性,如不支持回溯引用等。整个库代码仅 1848 行,利用模式匹配和 Common Lisp 编译器生成原生代码。最近有人称写快速 grep 的技术已趋同,作者不同意,认为还有提升空间。
阅读 14
0 条评论