让我们回到 1952 年,格蕾丝·霍珀(Grace Hopper)女士常坐在UNIVAC I大型机计算机前,但她后来厌倦了手动抄写子程序和地址。
当时的程序员是编写原始机器代码,从纸质内存库中查找内存位置,然后手动将它们拼接起来。这种方法速度缓慢,极易出错,Bug也层出不穷。
“我当时有一个正在运行的简陋解释器,没人愿意碰它,”她后来回忆,“他们小心翼翼地告诉我,计算机只能做算术运算,并不能编写程序。”
为了释放人的潜力,她克服所在军事机构管理层不认可和技术的层层障碍,开发出了称为A-0的新型编译器。
它能自动将符号化的数学代码翻译成机器指令。以前需要一个月才能完成的手动编码工作,现在五分钟就能搞定。怀疑论者说她对计算机的用途一无所知。她置之不理。十年之内,她参与创建了COBOL语言,彻底改变了软件开发的进程。
而74年后,伊隆·马斯克提议人们要推翻这一切。
一切都变成二进制
在2月份举办的 xAI 全员大会上,马斯克大胆地预测,到 2026 年底,“你甚至都不用写代码了,人工智能会直接生成二进制文件。” 他更进一步说道:“人工智能生成的二进制文件比任何编译器都高效得多。”
他说的愿景将非常简洁:输入提示符,输出可执行文件。无需源代码,无需编译,无需中间码表示。
马斯克的意思,往后的创新只需要人类的灵感与电压。
他还赞了一篇帖子,该帖子的作者说通过人工智能直接生成二进制文件是“最节能的计算方法”。他兴奋地回应说,下一步将是“通过神经网络直接、实时地生成像素”。
此时发生的事情出现了好几个专业术语,但它们并不是“创新”,而是范畴错误。
我们先来说编译器,它是一个语义保持转换器:它基于规范对形式语言进行操作,其输出可以根据该规范进行验证。而LLM(大语言模型)是一个推理引擎,它生成词法单元序列的合理延续,但本身并不能保证正确性。马斯克提议我们用后者取代前者,这种做法行不通,
下面,我们来解释编译器的实际工作原理。
点击编译按钮后的故事
大多数开发者对编译过程的理解都比较模糊。他们觉得,编写代码,运行命令,然后就生成一个可执行文件。神奇的事情就这么简单。
但实际上却是非常复杂,就像下面的代码:
gcc -O2 main.c但是,到最终输出二进制文件之间发生的过程,可以说是计算机科学中最复杂的形式化转换链之一。
整个过程始于词法分析:编译器逐字符读取源代码,并将其分解为词法单元(Token),包括关键字、标识符、运算符与字面量。
接下来是语法分析,编译器会将这些词法单元组织成抽象语法树(AST),这颗树表示程序的语法结构。如果语法有误,编译器会在这一阶段发现问题。它会告诉你代码中的具体行号、具体的字符,一般还会给出可能的解释。
然后是语义分析。编译器会检查你的程序是否逻辑清晰。你的数据类型是否兼容?你引用的变量是否真实存在?你的函数签名是否一致?这一层能够及早发现各种类型的错误:类型不匹配、未定义引用、参数数量违规、无法访问的代码等等。如果没有它,这些错误会在生产环境中暴露出来,而且通常是在最糟糕的时候。
之后,编译器会将你的代码翻译成中间语言表示(IR)。在LLVM中,这是一种基于SSA的类型化格式,它独立于源语言与目标硬件。这是整个架构的基石。Rust、Swift、C、C++、Julia、Zig等编程语言最终都会编译成相同的IR。
一旦生成IR,它们都会应用相同的优化步骤。
编译(翻译)过程会完成以下工作。
消除死代码:删除永远无法执行的代码。
循环展开:将小循环展开以减少分支开销。
向量化:标量运算被转换为 SIMD 指令,从而在单个 CPU 周期内处理多个数据点。
寄存器分配:编译器决定哪些值存储在哪些 CPU 寄存器中,解决了人类在 20 世纪 70 年代放弃手动解决的约束满足问题。
Matt Godbolt 的Compiler Explorer为开发者们打开了一扇通往代码世界的精美窗口。在左侧输入一些 C++ 代码,右侧就会显示汇编代码,然后切换优化级别,观察代码的转换过程。
在 0 级时-O0,代码会得到字面意义上的翻译。在1 级时-O3,编译器会进行一些复杂的操作,而这些操作如果由人工来理解,则至少要花费数小时。
你知道吗?Compiler Explorer每年处理超过 3000 个编译器版本和 81 种编程语言的 9200 万次编译任务。
Google 的工程师每天都使用它来研究生产代码中的优化模式。
LLVM项目从2000年就开始开发了,GCC项目更是从1987年就问世了。一个生产级的优化编译器凝聚了数十年的人的心血。仅仅是实现基本的优化过程,例如常量传播、死代码消除、循环展开和寄存器分配,就需要多位经验丰富的工程师耗费数年时间。而且这些编译器仍在不断改进。GCC和LLVM每次发布都会持续改进它们的向量化策略和针对特定架构的优化。
编译器的每一次转换都是确定性的。
给定相同的源代码、相同的编译器版本和相同的编译选项,你会得到相同的二进制文件。
实现跨构建环境的完全可复现性本身就是一门很深的学问,编译器本身完全取决于其输入。每一次转换都旨在保留程序语义,并经过数十年的测试、数十亿的生产运行时间和庞大的测试套件的验证。像CompCert这样经过形式化验证的编译器更进一步,提供了数学上的正确性证明。像 GCC 和 LLVM 这样的主流编译器虽然没有经过端到端的形式化验证,但它们是人类迄今为止制造的最经受实战考验的软件产品之一。这一切都在毫秒之间完成。
这便是马斯克提议要取代的东西,要用一种会产生幻觉的语言模型来取代编译器。
去除源代码会损失什么?
单从成本角度来看,就足以否定这项提议。但即便推理是免费的,这项提议仍然是错误的,因为它从根本上误解了源代码的用途。
源代码不仅仅是编译器的输入,它更是软件工程的标志性产物。它是人类进行推理、审查、版本控制、差异比较、调试和维护的对象。移除源代码,失去的不仅仅是“流程中的一个环节”,而是支撑现代软件开发的整个协作基础架构。
首先版本控制失效了。Git是几乎所有专业软件开发的基础工具,它的工作原理是逐行跟踪文本文件的更改。你可以清楚地看到两个版本之间的具体更改内容、更改者以及更改原因。但你无法有效地比较两个二进制文件。它们是不透明的二进制数据块,每个“版本”都是一个黑盒子,回滚操作变成了猜测。
接下来,代码审查变得不可能。在任何严肃的软件工程组织中,代码发布前都必须经过同行评审。评审员会阅读差异、检查逻辑、发现边界情况并提出问题。而对于二进制输出,根本无从审查。你这是在要求工程师们完全信任人工智能的判断,却没有任何验证的手段。这根本不是工作流程,而变成一种盲然的祈祷。
调试难度从难到难。编译后的程序崩溃时,你会得到堆栈跟踪、行号和变量状态。而二进制程序崩溃时,你会得到内存地址和段错误。前者是可以调试的,后者则需要反汇编器、十六进制编辑器以及超级的耐心。
最后,跨平台可移植性消失。为 x86 编译的二进制文件无法在 ARM 平台上运行,为 ARM 编译的二进制文件也无法在 RISC-V 上运行。而源代码则可以通过相应的编译器编译成所有平台的程序,而这正是高级语言诞生的主要原因之一。
在 20 世纪 50 年代,霍珀意识到将程序绑定到特定硬件是一种浪费。如果你的 AI 生成的是原始二进制文件,那么它现在需要为每个目标架构生成完全不同的输出。而源代码可以免费处理这种抽象。
安全审计变成了一个黑箱,你无法审计你无法阅读的东西。供应链安全本已是软件工程中最棘手的问题之一,而当所有工件都是由非确定性过程生成的晦涩二进制文件时,它实际上变得不可能解决。如何验证人工智能没有引入漏洞?当你无法检查逻辑时,又该如何定义“漏洞”?
霍珀在1952年就明白了这一点。摆脱机器代码的根本目的在于为人类提供一种理解计算机运行机制的方法。编程语言并非需要克服的限制,而是人机之间的一种通信协议。移除人类可读的层面并不会简化任何事情,反而会蒙蔽你的双眼。
大语言模型(LLM)的真正优势是什么
目前的事实是,LLM 确实在改变软件开发。我每天都在使用它们。它们是卓越的工具。
但它们真正的用途与“跳过代码并生成二进制文件”毫无关联。
大语言模型(LLM)擅长在现有的抽象层级内工作,而不是替换它。他们非常擅长生成样板代码、发现 API、快速构建原型、在不同编程语言之间进行转换、解释不熟悉的代码库以及编写测试。他们尤其擅长那些繁琐但模式良好的编程工作,也就是开发者已经知道要写什么但不想手动输入代码的工作。
这个能力很有价值,它能提高开发者的效率,降低准入门槛,并让经验丰富的工程师将更多时间投入到架构和设计中。围绕 LLM 辅助开发的工具,例如 Cursor、GitHub Copilot 和 Claude 的智能编码功能,正在快速发展完善。
但是,请注意所有这些工具的最终结果都是:源代码。人类可阅读、可版本控制、可审查、可调试的源代码。接着这些代码会被确定性编译器编译成优化的二进制文件。LLM 负责创造性地生成代码,编译器负责确定性的转换,它们各自发挥所长。
LLM(逻辑层模型)与编译的交叉领域涌现出许多令人兴奋的研究成果。VecTrans是一个计划于 2025 年发布的框架,它利用 LLM 将代码重构为更易于编译器自动向量化的模式,实现了 1.77 倍的几何平均速度提升。LLM -Vectorizer采用了类似的方法,它使用 LLM 生成 SIMD 内联函数,并通过 Alive2 进行形式化验证以保证其正确性。但请注意两者的共同点:LLM 生成的是源代码,然后这些代码会经过传统的编译流程。它们是在增强编译器,而并非取代它。
如科斯塔所指出:“如果人工智能在代码编译方面比现有编译器更胜一筹,那么它就会编写自己的编译器,并从那时起一直使用它。”人工智能在编译链中的最佳应用是改进现有工具,而不是成为更糟糕的版本。
如果他所说并非字面意思
我们也可对马斯克的说法进行宽容的解读。
可能是这样的:“他指的并非字面意义上的随机采样。他指的是人工智能辅助编译、程序合成,或者某种能够接收意图并生成可执行文件的端到端系统。”
好吧,咱们硬着头皮上。
如果你指的是能够改进编译器的AI,那这已经实现了。我们刚才引用的研究表明,LLM(逻辑层模型)可以帮助进行向量化决策、优化阶段顺序以及代码重构,从而更好地与编译器协作。这是真实存在的,也很有用,而且是循序渐进的。
但这也不是马斯克所描述的。他说的是“你甚至不用再写代码了”,而不是“编译器会变得更智能”。
如果你指的是基于形式化规范的程序合成,那是一个活跃的研究领域,也已经有几十年的历史了。像Sketch这样的系统和现代的合成工具可以根据约束条件生成程序。但它们之所以有效,正是因为它们有形式化规范可供验证。输出结果会被检查,但不能完全信任。而且规范本身是用结构化的、人类可读的语言编写的。你仍然需要人类可读的层。
如果指的是完全基于自然语言提示生成二进制文件,无需源代码、形式化规范和验证步骤,那么你就触及了马斯克的真正主张,而这恰恰暴露出我之前提到的种种问题。
最近一项关于语言学习模型(LLM)编译器的研究调查明确指出:即使在特定的编译任务上,现有方法“在性能、成本或可扩展性方面也大多无法超越传统编译器”,更不用说端到端生成了。
那些经过精心炮制的版本要么不是他说的原话,要么不是新内容。而字面意思的版本才是他真正说的,但是行不通。
他为什么要这么说?
马斯克口口声称他小时候曾开发过电子游戏。如果这一切是真的,那么这一切对他来说应该都不陌生。他写过代码,也接触过编译器。他想必明白确定性过程和概率性过程之间的区别。
但如果你运营的是 xAI(扩展人工智能),那么“AI 帮助开发者更快地编写出更好的代码”这种说法就没什么用。它既不能提升 Grok 的市场地位,也不能证明数十亿美元的 GPU 基础设施投入是合理的,更不会成为新闻热点。
“人工智能彻底扼杀编程”这句话包含了全部这三点。
这并非马斯克自己独有的现象。所有构建GPU基础设施的AI公司都有动机宣称一切都需要推理计算。当商业模式依赖于代币销售时,每个问题看起来都像是需要更多代币。马斯克运营着xAI。Grok需要一个故事,而所有关于人工智能即将无所不能的说法,实际上也是在宣称xAI正在构建的基础设施的价值。当你告诉全世界人工智能将取代编译器,直接生成二进制文件,并最终从神经网络中生成实时像素输出时,你并非在做出技术预测,而是在阐述投资理念。你是在告诉市场,对推理计算的需求即将变得近乎无限,从编写代码到渲染图形,每一个创作行为很快都需要经过逻辑推理模型(LLM)的运行。
马斯克向来喜欢做出雄心勃勃的预测,并设定了宏伟的时间表。比如,他曾预言2018年就能实现完全自动驾驶汽车,但至今仍未实现;他说2020年就能让一百万辆无人驾驶出租车上路,现在看来简直可笑,2021年就能通过Neuralink实现人机共生,我们目前只成功地让少数人操控了光标。
这些预测的目的并非追求精确,而是旨在指明方向,引导人们围绕他所构想的未来愿景进行预期和投资,而他的公司正是这一愿景的核心。
“编码将死亡”的说法也是同样的伎俩。这并非技术分析,而是披着预言外衣,制造对推理计算的需求。
真实的未来
编程的未来并非根据提示语生成二进制代码,而是已经发生的事情:更高层次的抽象、更好的工具,以及人工智能作为软件编写创造性过程中的协作者。
编程语言将持续演进。编译器将不断改进,或许会借助机器学习辅助的优化过程来发现新的转换方式。语言学习模型(LLM)在生成、审查和解释代码方面也将不断提升。“我有一个想法”和“我拥有可运行的软件”之间的差距将持续缩小。
但源代码并不会消失。它的存在是因为人类需要理解、验证和维护计算机的运行机制。即使计算机变得更智能,这种需求也不会消失。恰恰相反,它变得更加重要了。
格蕾丝·霍珀毕生致力于倡导编程应该易于理解,人类应该能够用自己能够阅读和理解的语言表达意图,而机器则应该负责将代码转换成硬件。她当时的观点是正确的,而且这一原则至今仍然适用。
“如何改进软件开发”的答案并非“剥夺人类理解软件的能力”。答案在于更好的工具、更好的语言、更好的编译器,以及能够融入现有技术栈而非试图取代它的更优秀的AI助手。
马斯克的预测终将像他其他的预测一样过时:它提醒我们,科技界声音最大的人往往对事物实际运作的方式并不感兴趣。
作者:大雄
本篇文章为 @ 行动的大雄 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。