作者 | 信风智库整理

来源 | 信风智库

“计算机界的诺贝尔奖”——图灵奖隆重出炉!

北京时间3月31日傍晚,国际计算机协会(ACM)官宣将2020年图灵奖授予哥伦比亚大学计算机科学名誉教授Alfred Vaino Aho斯坦福大学计算机科学名誉教授Jeffrey David Ullman,以表彰他们在编程语言实现(programming language implementation)领域基础算法和理论方面的成就。

1

两位编程语言大佬

Alfred Vaino Aho是哥伦比亚大学的Lawrence Gussman荣誉教授。他于1995年加入哥伦比亚大学计算机科学系。在加入哥伦比亚大学之前,Aho曾在贝尔实验室担任计算科学研究副总裁,在该实验室工作了30多年。Aho毕业于多伦多大学,之后获得了普林斯顿大学电气工程/计算机科学的硕士学位和博士学位。

他是美国国家工程学院、美国艺术与科学学院和加拿大皇家学会的会员。他同时也是ACM、IEEE、贝尔实验室和美国科学发展协会的会员。

Aho荣获过数不胜数的荣誉,包括IEEE约翰•冯•诺依曼奖章和NEC C&C基金会C&C奖等等大奖。

Jeffrey David Ullman是斯坦福大学 W. Ascherman名誉教授,同时也是Gradiance Corporation的CEO,该公司是一个包含各种计算机科学主题的在线学习平台。

Ullman是ACM会员、美国国家工程学院、美国国家科学院和美国艺术与科学学院的会员。

Ullman获得过的荣誉包括EEE冯诺依曼奖章、NEC C&C基金会C&C奖,Donald E. Knuth奖和ACM Karl V. Karlstrom杰出教育家奖。

在这个世界上运行着的每个程序,从手机、汽车上的程序,到在大型Web公司内部的大型服务器中运行的程序,都是由人类使用高级编程语言编写、然后编译为较低级的代码交给机器汇编执行。这些编译技术很多都源于Aho和Ullman两人。

Aho和Ullman共同撰写了九本有影响力的书(包括第一版和后续版本)。他们最著名的两本书包括:

(1)《计算机算法设计与分析》(1974)

这本书由Aho、Ullman和John Hopcroft(1986年图灵奖得主)合著,被认为是该领域的经典著作,并且是十多年来计算机科学研究中被引用最多的书籍之一。

在计算机科学仍是一个新兴领域时,它已成为全世界算法课程的标准教科书。除了将自己的研究成果纳入算法之外,《计算机算法的设计和分析》还引入了随机存取机(RAM)作为使用递归关系分析计算机算法的时空复杂度的基本模型。RAM模型还将不同的单独算法编码为通用设计方法。

(2)《编译程序设计原理》(1977)

由Aho和Ullman共同撰写的这本有关编译器技术的权威书籍将形式语言理论和基于语法的翻译技术集成到了编译器设计过程中,由于其封面设计,通常被称为“龙书”。

这本书清晰地列出了将高级编程语言转换为机器代码,模块化整个编译器构造。书中囊括了作者对词法分析高效技术、语法分析技术和代码生成做出的算法贡献。

2

编译器:连接人类语言和计算机语言

1963年,当Alfred Aho和Jeffrey Ullman在普林斯顿大学研究生院开学的第一天在登记线等候时相遇时,计算机科学仍然是一个陌生的新世界。

使用计算机需要一组深奥的技能,通常只供受过训练的工程师和数学家使用。但是今天,部分归功于Aho和Ullman的工作,几乎任何人都可以使用计算机并对计算机进行编程以执行新任务。

在这个世界上运行着的每个程序,从手机、汽车上的程序,到在大型Web公司内部的大型服务器中运行的程序,都是由人类使用高级编程语言编写、然后编译为较低级的代码交给机器汇编执行。

在计算机中,编译器是一种计算程序,它将以编程语言或计算机语言(源语言)编写的源代码转换为另一种计算机语言(目标语言,通常具有称为目标代码或机器代码的二进制形式)。转换源代码的最常见原因是创建可执行程序。

用高级编程语言编写的任何程序都必须先编译成目标代码,然后才能执行,因此所有使用这种语言的程序员都必须使用编译器或解释器。因此,编译器对现代程序员来说至关重要、不可缺少。对编译器的改进可能会带来可执行程序中的大量功能改进。

早期计算机的软件主要是用汇编语言编写的。直到在不同类型的CPU上重用软件的收益变得足够大,人们才开始编写编译器,并发明了高级编程语言。

对于程序员来说,使用高级编程语言通常通常会更有效率,并且用高级语言编写的程序可以在不同类型的计算机上重用 。即便如此,编译器还是需要一段时间才能建立起来,因为它们生成的代码性能不如手写汇编语言,它们本身就使开发项目望而生畏。

早期计算机的内存容量非常有限,在实现编译器时也产生了许多技术问题。在1950年代末,人们首次提出了与机器无关的编程语言。随后,人们开发了几种实验编译器。第一个实现的编译器由Grace Hopper于1952年为A-0编程语言编写,然而该系统起着加载器或链接器的作用,而不是现代的编译器概念。现代意义上的第一个自动编码和编译器由Alick Glennie于1952年在曼彻斯特大学为Mark 1计算机开发。

3

编译器无可比拟的作用

编译器是将高级语言程序解释成为计算机所需的详细机器语言指令集的程序。

电脑不会说英语、普通话、德语、西班牙语或其他任何人类语言。尽管Siri和Alexa可能会出现,但是计算机和其他小工具都是他们自己的二进制语言(我们无法理解的语言)的母语。

这意味着,如果要编程计算机,则必须说计算机的语言。一个编译器是一个翻译。它将命令转换为计算机可以理解的“ 1”和“ 0”。同一编译器甚至可以生成两种类型的翻译,以及两者之间的各种版本。

通俗来讲,编译器是一种特殊的程序,它可以把以特定编程语言写成的程序变为机器可以运行的机器码。我们把一个程序写好,这时我们利用的环境是文本编辑器。这时我程序把程序称为源程序。在此以后程序员可以运行相应的编译器,通过指定需要编译的文件的名称就可以把相应的源文件(通过一个复杂的过程)转化为机器码了。

一个现代编译器的主要工作流程:

源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables),最后打包好的文件就可以给电脑去判读运行了。

而对源代码的控制意味着商业控制。大多数公司都将其源代码保密,就像可口可乐保护其配方一样。他们,而且只有他们,才能将其程序从源代码编译为不同芯片所需的目标代码。这使公司可以控制程序的运行位置和运行方式。Microsoft保留了Windows 10的源代码控制权,这意味着只有Microsoft可以决定可以运行Windows 10的芯片类型(哪种微处理器ISA)。Apple可以控制MacOS的源代码,依此类推。你和我不能只在我们想要的任何计算机上运行Windows或MacOS,因为我们无法对其进行编译。