大家好,我是小邢哥。

上一篇《汇编语言:从 “01 代码” 到 “英语指令”—— 人类如何第一次 “教会机器说话”》发出后,后台收到了好多条友的留言:有人说 “终于看懂了汇编和机器语言的关系”,也有人催着 “赶紧更下一段历史”—— 这份来自大家的认可,直接给了我 “再忙也得把干货续上” 的劲头。

打开今日头条查看图片详情

今天手头的项目堆得满,连喝口水的间隙都少,但编程语言发展史的科普系列绝不能断更。

毕竟做这个专题的初心,就是想把编程行业从 “0 到 1” 的关键故事讲透,不管你是刚接触编程的新手,还是想补补技术史的老同行,都能从这些真实的历史里,实实在在 get 到有用的知识。

接下来,咱们就聊聊那个真正让 “写代码像写公式” 成为可能的里程碑:世界上第一个高级语言,FORTRAN(听过的小伙伴评论区欢迎说一下)。

打开今日头条查看图片详情

1954年,美国IBM公司的一间实验室里,32岁的约翰·巴克斯(John Backus)把一份标着“自动编程系统提案”的文件拍在桌上,对着主管大声说:“让科学家写汇编代码就是浪费生命!我们应该让机器自己翻译,而不是让人类学机器说话!”

打开今日头条查看图片详情

此时的他,刚从“氢弹数值计算项目”的泥潭里爬出来——为了计算一个核反应模型,他和团队用汇编语言写了上万行代码,光是把数学公式“Y = X² + 3X + 5”转换成“LOAD X、MUL X、STORE T1、LOAD 3、MUL X……”这样的汇编指令,就花了整整两周。

更要命的是,换一台计算机,这些代码就得全部重写。

打开今日头条查看图片详情

正是这场“与机器较劲”的痛苦经历,催生了世界上第一个高级编程语言——FORTRAN。它的诞生,不仅让“写公式就能编程”从幻想变成现实,更彻底重塑了人类与计算机对话的方式。

一、问题:汇编语言的“科学计算噩梦”,逼出“让机器学数学”的念头

要理解FORTRAN的革命性,得先看清1950年代科学家面临的“三重困境”。当时虽然有了汇编语言(用ADD、SUB代替二进制),但对于需要大量公式计算的科学领域(如核物理、气象学),编程依然是一场灾难:

打开今日头条查看图片详情

1. 公式翻译太繁琐:写一行公式要写十行汇编

当时的科学家如果想计算“自由落体位移公式 S = ½gt²”,用汇编语言得写成这样一串指令:

LOAD g ; 把重力加速度g加载到寄存器LOAD t ; 把时间t加载到寄存器MUL t ; 计算t²(t乘以t)MUL 0.5 ; 乘以0.5STORE temp ; 把结果存到临时变量tempLOAD temp ; 再把temp加载回来MUL g ; 乘以g,得到½gt²STORE S ; 最终结果存到S

一个简单的二次函数,要写8行汇编,而且每一步都要手动管理寄存器和内存地址。就像你想点一杯“加冰的拿铁”,却必须对服务员说:“先拿一个杯子,加200ml牛奶,加热到60度,再加30ml浓缩咖啡,最后加5块冰”——不是不能实现,但效率太低,还容易出错。

打开今日头条查看图片详情

1953年,加州理工学院的物理学家理查德·费曼(就是那位拿过诺贝尔奖的“科学顽童”)在给IBM的信里吐槽:“我花在把物理公式翻译成汇编代码上的时间,比推导公式本身还多。这就像用算盘计算相对论,工具完全跟不上思想。”

打开今日头条查看图片详情

2. 硬件依赖太严重:换台机器,代码全白写

汇编语言是“跟硬件绑定的方言”:IBM 704的乘法指令是“MUL”,而UNIVAC的是“MPY”;内存地址的表示方式、寄存器的数量,不同机器都不一样。

打开今日头条查看图片详情

约翰·巴克斯团队在1952年遇到过一个极端案例:他们为IBM 701写的核反应计算程序,当客户要求移植到IBM 704上时(这两台都是IBM自家机器),竟然需要重写60%的代码——因为704比701多了硬件乘法器,指令集完全变了。

这就像你用Word写的文档,换了台电脑就得重新打字,只是因为键盘布局不一样。

打开今日头条查看图片详情

3. 科学家不懂编程:“懂数学的不会写代码,会写代码的不懂数学”

当时的程序员大多是硬件专家,熟悉寄存器和指令集,但看不懂微分方程;而科学家懂物理、数学,却学不会汇编的“机器逻辑”。

麻省理工学院的气象学教授朱尔·查尼(Jule Charney)想做一个数值天气预报模型,找了三个程序员合作,结果因为“程序员不懂气压梯度力公式,教授不懂寄存器分配”,项目拖了两年才出成果。

查尼后来回忆:“我们就像两个说不同语言的人,对着同一个问题比划,效率低得让人绝望。”

打开今日头条查看图片详情

这三个问题叠加在一起,导致1950年代的科学计算陷入一个怪圈:计算机越来越强,但能真正用好它的科学家却寥寥无几。

巴克斯在提案里写道:“现行编程方式让人类迁就机器,我们需要反过来——让机器迁就人类的思维习惯。”

二、解决方案:FORTRAN的“三大革命”,让代码像写公式一样简单

1954年,IBM批准了巴克斯的提案,成立了一个10人团队(包括后来的图灵奖得主彼得·诺尔),目标是开发一种“让科学家能直接写数学公式”的语言。

他们花了3年时间,在1957年推出了FORTRAN I,带来了三个颠覆性创新:

打开今日头条查看图片详情

1. 语法革命:代码直接写公式,机器自己“翻译”

FORTRAN最惊艳的地方,是它的语法和数学公式几乎一模一样。比如计算自由落体位移,在FORTRAN里可以直接写:

S = 0.5 * g * t**2

这里的“**”代表乘方,和数学里的“²”对应。科学家看到这样的代码,几乎不用学习就能理解——这就像之前点咖啡必须说“步骤”,现在可以直接说“加冰拿铁”,机器会自己拆解成步骤。

为了实现这个功能,团队发明了“编译器”(Compiler)——一个能把FORTRAN代码自动转换成机器语言的程序。

编译器就像一个“双语翻译”:它先分析“0.5 * g * t2”的数学逻辑,再根据目标机器的指令集(比如IBM 704的乘法指令),生成对应的汇编代码,甚至能优化计算顺序(比如先算t2再乘0.5,比汇编程序员手动写的更高效)。

打开今日头条查看图片详情

1956年编译器测试阶段,巴克斯团队用FORTRAN写了一个“矩阵乘法”程序,再和资深汇编程序员写的版本对比——结果FORTRAN生成的机器码,运行效率竟然比手动编写的还高5%。这个发现让团队兴奋不已:机器不仅能“听懂”人类的数学语言,甚至能比人类更懂如何让机器高效执行。

2. 跨平台雏形:一次编写,多机运行

FORTRAN的编译器是“针对不同机器单独开发”的:比如有IBM 704的FORTRAN编译器,也有UNIVAC的FORTRAN编译器。科学家写的FORTRAN代码(比如S = 0.5 * g * t**2),不需要修改,就能被不同机器的编译器转换成各自的机器语言。

打开今日头条查看图片详情

FORTRAN第一个高级语言让程序员从“硬件奴隶”变成“问题主宰”

这就像你用英语写了一篇论文,不管是给美国人还是英国人看,他们都能看懂(虽然发音不同)。虽然这还不是现代意义上的“跨平台”(编译器需要针对每台机器重写),但已经打破了“换机器就得重写代码”的魔咒。

打开今日头条查看图片详情

1958年,美国陆军弹道研究实验室用FORTRAN写了一个导弹轨迹程序,成功在IBM 704和CDC 1604两台不同计算机上运行,这在之前是不可想象的。

实验室主任在报告中说:“FORTRAN让我们的程序员第一次从’硬件细节’中解放出来,专注于弹道公式本身。”

3. 模块化萌芽:用“子程序”封装重复逻辑

FORTRAN引入了“子程序”(Subroutine)的概念:比如科学家经常需要计算“平方根”,可以把计算平方根的代码写成一个子程序:

SUBROUTINE SQRT(X, RESULT) RESULT = X**0.5RETURNEND

之后每次需要算平方根时,直接调用CALL SQRT(25, R)就行,不用重复写计算逻辑。这就像厨房的“预制菜”——提前做好一道菜的半成品,需要时加热一下就能用,不用每次都从买菜开始。

打开今日头条查看图片详情

这个设计解决了科学计算中“重复公式多次出现”的问题。朱尔·查尼的天气预报团队用FORTRAN重写模型时,把“气压计算”“风速转换”等常用公式做成子程序,代码量从原来的5000行汇编缩减到1200行FORTRAN,而且出错率下降了70%。

三、历史时刻:1957年的“惊世演示”,当机器读懂了数学公式

1957年4月15日,IBM在纽约总部举办了一场轰动业界的演示会。巴克斯团队当着50多位科学家和工程师的面,做了一个“不可能的实验”:

打开今日头条查看图片详情

他们让一位从没学过编程的物理学家,在10分钟内用FORTRAN写下了一个“计算行星轨道的公式”(包含开普勒方程),然后把代码输入IBM 704计算机。

编译器花了3分钟完成翻译,接着计算机开始运行——15分钟后,屏幕上输出了正确的轨道数据。

现场一片哗然。当时的《计算机周刊》报道:“当那个物理学家写下’R = G*M/(V**2)’时,很多人以为这只是个数学游戏,直到机器吐出正确结果,才有人意识到:编程的规则被彻底改写了。”

打开今日头条查看图片详情

更戏剧性的是,演示结束后,一位资深汇编程序员站起来质疑:“这种’懒人语言’运行效率肯定很低!”

巴克斯当场让他用汇编重写同一个程序,结果汇编版本花了3小时编写,运行时间比FORTRAN版本慢了12%——因为FORTRAN编译器的优化算法,比人类手动分配寄存器更合理。

这次演示让FORTRAN一战成名。到1958年底,全美国已有超过200个科研机构采用FORTRAN,其中包括NASA的前身(国家航空咨询委员会),他们用FORTRAN计算了美国第一颗人造卫星“探险者1号”的轨道参数。

国家航空咨询委员会

四、争议与进化:FORTRAN如何在质疑中定义“高级语言”

FORTRAN的成功并非一帆风顺。它诞生后遭遇了不少质疑,而这些争议恰恰推动了它的进化,也为后续编程语言树立了标杆:

1. “太简单会惯坏程序员”?——从FORTRAN I到FORTRAN IV的妥协

早期的FORTRAN I有很多限制:变量名只能是1个字母加1个数字(比如A1、B3),最多只能写20行代码。这是因为当时的编译器技术有限,团队担心太复杂会降低效率。

打开今日头条查看图片详情

1959年,用户反馈“变量名太短记不住”“代码行数不够用”,巴克斯团队推出FORTRAN IV,放开了限制:变量名可以是6个字符(比如VELOCITY、FORCE),支持更复杂的分支结构(IF-THEN-ELSE)。

这次升级回应了一个关键争议:高级语言到底该“迁就机器效率”还是“迁就人类可读性”?FORTRAN给出的答案是:在保证基本效率的前提下,优先服务人类。这个原则后来成为所有高级语言的设计准则。

打开今日头条查看图片详情

2. “科学计算专用,商业领域用不了”?——催生COBOL,却坚守初心

1959年,格蕾丝·霍珀(就是发明汇编宏指令的那位“计算机科学之母”)联合多家公司推出了COBOL语言,专攻商业数据处理(比如记账、库存)。当时有人说FORTRAN“只能算公式,处理不了表格数据”。

打开今日头条查看图片详情

但巴克斯团队没有盲目跟风,而是坚持“深耕科学计算”:1966年的FORTRAN 66加入了“数组操作”(可以一次性处理一组数据,比如计算100个原子的能量),1977年的FORTRAN 77支持“结构化编程”(用DO循环代替GOTO,让代码更清晰)。

这种“专注场景”的策略,让FORTRAN至今仍是科学计算领域的“活化石”——NASA的航天器轨道计算、气象局的数值天气预报、核反应堆的模拟,依然大量使用FORTRAN。

2020年,欧洲航天局的“火星快车”探测器传回的数据,就是用1977年的FORTRAN代码处理的。

打开今日头条查看图片详情

五、影响:FORTRAN不只发明了一种语言,更发明了“编程的新范式”

FORTRAN的真正价值,远超“第一个高级语言”这个标签。它为编程语言的发展定下了三个“基因级”的规则:

  1. 人类思维优先:编程语言应该模仿人类的思考方式(比如数学公式),而不是机器的工作方式(寄存器、指令集)。后来的Python强调“可读性”、SQL模仿自然语言,都是这个逻辑的延续
  2. 编译器是核心:高级语言的灵魂是编译器——它承担了“把人类语言翻译成机器语言”的重任。今天的Java编译器、GCC编译器,本质上都是FORTRAN编译器的“后代”。
  3. 场景化设计:没有“万能语言”,只有“适合场景的语言”。FORTRAN专注科学计算,COBOL专注商业,后来的C专注系统编程,Python专注数据分析,都是这个思路的体现。

图灵奖

约翰·巴克斯在1977年获得图灵奖时说:“我们当年没想着发明一种’永远流行’的语言,只是想解决’科学家编程太痛苦’的问题。但现在看来,解决一个真实的痛点,往往能打开一扇新的大门。”

结语:从“迁就机器”到“机器迁就人”的第一步

回望FORTRAN的诞生,我们能看到技术突破的一个共性:真正的创新,往往始于对“不合理现状”的质疑。当所有人都认为“编程就该学机器指令”时,巴克斯团队却问:“为什么不能让机器学我们的数学语言?”

打开今日头条查看图片详情

今天的程序员,早已习惯了“写代码像说话”(Python)、“写查询像提问”(SQL),但很少有人意识到,这一切的起点,是1957年那个让机器读懂数学公式的瞬间。

FORTRAN告诉我们:编程语言的发展史,本质上是“人类不断把机器拉向自己”的历史。

从FORTRAN到现在的AI辅助编程,我们始终在做一件事:让技术工具更懂人的需求,而不是让人成为技术的奴隶。

这,或许就是所有技术进化的终极方向。

打开今日头条查看图片详情