把箭头变成箭头,把范畴变成查询:一门编译到 SQL 的语言
来源:reasonablypolymorphic.com — 2025-10-14
📋 概述
作者写了一个玩具语言 catlang,编译目标不是机器码而是一条巨大的 SELECT 语句——在 Postgres 里跑这条查询就等于运行程序。源语言支持类似 Haskell 的 arrow 记法,desugar 之后变成由 id、△、⨟、prj、dist、▽、cochoice 等组合子构成的中间语言,每个符号都有明确的范畴论语义。正因为语义如此简单,把这种中间表示翻译到别的目标就变得机械:换一套映射,同一个程序就能编到另一个地方。文章用一个带 while 循环的 count 函数走完全程,最后展示那段「不像人类写的」SQL。
🔑 核心要点
- catlang 是编程语言而不是查询语言,编译器产出单条 SELECT,执行即求值。
- 中间语言只剩组合子:⨟ 表示把 A 的结果管道进 B,△ 复制、▽ 合并、dist 分配。
- 绕这么大弯的原因是组合子的代数语义简单,换目标只需换一套语义映射。
💡 金句
给这种范畴式的中间语言写一个到其它领域的变换,编译到各种奇怪的目标就变得轻而易举。
👍 0
👎 0
← 返回 Lobsters 首页