当 APL 重新变“小”:TinyAPL 用组合子把古老数组语言讲明白了

一门“看起来像天书”的语言,为什么还值得被认真对待
如果你第一次打开 TinyAPL 的文档页,大概率会先被那一串密密麻麻的符号吓一跳。⍤、⍥、⊸、⟜、«»……这不像我们熟悉的主流编程语言,更像某种高阶数学笔记,或者键盘侠误入了古代咒语现场。可偏偏,APL 以及它的后继者们,几十年来一直在影响数组编程、数据处理乃至函数式语言的设计。
TinyAPL 这次整理的主题是“Combinators”,中文可以理解为“组合子”。这不是什么新名词,在函数式编程、逻辑学和编程语言理论里它早就有历史地位。简单说,组合子就是不用显式写变量,也能把函数拼接起来的构件。APL 本来就擅长这种“把操作像乐高一样拼起来”的思路,TinyAPL 则试图把这件事讲得更透明:不是把神秘感做得更浓,而是把这门语言最核心的表达方式拆成可以学习、可以推导的部件。
这件事为什么重要?因为今天大家谈编程语言时,常常把注意力放在“谁更快”“谁更适合 AI”“谁生态更大”上,但真正决定一门语言能不能留下来的,往往是它是否能把自己的思想传递出去。APL 的问题从来不只是难,而是很多人连“它到底在优雅什么”都没来得及理解,就已经退出页面了。TinyAPL 现在做的,某种程度上是在替 APL 补上一堂迟到很多年的“现代说明课”。
组合子,不只是语法技巧,而是 APL 的思维骨架
在 TinyAPL 的文档体系里,Combinators 和 Trains(列车、函数列)被并列讨论,这其实很能说明问题。很多人学 APL 家族语言时,最容易记住的是那些强烈的视觉符号,最难掌握的却是“这些函数到底如何组合”。组合子讨论的正是后者:一个函数如何修饰另一个函数,两个函数如何形成钩子,三个函数如何形成叉子,数据又如何在这种结构里流动。
说白了,组合子是在回答“程序不是一行一行写出来的,而是一块一块拼出来的”这件事。今天我们在 React 里讲组合,在 Unix 里讲管道,在函数式语言里讲 point-free style,本质上都是同一类思路:减少样板,强调结构,让操作之间的关系直接暴露在代码表面。APL 早就这么干了,只是它的表达方式更紧凑,也更不肯迁就初学者。
TinyAPL 的价值,在于它没有把这种紧凑性包装成高冷门槛,而是尽量把“为什么能这样组合”解释清楚。对于很多开发者来说,这种解释比新增十个原语还重要。因为一门语言真正难学的,不是词汇量,而是语法背后的世界观。组合子就是 APL 世界观里最硬核的一部分:你不是在命令计算机做事,而是在描述操作之间的关系。
这也是我特别想强调的一点:TinyAPL 这样的项目,表面上是在做文档,实际上是在做“认知解压缩”。它把一门原本高度压缩的语言,重新展开给人看。这种工作常常不够性感,没有模型参数,没有性能跑分,也没有融资新闻,但它对技术社区的长期价值可能被严重低估。
在 Python 和 AI 时代,为什么还有人折腾 APL 这样的语言
站在 2025 年这个时间点看,小众语言的复兴并不奇怪。越是 AI 代码生成工具泛滥,越会有人重新思考:什么才是“好的表达”?当 Copilot、ChatGPT、Claude 这些工具越来越擅长替你写样板代码,程序员真正稀缺的能力,反而变成了把问题表述清楚。APL 这一类语言的魅力,恰好就在“高密度表达”上。
当然,高密度也意味着高门槛。Python 赢,不只是因为它功能够用,更因为它让人看起来不像在解谜。BQN、J、Dyalog APL 这些语言这些年都有一批忠实拥趸,但始终很难走向更大的开发者圈层,原因不复杂:语义虽美,入口太窄。TinyAPL 走的是另一条路,它并不试图跟 Python 抢生态,也不跟 JavaScript 抢前端,而是想把 APL 的核心思想浓缩成一个更容易实验、运行、阅读的环境。
这背后其实踩中了一个很有意思的行业趋势:今天的新语言,已经不太可能仅靠“比旧语言快一点”取胜了。更现实的路径,是成为一种思维工具,一种解释复杂问题的新视角。像 Mojo 想重新定义 Python 的性能边界,Zig 想重新审视系统编程的成本,TinyAPL 这类项目则在做另一种尝试——把数组语言的表达力,以更轻量、可教学的方式重新摆上桌面。
我不觉得 TinyAPL 会突然变成主流语言,这几乎不现实。但它完全可能成为一扇入口:让更多开发者第一次真正看懂 APL 家族到底迷人在哪里。对小众语言来说,能被理解,有时比被大规模采用更重要。
文档这件小事,决定了一门语言是“教派”还是“社区”
科技行业很喜欢神化工具,尤其是那些看起来有门槛、有个性的工具。APL 就很容易掉进这个陷阱:会的人觉得自己掌握了一种高阶表达艺术,不会的人则把它归类为“只适合天才的语言”。这种气氛很酷,但对传播极其不友好。久而久之,语言会变成一个小圈层的文化符号,而不是一个开放的技术社区。
TinyAPL 的文档整理,尤其是把 Combinators、Trains、Minimal Set 这些概念系统化地拆开,其实是在做一件“去教派化”的事情。它承认这门语言有独特性,但不再把独特性建立在神秘感上,而是建立在可解释性上。对任何编程语言项目来说,这都是成熟的表现。
这让我想起过去几年不少开发者工具的一个共同变化:优秀项目越来越重视“文档即产品”。Rust 的成功当然离不开性能和安全,但它文档、错误提示、学习曲线设计同样功不可没;Julia 能吸引科研圈,也和它把数学表达与可读说明结合得比较好有关。TinyAPL 规模远不能和这些项目相比,但思路上是相通的。你可以小,你可以 niche,但你不能故意难懂。
这里还有一个更值得思考的问题:当 AI 越来越擅长生成代码时,人类还需要那么在乎语言可读性吗?我的看法是,反而更要在乎。因为机器能生成,不代表团队能理解、能维护、能验证。像 APL 这种高度压缩的表达,如果缺少良好文档和清晰模型,很容易从“优雅”滑向“不可维护”。TinyAPL 现在强调组合子,就是在给这种高密度表达加一层解释框架,让紧凑不至于变成晦涩。
TinyAPL 给行业的启发:别只造新轮子,也要修复旧思想的入口
过去十年,开发者世界最热闹的是不断诞生的新框架、新运行时、新语言口号。但真正有生命力的创新,很多时候并不是凭空创造,而是把过去被埋没的思想重新包装、重新解释、重新连接到当下。APL 就是典型例子:它在数组操作、函数组合、无显式变量编程上的很多理念,今天看一点都不过时,甚至和数据科学、并行计算、GPU 编程的直觉很接近。
TinyAPL 没有喊出宏大口号,它只是认真地把这些基础概念重新讲了一遍。可也正因如此,它反而显得诚恳。在一个充满“革命性”“颠覆性”修辞的行业里,这种诚恳有点稀缺。它像是在提醒我们,技术进步不只有发布会、融资和 benchmark,还有一类安静但重要的工作:把难懂的东西讲清楚,把被误解的传统重新打开。
如果说这份 Combinators 文档释放了什么信号,我会说,它代表了一种更健康的小众语言发展方式——不急着扩大版图,先把自己的核心思想表达准确。这样的项目也许永远不会冲上 GitHub 热搜,但它能影响一批真正关心语言设计的人。而编程语言历史反复证明,许多最持久的影响,往往就是从这些小而硬的项目里长出来的。
对普通开发者来说,你未必需要把 TinyAPL 当成生产力工具,也未必真的要用符号语言重写日常脚本。但去理解一下它讲的“组合”思想,非常值得。因为你会突然意识到,很多我们以为是现代软件工程的新鲜理念,其实早在这些看似古怪的语言里,已经被思考了很多年。某种意义上,TinyAPL 不是在发明未来,而是在帮我们重新读懂一段被忽视的过去。