GoSuda

LLM 代码生成环境中的语言设计比较:抽象成本与 Go 的显式性

By Rabbit Princess views ...

现代语言

现代语言是指与过去的语言相比,提供更高生产力、稳定性、安全性和可维护性的语言。这些语言积极引入最新的技术与概念,为开发者提供更加高效和安全的开发工具。具有代表性的现代语言包括 Java、Rust、Python、TypeScript 等,它们具有以下特征。

1. 面向对象设计 ( OOP )

现代语言大多以面向对象的概念为基础进行设计。面向对象支持封装、继承、多态等原则,通过将复杂系统划分为较小的对象单元进行管理,使程序结构清晰且灵活。这尤其有助于大规模软件开发中控制开发成本与工作量,并减少维护过程中可能出现的问题。

2. 语法糖与表达式

现代语言为了提高代码的可读性和开发生产力,提供了多种语法糖及基于表达式的语法。三元运算符、Lambda 表达式、模式匹配等功能减少了样板代码,使代码更加可预测,并提升了开发者的生产力。

3. 模块系统

现代语言通过模块系统,使程序能够被划分为多个单元进行管理。这便于代码的复用与依赖管理,即使项目规模扩大,也能使维护工作更加顺畅。典型示例包括 Java 的 Maven/Gradle、Rust 的 Cargo、TypeScript 的 npm/yarn 等。

4. 中间语言与虚拟机

现代语言为了实现平台独立性、性能优化和安全性,引入了中间语言与虚拟机。典型示例包括 JVM、LLVM、WASM、GraalVM 等。

AI 时代的开发与现代语言的局限性

现代语言诞生于大部分代码由人类编写这一前提之下。自然地,现代语言的目标是减少重复性工作、提高生产力,并通过支持开发者协作的结构,高效地实现大型软件。然而,在 AI 时代,这一前提正逐渐瓦解。Copilot、Cody 等基于 AI 的工具正在自动化编写代码的大部分工作,一名开发者所能产出的代码量也在急剧增长。因此,过去被视为优势的现代语言特征,正逐渐转变为过时的弱点。

面向对象设计

AI 能够快速且准确地分析所有信息都明确体现在单一函数或模块中的结构。相反,随着上下文的增加,需要推理的范围也随之扩大,因此 AI 的生产力与准确性会随之降低。采用 OOP 编写的代码并非将逻辑集中在一处管理,而是将其分散到多个对象中,这最终会要求 AI 处理更多的上下文。请看下面的代码。

 1public class AnimalHandler {
 2    public void handle(Animal animal) {
 3        animal.speak();
 4    }
 5}
 6
 7public class Main {
 8    public static void main(String[] args) {
 9        AnimalHandler handler = new AnimalHandler();
10
11        Animal a1 = new Dog();
12        Animal a2 = new Cat();
13        Animal a3 = new Horse();
14
15        handler.handle(a1);
16        handler.handle(a2);
17        handler.handle(a3);
18    }
19}

在上述代码中,为了弄清 speak() 方法实际执行何种操作,AI 必须反复进行以下推理:

  1. animal 是哪个具体类的实例?
  2. 在该类中被重写的 speak() 方法定义在何处?
  3. Dog 与 Cat 类的定义位于何处,其内部行为是什么?
  4. Dog 与 Cat 类是否可能在其他类中被重写?

这些信息并不集中于某一个文件或某一个函数中,而必须沿着类文件之间的关系与继承结构逐一追踪才能理解。此外,像反射或动态加载这类在运行时才决定的要素,对 AI 而言如同黑箱,实际上难以分析。

语法糖与表达式

AI 更偏好显式的行为而非隐式的行为,并且倾向于组合简单的结构来得出唯一的答案,而不是直接使用复杂的结构。与此相对,语法糖允许多种表达方式,但其内部行为往往相同或相似。AI 必须逐一学习这些多样表达方式的含义,而且在特定情况下判断应推荐哪种语法的优先级也可能变得困难。

中间语言与虚拟机

AI 大多基于源代码进行学习。而中间语言(bytecode)在编译过程中会移除变量名等语义信息,并需要在运行时由虚拟机重新解释。这对 AI 而言是极难理解或转换的工作。例如,AI 可以将 TypeScript 转换为 Go,但要将 V8 engine 的字节码转换为 JVM 字节码或机器码,则几乎是不可能的。

AI 时代真正的现代语言

通过以上内容,我们可以看出,现代语言的诸多特征实际上已不适合 AI 时代,成为过时的因素。那么,什么样的语言才能成为最适合 AI 时代的现代语言?这可以从过去现代语言所排斥的要素中获得启示。AI 时代的现代语言应当:

  1. 具备显式的语法与自然的流程。
  2. 摆脱过度的 OOP 结构,采用扁平且简单的结构。
  3. 不依赖不必要的语法糖或隐式模式,而是仅通过有限的基本关键字实现多种功能。
  4. 采用简单且可预测的构建系统,而非复杂的构建系统。

最符合这些标准的语言是 Golang。Go 语言被设计为仅凭最少的核心关键字和简单的语法组合,即可实现大多数实用功能,并彻底排除了不必要的抽象与隐式行为。这不仅有利于开发者,也有利于 AI 解释和生成代码。

正如 Go 所追求的这种可预测且扁平的结构、显式的流程以及一致的语法,与以人类开发者为基准设计的既有现代语言不同,更适合 AI 深度参与的开发环境。曾经被视为过时的 Go 保守设计哲学,在 AI 时代反而成为最为领先的选择。