用汇编语言编程有多残酷又多美妙,甚至可能通向更强大的人工智能

作者: aeks | 发布时间: 2025-10-20 10:11 | 更新时间: 2025-10-20 10:11

学科分类: 信息与通信工程 电子科学与技术 计算机科学与技术 软件工程

像Python、Go或C++这类编程语言被称为“高级语言”,它们有点像人类语言,用能在诗歌朗诵会上出现的指令和表达习惯编写。一般来说,编译器这类软件会将其转换成机器真正能读懂的内容:一串串1和0(或十六进制),告诉晶体管如何工作。汇编语言是“低级语言”中最低级的,几乎与机器的“母语”一一对应,堪称“直接对硬件编程”。用汇编语言开发复杂电脑游戏,就好比用脱落的猫毛编织挂毯。

为什么会有人这么做?我最近问了住在苏格兰老家的索耶。他说,效率是一个原因。上世纪90年代,高级编程工具还不完善:编译器慢得要命,调试器也很糟糕。索耶可以通过自己用x86汇编语言(英特尔芯片的通用语言)编程来避开这些问题。

不过,我们都知道这不是真正的原因。真正的原因是热爱。在投身过山车游戏开发之前,索耶还用汇编语言写过另一个游戏——《运输大亨》。在这款游戏中,玩家负责管理城市的道路、火车站、跑道和港口。我想象索耶就像一个模型火车爱好者——铺设每一段轨道,手工缝制人造草坪,每个细节都是一个选择,也是一项苦差事。为了将这些精心设计的像素从位图显示出来,索耶必须充分挖掘芯片的潜力。“《过山车大亨》的诞生,正是因为我熟悉什么是可能的极限。”他告诉我。

在限制中工作?在这个数字资源丰富的时代,这或许是个陌生的概念——调用AI训练算法中的一个函数,就可能动用上百万块GPU。而用汇编语言,你得到的东西只有一样,也正是你所要求的那样——就像许多程序员痛苦学到的,即便结果是错的也一样。汇编语言就是这样,既残酷又美妙。它要求你准确表达自己的意思。

第一种汇编语言由凯瑟琳·布斯在20世纪40年代创造(不过她并未总能获得应有的认可,这也不奇怪),当时它几乎算不上是“语言”。代码代表着代码。要让机器执行操作——比如机器码中的“0,0111”——你得用一系列字母和符号,然后一种名为“汇编器”的新软件会将其翻译成二进制。很快,指令有了更人性化的助记符,比如“MOV”(移动)。

懂汇编语言,就等于懂CPU本身——它能做什么,更重要的是,它不能做什么。芯片的物理设计,即连接与门(AND)、异或门(XOR)等逻辑门的电路布局,决定了它的工作方式。其功能相当基础,会将指令分解为基本步骤:从内存中取出数据,放入一个称为“寄存器”的临时存储单元;在那里对其进行译码;执行一些操作,比如比较两个值或相加;再将结果送回内存。

随着芯片的发展,汇编语言也演化出了新的“方言”。让人类首次登上月球的代码就是汇编语言——专为阿波罗11号制导计算机这一款芯片设计。如果你想阅读泄露的菲比精灵(Furby)源代码,就得精通6502汇编。要破解你的Ti-83计算器,你需要掌握z80汇编。学会一种芯片的汇编语言(比如英特尔的x86)再转而使用ARM芯片的汇编,就好比在贝鲁特学了阿拉伯语,然后试图在突尼斯或喀土穆应付日常交流。祝你好运。

我在大学里学x86汇编,是因为数学不好想“避难”。当我的同学似乎很享受Java那些枯燥的指令时,我却爱上了汇编这种逻辑游戏。用汇编很容易失败,但如果你查看电路和寄存器,失败的原因是可以解释的。用这种“非语言”的简单指令编程时,我感觉自己技艺高超;但我也清楚,这种“高超”其实很脆弱。比如,要准确地说:把这些字节放到那里——不,是那里,那个寄存器里,那些电容中。记住这个。忘记那个。日复一日,像给每个小雕像上色一样,一个接一个地编写代码。

后来,像深度求索(DeepSeek)这样的公司提醒我们,人类仍然可以更好地与硬件“沟通”。今年早些时候,这家研发出高效AI模型的中国公司打破了“AI进步只能依靠更多芯片和更多能源”的说法。汇编语言是其中一个出人意料的原因。深度求索的工程师深入英伟达芯片的底层,命令每一台机器将数据从32位压缩到8位——以牺牲精度为代价换取效率——而且时机恰到好处。观察人士都惊呆了:还能这么做?深度求索的工程师重拾了大多数人已经遗忘的技艺。

2023年,DeepMind的研究人员让AI学习x86汇编语言,然后让它改进C语言中历史悠久的sort()函数。这个人工智能做出了一些奇怪且违反直觉的选择,在寄存器之间进行奇怪的跳转,最终成功减少了一个步骤。这可能只节省了几分之一毫秒,但由于这个新算法已被正式采用,它每天都会发挥无数次作用。

对我来说,这提醒着我们:人类创造了这些机器,即便它们的复杂性似乎超出了我们的理解范围,它们仍然在我们的掌控之中。我们总能让它们运行得更好。就像索耶讲述他最近用树莓派(Raspberry Pi)进行家庭编程实验时说的那样。他觉得显示器有点卡顿,这可能只是他的想象。他说,如果可以,他会重写代码。但遗憾的是,索耶和那台机器说的不是同一种汇编语言。