Armin Ronacher(极简 Coding Agent 工具 Pi 的两名开发者之一)在最新文章(A Language for Agents)中,总结了 AI 对编程语言特点的好恶:
AI喜欢什么:
显式类型信息,无需LSP推断
刚性语法结构,括号优于空白
副作用必须声明 needs { db, time }
结果类型替代异常(Result)
grep可搜索的显式包前缀
AI讨厌什么:
宏(Macros)增加理解难度
重新导出(Re-Exports)和Barrel Files
不稳定测试(Flaky Tests)
工具链分裂(代码能跑但类型检查失败)
如果我们要设计这样的语言,它会是怎么样的呢?
# AI 时代的编程语言:从写起来准,到读起来准
面向Agent的编程语言应具备"显式契约"特性——所有对代码行为的假设都必须明文写进代码,而非依赖外部工具或开发者记忆。
- 三大契约维度
1. 类型契约:签名即文档
// 而非:auto result = process(data)
// 而要:Result process(RawData data)
拒绝动态类型和过度类型推断。类型信息必须保留在源码中,无需LSP即可理解。
2. 依赖契约:函数即边界
func fetchUser(userId: UserID) needs { db, time }
所有副作用(数据库、时间、随机数)必须在函数签名中显式声明。AI才能正确Mock,写出稳定测试。
3. 语法契约:明确胜于简洁
拒绝聪明:避免宏、运算符重载、隐式转换
拒绝魔法:避免全局状态、依赖注入黑盒
拒绝歧义:避免重导出、Barrel files,
定义必须指向单一真实来源
- 代码可读性的衡量标准
语言是否Agent友好的评估指标:
独立理解度:脱离IDE,仅靠grep能否定位所有依赖?
修改局部性:改一行代码,受影响范围是否可预期?
工具一致性:parser、type checker、formatter、linter对代码的理解是否100%一致?
测试确定性:AI生成的测试是否必然通过或失败
# 一句话总结
AI友好的代码 = 显式信息密度 × 局部可推理性
人类追求写代码时的快感(少打字、灵活性)
AI追求读代码时的确定性(无歧义、可预测)
AI喜欢什么:
显式类型信息,无需LSP推断
刚性语法结构,括号优于空白
副作用必须声明 needs { db, time }
结果类型替代异常(Result)
grep可搜索的显式包前缀
AI讨厌什么:
宏(Macros)增加理解难度
重新导出(Re-Exports)和Barrel Files
不稳定测试(Flaky Tests)
工具链分裂(代码能跑但类型检查失败)
如果我们要设计这样的语言,它会是怎么样的呢?
# AI 时代的编程语言:从写起来准,到读起来准
面向Agent的编程语言应具备"显式契约"特性——所有对代码行为的假设都必须明文写进代码,而非依赖外部工具或开发者记忆。
- 三大契约维度
1. 类型契约:签名即文档
// 而非:auto result = process(data)
// 而要:Result process(RawData data)
拒绝动态类型和过度类型推断。类型信息必须保留在源码中,无需LSP即可理解。
2. 依赖契约:函数即边界
func fetchUser(userId: UserID) needs { db, time }
所有副作用(数据库、时间、随机数)必须在函数签名中显式声明。AI才能正确Mock,写出稳定测试。
3. 语法契约:明确胜于简洁
拒绝聪明:避免宏、运算符重载、隐式转换
拒绝魔法:避免全局状态、依赖注入黑盒
拒绝歧义:避免重导出、Barrel files,
定义必须指向单一真实来源
- 代码可读性的衡量标准
语言是否Agent友好的评估指标:
独立理解度:脱离IDE,仅靠grep能否定位所有依赖?
修改局部性:改一行代码,受影响范围是否可预期?
工具一致性:parser、type checker、formatter、linter对代码的理解是否100%一致?
测试确定性:AI生成的测试是否必然通过或失败
# 一句话总结
AI友好的代码 = 显式信息密度 × 局部可推理性
人类追求写代码时的快感(少打字、灵活性)
AI追求读代码时的确定性(无歧义、可预测)