2026-11-04 08:17

她本想回到高中继续教数学,却最终开启了一场计算机革命

author_path 返朴 icon_path
头图

本文来自微信公众号: 返朴 ,作者:陈清扬


今天,我们习以为常的计算机程序,往往只需要几行高级语言,之后的工作会由编译器“翻译”成计算机“理解”的代码。但在计算机发展早期,这样让机器自己读懂并优化程序却是一件近乎不可想象的事情。上世纪50年代,一位高中女教师为了还学生贷款,偶然进入IBM公司,从此登上了计算机科学的舞台。她参与奠定的编译优化和自动并行化技术,至今仍影响着程序如何高效运行。她就是弗朗西丝·艾伦,图灵奖史上首位女性得主。


本文收录于合集:科学家


如果提到计算机科学的先驱,人们通常会想到图灵、冯·诺伊曼或香农的名字。对于快速发展的计算机领域来说,他们可以说是“上古大神”。对于今天习以为常的软硬件、编程,还有许多人的贡献同样深刻,他们的成果已成为底层的通用知识,隐身于代码与算法之下。弗朗西丝·艾伦(Frances E.Allen,1932-2020)就是其中之一。


艾伦是计算机科学发展最重要的先驱之一。20世纪50年代,她进入IBM,向内部科研人员讲授刚刚诞生的Fortran语言,由此她一头扎进编译技术,在后续职业生涯里深耕程序优化、控制流分析和自动并行化。艾伦的工作帮助计算机从“只能按照人类逐条指令执行”,走向了今天这种能够由编译器自动分析和优化程序的计算模式。2006年,她成为图灵奖历史上第一位女性得主。


而她的起点却与这项后来改变计算机科学的事业相距甚远,这一切要从她挚爱的小镇高中讲起。


快乐的高中数学老师


1932年,艾伦出生于美国纽约州一个不富裕的农场家庭。她居住的小镇,靠近加拿大边界,2020年总人口也只有6700多人。这里西侧可眺望阿迪朗达克山脉,东面则毗邻尚普兰湖,还有大片的农田,早期的移民者认为这些景色酷似南美洲秘鲁的风光,于是直接取名为Peru。


从艾伦家乡遥望尚普兰湖。丨图源:wiki


艾伦的父亲是农民,母亲是一名小学教师,家中有6个孩子,艾伦排行老大。艾伦的童年正值美国经济大萧条时期,一家人生活清苦,她唯一的消遣方式就是读书。


童年时代的艾伦。丨图源:IBM


上学以后,艾伦最初的兴趣是英语和写作,高中时她碰到了一位非常棒的数学老师,从此爱上了数学,特别是几何学。高中毕业后,艾伦前往纽约州教师学院(现为纽约州立大学奥尔巴尼分校的一部分)学习数学,这里是纽约州为数不多由州政府资助、专门培养高中老师的师范学校,学费极为低廉。艾伦无力承担其他大学高昂的学费,而且她当时的志向就是当一名高中数学老师,所以这里成了唯一的选择。艾伦主修数学、辅修物理,四年后获得了学士学位。


1954年,艾伦毕业回到高中母校担任数学老师。艾伦很热爱这份工作,实际上,她的很多学生就是亲戚或者朋友的孩子。对她而言,这是一个温暖的社群,她很享受在这里教书。后来为了获取正式的教师资格,艾伦又通过学生贷款去密歇根大学念了一个硕士学位。


1950年代,计算机还处于萌芽时期,而密歇根大学是少数提供此类课程的机构之一。艾伦的硕士学位要求学生必须选修两门数学系之外的课程,于是她便选修了计算机课。学校里用来教学的机器是IBM 650,它被认为是世界上第一批大规模生产的电脑,一共生产过约2000台。相对较低的售价,再加上易用的编程性,一些学校就采购用作教学。无独有偶,计算机科学领域的另外一位先驱、算法分析的奠基人高德纳(Donald Knuth),当时还是一名物理系本科生,正在距密歇根不远处俄亥俄州的凯斯西储大学,面对着一台IBM 650,并试图重写它的编译器——这也是他的计算机启蒙。


正是由于一点点来自IBM 650的编程启蒙,再加上她本人的教师背景,艾伦在IBM的校招中获得了一份工作机会:去IBM研究院教科学家们Fortran语言,尽管艾伦此时对Fortran还一无所知。事实上,女性程序员在计算机科学发展早期并不罕见。在50年代IBM曾大量招聘女性程序员,甚至发布过名为“My Fair Ladies”的招聘海报。为了偿还学生贷款,艾伦接受了这一份工作,并打算还清贷款以后,继续回到她热爱的高中教数学。


1957年IBM曾大力招聘女性程序员。丨图源:opentranscripts.org


教科学家们Fortran


1950年代,计算机编程仍是一项高度依赖手工操作的工作,程序员通常要手写汇编、手动管理寄存器和指令调度,很多人甚至对这类底层操作中的技巧乐此不疲。但并非所有人都甘于这份繁琐。日后被誉为Fortran之父、并在1977年捧回图灵奖的约翰・巴克斯(John Backus),当时就厌倦了这样操作繁琐、重复性高的编程工作。他相信,应该能够用数学的方式描述问题,再由计算机自动将其转换为高效的机器代码。正是这份“懒惰”,促使他在1953年开始构思一种新的编程语言——这项工作最终发展成为彻底改变程序设计的Fortran。


Fortran是一门全新的语言,代表着编程方式的巨大革新:程序员不必成为“硬件专家”,不再需要自己去查阅机器指令和手写汇编,而是可以直接用类似数学公式的语言来表达程序的意图。在Fortran的设计中,巴克斯和他的团队把能够生成高性能的机器码作为最高考量,而不过度堆砌语言的特性。在这一宗旨下,经过多次迭代以后,Fortran团队最终在1957年4月推出了他们的第一版编译器。


什么是编译器?计算机只听得懂“机器语言”——一串串0和1组成的指令,若表达a乘以b加c,程序员使用Fortran语言进行编程,就可以直接写字符串“a*b+c”。而编译器的工作即是理解这串字符代表的含义,并把它们翻译成计算机能运行的机器指令。


但从实用的角度来说,光翻译还远远不够。同一段程序,翻译得好坏差别巨大——有的跑得飞快,有的慢得让人干等。所谓“编译优化”,就是让编译器这位翻译官不只忠实翻译,还要在翻译时聪明地重排语句,即在不改变程序意思的前提下,让结果跑得更高效、更省资源。但是用户的输入程序可能五花八门,如何都能够达到比较好的优化效果呢?这在当时来说是一门全新的学问。


事实上,在Fortran诞生之前,除了巴克斯和他的团队,很少有人相信,这种主要依靠数学形式的编程语言,能够生成性能与手写汇编媲美的代码。Fortran被推出以后,IBM的科学家们对它并不感冒,因为他们早已习惯了自己手写汇编、宁愿埋头专注科研问题,于是公司就安排了数学老师艾伦来教这些科学家们Fortran语言——艾伦来的时候,Fortran刚刚诞生3个月。事实证明,Fortran生成的汇编代码,的确做到了媲美人工优化的结果,科学家们惊讶于它生成的代码之高效,也开启了现代编程的新范式。


艾伦首先要自学,领悟这套全新语言所代表的编程理念。在阅读了它的编译器源码、并深入研究后,艾伦对编译器产生了浓厚兴趣。她没有再回到高中母校,而是继续在IBM从事编译器与代码优化的工作,这一待便是45年。


与秘密超级计算机共事


艾伦参与的第二个大项目是为Stretch/Harvest超级计算机开发编译器。


1961年,IBM推出了其开发的第一款晶体管超级计算机7030,直到1963年,7030都是世界上最快的超级计算机。IBM当时给这款机器命名为Stretch,即延伸,它也的确延伸了人们对于计算机设计的定义:首次将指令流水线(pipeline)、专用处理等理念应用于超级计算机,如今这些已成为计算机设计的标配。而Harvest(IBM 7950)是IBM为美国国家安全局(National Security Agency,NSA)打造、用于密码破译的专用计算机,搭载在Stretch上运行。


Stretch和Harvest的架构思路类似今天CPU搭配专用加速器:Stretch承担通用计算,密码破译这类专用任务交给协处理器Harvest。Harvest开创了流式处理的先河,让同一套指令作用于海量流动数据,属于最早的专用协处理器之一,可以说是现代图形GPU的思想先驱。不过,受冷战背景保密约束,这台性能极强的机器长期隐匿于公众视线之外,据NSA估算,它比同期任何商用计算机快50至200倍;它在NSA服役14年,直至零件破损、无法替代才退役。得益于Fortran的巨大成功,Stretch与Harvest在设计阶段就高度重视编译器,艾伦正是这两台超算编译器的核心设计者。


除了开发编译器,艾伦的另一个任务则是为Harvest开发一门配套的新的高级编程语言——一种更加精简、专门用于做密码破译的语言,这门新语言后来被命名为Alpha。由于密码破译程序主要就是字符串操作,编程人员使用Alpha语言即可精简地表达字符串模式匹配、统计分析等程序,而不必熟悉Harvest的硬件指令。艾伦则是这门新语言设计与开发代表IBM方的主导设计者。


如许多那个年代的大型软件项目一样,Stretch/Harvest的编译器开发目标比较激进,其实并不算成功。团队一开始想开发一套能同时处理三种不同的输入编程语言——Fortran、Alpha和Autocoder(一种类似于COBOL的编程语言)的编译器,并能为Stretch和Harvest这两种不同的硬件生成代码。美国国家气象局是Stretch机器的采购方之一,后面他们发现用Fortran编写的天气预报程序需要运行18个小时才能够做24小时的天气预报。


艾伦在主导Alpha语言开发的阶段,完全不知道这套工具服务于NSA的密码破译任务,彼时NSA这个机构对公众都还是秘密。她一直以为合作方是海军船舶局,只是做普通的字符串分析。甲方只提需求,不会透露任务背后真实目的。她其实是在不知情中,为顶级密码分析系统设计编程语言。后来她从报纸上得知合作方有两人叛逃苏联(Martin–Mitchell事件),这才意识到自己参与的是NSA的项目。但即便拥有很高的安全许可,许多具体任务内容也是直到多年后相关资料陆续解密,她才真正了解。


一个学术成果丰硕的夭折项目


Stretch问世两年后,超算大师西摩・克雷(Seymour Cray)设计的CDC 6600横空出世,性能达到Stretch的三倍,一举夺走全球最快超算的头衔。IBM CEO小沃森(Thomas J.Watson Jr.)为此写下著名的CDC 6600备忘录,一场超算军备竞赛正式开启。


实际上早在1961年,也就是Stretch刚刚问世后,IBM便已经在筹划一个雄心勃勃的新项目Project Y,它的目标是比Stretch快100倍!要知道,当时Stretch设计的目标也是比世界上现存的机器都要快100倍!Stretch和Harvest项目收尾后,艾伦和她的同事约翰·科克(John Cocke;1977年图灵奖得主)投入Project Y。这场超算竞速里,约翰・科克主要负责硬件架构设计,而艾伦重点负责软件——让编译器生成高效的代码。与先确定硬件、再开发软件的传统思路不同,他们为这个项目尚未定型的新机器开发了一个硬件模拟器(simulator),编译器生成的目标代码会在模拟器上运行以获取性能数据并反馈,团队据此反复调整、迭代式地开发硬件架构。这种“让编译器参与塑造计算机架构”的理念,后来成为现代高性能处理器设计的重要思想。


1965年,IBM在西海岸的森尼韦尔(Sunnyvale)开设了一个新的实验室,启动了一个名为Advanced Computing Systems(ACS)的新项目。他们要在这里再度建造世界上最快的计算机,Project Y也并入其中。


在硬件设计上,ACS尝试了各种前沿的架构技术,包括超标量、分支预测、乱序执行等等,这些技术也都已成为现代CPU的标配。而整套编译器框架,由艾伦主导。依托软硬件协同设计,她把编译优化抽象成一套独立于硬件、独立于编程语言的通用分析框架。她还发现,面对ACS这种复杂硬件,编译器产出的代码,甚至可以比手工汇编更高效——因为编译器内置硬件知识,能更充分地调度复杂硬件特性。最终,ACS硬件和软件层面都产出大量开创性学术成果。然而令人遗憾的是,这台机器始终没能被制造出来。


ACS项目的终止,和IBM大获成功的System/360产品线直接相关。System/360问世后迅速获得成功,奠定现代计算机很多基础概念,比如软件的兼容性、八比特为一个字节,等等。当时的项目经理、计算机科学家弗雷德里克·布鲁克斯(Frederick Brooks)由此写出了传世之作《人月神话》(The Mythical Man-Month)。艾伦当时也被邀请加入System/360项目,但由于这个项目涉及到IBM在欧洲的诸多分部,需要许多的国际旅行,艾伦便回绝了。后期公司资源倾斜冲突,1969年ACS正式被取消。这是一个悲伤的事件,研究人员各奔东西。艾伦选择留下,并成立了一个新的编译器团队,继续发展在ACS期间研发的技术。


一台从未被造出来的机器,一个被取消的项目,听起来像是失败,但正是在ACS的探索中,艾伦与科克搭建起了现代优化编译器的理论根基。今天编译器领域的许多基本术语,正是在当时他们在论文提出的。1966年,艾伦写出里程碑式的IBM内部技术报告“Program Optimization”(1969年正式公开发表),文中提出了一种语言独立、机器独立的程序优化框架。也就是说,这套框架不依赖编程语言和具体的计算机,将程序优化从针对特定机器的经验性技巧,变成了一套通用的理论方法。


1966年艾伦的论文Program Optimization丨图源:IBM


这套理论的地基,正是论文里首次提出的“控制流图”(Control flow graph,CFG)。程序在源文件中表面上是一行行按顺序排列的代码,就像一份写好的操作说明。CFG的方式是说,编译器将代码“读”成一张流程图:一段段连续的步骤是节点(基本块),箭头标出“下一步会走到哪”,判断处分叉、循环处兜圈。艾伦的创见在于,她意识到一旦程序变成了这样一张图,对代码的分析与优化便可以用图算法来表达。举个简单的例子,设计一个图算法来分析如下问题:从入口节点出发,沿着箭头一路走下去,会不会存在某个节点,无论哪条通往出口的路径都不经过它?而这样的节点就是“不可达代码”(unreachable code),程序不会执行这条代码。


控制流图示例,用户代码在左边,控制流图即用一个流图来表示代码;在流图上,我们能设计各种分析的算法,如找出不可达代码,即图中的A=B+C部分。丨图源:作者自制


就这样,艾伦把“优化”从一门靠经验的手艺,变成了一门可以在图上严谨推理的科学。今天现代编译器里的绝大多数优化,依然建立在这套“先把程序画成图,再在图上分析”的框架之上。


20世纪70年代,计算机科学的多个分支进入快速发展阶段。艾伦等人的工作正是计算时代洪流中的重要组成部分。1971年,艾伦与科克合作的论文“ACatalogue of Optimizing Transformations”首次系统性地总结了许多如今已成为标配的编译优化,包括循环展开、合并、不变量外提,等等。随后在1973年和1974年,艾伦也对过程间程序分析,即将代码优化的范围从单个函数扩展到跨函数,做出了先驱性的贡献。


可以说,我们如今的计算机程序之所以能运行得如此高效,完全得益于艾伦这些奠基性的贡献。


成为项目经理,让Fortran自动并行起来


70年代末期,向量化处理开始成为超算的主流。再度由克雷操刀的一代传奇超级计算机Cray-1将向量化处理带入了超算的世界,并行与多核逐渐进入人们的视野。1980年代早期,艾伦成立了PTRAN团队,即Parallel Translator,来探索编译器自动生成并行代码。PTRAN的目标是将用户编写的串行Fortran代码(比如循环)自动编译成可并行执行的机器码。这里的难点在于,从串行的程序中,自动地去发掘语句之间的依赖关系,从而判断它们是否可以并行运行。PTRAN是一个学术上和管理上都高度成功的项目,团队持续了15年,发表了诸多有影响力的论文,对自动并行这一领域做了先驱性的贡献。


在PTRAN项目中,艾伦作为项目经理,主要的工作之一是为团队的成员们创造一个有创造性的环境。每个人都能有一个自己的项目,可以自己去探索与实验并发表有自己署名的论文。事实上,PTRAN团队走出了诸多闻名的编译器学者,包括珍妮·费兰特(Jeanne Ferrante)、维维克·萨卡尔(Vivek Sarkar)等。珍妮·费兰特也是一位对编译优化做出了卓越贡献的女性学者,自动并行领域一种常用的表示方式——程序依赖图(program dependence graph)便是由她提出的;她对于编译优化的中间表示形式也做出了重要贡献。


因对编译领域做出的卓越贡献,艾伦取得了诸多荣誉。1989年,她当选IBM史上首位女性IBM Fellow,这是IBM技术人员能获得的最高内部荣誉;1991年当选IEEE Fellow,1994年当选ACM Fellow;2004年获IEEE颁发的计算机先驱奖(Computer Pioneer Award);2006年,艾伦荣获图灵奖,表彰其“在优化编译器技术的理论与实践方面做出了开创性贡献,为现代优化编译器及自动并行执行技术奠定了基础。”


从未真正离开


2002年,艾伦从IBM退休,但并未就此告别计算机科学界,她仍以荣休IBM Fellow的身份与公司保持联系。在技术贡献之外,艾伦也因为其教育贡献和提升女性在科学技术领域的参与度而广为人所知。艾伦分别曾在1970年和1977年休假前往纽约大学以及斯坦福大学任教。她教过的学生包括安妮塔·博格(Anita Borg),博格是推动女性进入计算机行业最具影响力的人物之一。当时艾伦是安妮塔所在的研究生院唯一的女性教授。


在她担任IBM项目经理时期,她所管理的团队始终保持了一半一半的男女比例。为了纪念她,IBM在2000年成立了以艾伦命名的奖(Frances E.Allen Women in Technology Mentoring Award),旨在表彰IBM内部在指导、培养和支持技术女性成长方面做出突出贡献的员工。艾伦本人正是首位获奖人。


在个人生活中,艾伦是一位相当热忱的户外徒步与登山爱好者。她曾攀登过喜马拉雅和奥地利的山脉、游历过北极,甚至参与发现了一条穿越加拿大最北岛屿——埃尔斯米尔岛的路线。值得一提的是,艾伦曾多次来到中国,其中在1973年和1977年作为IBM科学家应邀来到中国讲学;1983年参与了四姑娘山地区的登山探险。


艾伦在户外。丨图源:IBM


2020年8月4日,在88岁生日那天,艾伦因阿尔茨海默病离世。艾伦的一生,从纽约东北角的农场开始,一次为了还清学生贷款的意外之旅,让她见证了现代计算机的发展,并深深地参与其中。在人们的纪念与回忆中,艾伦一生温暖而谦卑,尽管事业上非常成功,但她很少谈论自己的成就,生活也十分朴素。她用一生去支持教育、支持年轻人、支持女性探索科学,让他们走出更广阔的人生。


参考资料


[1]https://en.wikipedia.org/wiki/Frances_Allen


[2]https://cacm.acm.org/news/fran-allen/


[3]https://cacm.acm.org/news/an-interview-with-frances-e-allen/


[4]https://ethw.org/Oral-History:Frances_%22Fran%22_Allen


[5]http://opentranscripts.org/transcript/fran-allen-ghc-2008/


[6]https://spectrum.ieee.org/cold-war-codebreaker-nsa-ibm


[7]https://en.wikipedia.org/wiki/IBM_7950_Harvest


[8]https://www.ibm.com/history/stretch


[9]https://www.ibm.com/history/fortran


[10]https://www.ibm.com/history/700


[11]https://www.ibm.com/history/women-in-tech


[12]https://www.ibm.com/history/frances-allen


[13]https://tech.sina.com.cn/it/2007-12-11/08441904899.shtml


[14]Wood,Peter."Asia,China:Ascent of Bok'ra III and Attempt at Circuit of Siguniang." The American Alpine Journal,vol.26,no.58,1984,pp.332–333.

本内容来源于网络 原文链接,观点仅代表作者本人,不代表虎嗅立场。
如涉及版权问题请联系 hezuo@huxiu.com,我们将及时核实并处理。