FAWK:大语言模型首次实现自动生成语言解释器
作者在尝试用AWK语言解决2024年“Advent of Code”编程挑战时,深刻体会到自己已被函数式编程“洗脑”——对代数数据类型、模式匹配、不可变性、词法作用域和函数返回数组等特性产生了强烈依赖。尽管AWK设计精巧,但其动态作用域、缺乏原生数组和函数式支持,使得实现一个函数式广度优先搜索(BFS)变得异常复杂,陷入大量“意外复杂度”中。 于是他萌生了一个想法:如果AWK能融合现代编程语言的优秀特性,会是什么样?他构想出一个“理想AWK”——支持原生数组(包括嵌套、关联和多维)、函数式编程(高阶函数、lambda表达式)、词法作用域、默认局部变量、显式全局变量,以及类似函数式语言的管道操作(pipeline)语法。 这个想法看似天马行空,但他决定不自己从头实现,而是尝试用LLM(Cursor Agent + Sonnet 4.5)来完成。他提出需求:生成一个支持这些特性的编程语言实现,附带代码示例和测试。令人惊讶的是,LLM不仅成功生成了Python版本的完整解释器,还同时提供了C、Haskell和Rust版本,全部能编译运行。 最令人震撼的是,LLM能正确处理复杂场景:如print既是语句又是表达式(支持重定向)、多维数组、多行记录、闭包和词法作用域,甚至能通过测试验证与GAWK的向后兼容性。唯一卡住的地方是实现任意精度浮点数运算,LLM尝试用泰勒级数但失败,作者建议引入mpmath库后,问题瞬间解决。 作者意识到,AI已能完成过去需要数日甚至数周的复杂系统开发任务。他称这“更新了自己对LLM能力的先验认知”。但随之而来的是隐忧:他完全不了解生成的代码,未来若需修改,将面临“黑箱”困境。这让他反思:是否应从“自己写代码”转向“审阅和理解LLM生成的代码”?他甚至考虑用LLM来实现自己多年未完成的类型系统项目Cara。 目前FAWK(Functional AWK)仍以Python实现,性能非重点,目标是用于Advent of Code这类临时脚本。作者计划亲自试用,发现并修复新语言特性与旧设计之间的“意外交互”问题。他鼓励有兴趣者在GitHub上尝试项目(Janiczek/fawk),但需自行处理Python依赖,且需承担风险。 这场“用AI造语言”的实验,不仅是一次技术探索,更是一次对编程范式、人机协作与未来开发方式的深刻思考。
