六十年前的计算机语言,成为了疫情期间美国政府系统的支柱

软件

04-14 13:25

本文来自微信公众号「机核」(ID:gamecores),作者范克里夫大尉,爱范儿经授权发布。

停在港口的船很安全,但我们造船并不是为了这个。

——格蕾丝·霍珀

上周,美国新泽西州州长菲尔·墨菲对公众发出征集,希望州里的 COBOL 程序工程师志愿帮助维护和优化失业保险系统。这套政府机关使用的系统已经运行了四十多年,由于最近的 COVID-19 疫情造成失业人口激增,为给他们办理各类事务手续,系统已不堪重负,濒临瘫痪。

问题在于,这套系统和美国大部分政务、商务机构一样,依赖基于 COBOL 语言的遗留系统,而这种计算机语言已是六十年前的产物,在突然激增的维护需求面前,难以短时间征募足够的相关人员。

这位州长的呼吁在网络上一石激起千层浪,围绕当代信息社会对旧式系统的依赖性、遗留系统的利弊与相关业务知识传承的话题,引来不少争论。

虽然时常被戏称为计算机语言世界的「上古卷轴」,COBOL 语言仍是信息化历史的里程碑之作,说到它就不能不提为其奠定理论基础的传奇科学家格蕾丝·穆雷·霍珀。

格蕾丝·霍珀本名格蕾丝·穆雷,1906 年生于美国纽约市。生来对新事物充满好奇心的她,据说小时候一口气连拆了家里七座钟表,十六岁就报考著名的瓦萨学院,因拉丁文分数过低落选一次后,于十七岁那年入学,1928 年毕业获数学学士学位,三十年代初在耶鲁大学取得硕士学位。在此期间,她与纽约大学学者文森特·霍珀结婚,因此改姓,后虽然二人离婚,也未曾更改。

1934 年,她在耶鲁大学获得数学博士学位。早在三年前,她就开始在母校瓦萨学院任教,1941 年被聘为副教授。

太平洋战争爆发后,美国海军于 1942 年 7 月开始接受女性进入预备役,成立了「女性志愿应急服务部队」,即 WAVES。霍珀于 1943 年志愿加入 WAVES,尽管体重不达标 [1],还是被破格录用,以预备役中尉身份在哈佛大学与受 IBM 公司资助的的霍华德·艾肯合作,担任一号计算机的程序工程师,合作发表了多篇关于这种设备的论文。

一号计算机是世界上第一台通用计算机,由霍华德·艾肯领导研制,当时被放置在哈佛大学,霍珀是其首批程序工程师之一。

日本投降后,霍珀曾申请转入海军现役,因年龄原因未获批准,之后以海军预备役身份成为哈佛计算机实验室会士,在该单位工作到 1949 年,并被聘为瓦萨学院教授。

1947 年,霍珀的团队在哈佛使用二号计算机时遭遇故障,结果她发现是一只飞蛾被压死在继电器部位导致了故障。霍珀把蛾子贴在日记页,写上了「第一个被发现的真正 bug(虫)」,后来「bug」逐渐演变为对程序错误的俗称。这页日记现收藏在美国历史国家博物馆。

1950 年,她被聘为埃克特-默里奇计算机公司的资深数学专家,参与开发 UNIVAC I 计算机。同年,埃克特-默里奇被雷明顿·兰德集团收购,UNIVAC I 也研发完成,翌年投入市场,成为世界上第一种用于业务处理并实用化的商用计算机,革命性地运用磁带作为存储媒介,虽然价格昂贵,但仍被包括美国普查局在内的机构和企业采用,总共售出四十七台,商业成绩优异。

从 1951 年起,霍珀花费近两年时间设计了历史上首个实用化的编译器,即 A-0 系统。这极大地方便了用高级语言编写的源代码与机器语言基础的可执行文件之间的互换,显著推动了计算机应用的普及。

霍珀一直主张,相对于门槛较高的机器语言,面向大众或初级开发/维护者的计算机语言应更接近日常生活使用的自然语言——在她的语境里,即更接近英语。

1954 年,霍珀被任命为雷明顿·兰德的自动化编程主管,她领导的团队在五十年代后期开发了两种基于编译器的编程语言,即 MATH-MATIC[2] 和 FLOW-MATIC[3],后者于 1959 年完成,是世界上第一种接近英语表达的编程语言。

此时,美国有多家企业机构都在开发商务处理语言。为确立统一标准,美国国防部建议开发一种通用商务处理语言,为此开设了数据系统语言会议(CODASYL)。

1959 年,CODASYL 的一个临时六人小组确立了「通用商用语言」(COmmon Business-Oriented Language),简称 COBOL。虽然霍珀没有亲自参与,但 COBOL 沿袭拓展了她主导的 FLOW-MATIC,以及 IBM 的 COMTRAN 语言。

COBOL 承袭了霍珀团队开发 FLOW-MATIC 的理念,命令与语法更接近英语,直接易读,虽然不具反射机能,但学习门槛比只有函数和算式的语言低得多,便于非计算机专科的业务员使用。而且它便于处理文字列分析和编辑,以及财会计算等业务。

1960 年初,COBOL 被美国联邦政府采纳,作为业务处理系统的唯一指定语言,由此,以其为基础的信息和处理系统开始在联邦机构、各州及其他商务机构普及。

和更早的 FORTRAN 语言一样,COBOL 也是最早国际标准化的高级语言之一。在漫长的岁月中,COBOL 也得益于丰富的多平台编译器和不断拓展的语言规格,始终易于迁移,且在 2002 年实现面向对象编程架构。

六十年来,COBOL 程序已经形成庞大规模,和经其处理的海量数据一起长时间支持着欧美企业与政府机构的系统运作,从社会保障卡信息储存和处理,到 ATM 机,其身影无处不在。

而更新系统的成本和报批流程等源自科层的非技术性原因,使得这些陈年系统久久未能被有计划地换代更新,形成了规模惊人的遗留系统(Legacy System)。

上世纪八十年代,计算机飞速小型化,开放系统与主从式架构快速普及,以往的那些封闭式系统的大型机、小型机等看似过时的技术构件,开始被称作「遗留系统」。但虽然冠以此类名称,这些系统仍在相当多的机构中起重要作用。

跑题一下。其实我和 COBOL 也算曾经擦身而过,因为我妈就是个 COBOL 程序工程师。

七十年代末的时候,她的单位仍使用 0 和 1 组成的机器语言,到了八十年代初,COBOL 即成为主流,主要应用在进口的 NEC 小型机。当时因为是双职工家庭,一放寒暑假,有时候就得去机房写作业,隔间对面就是极具肃杀感的小型机阵列。

不过我只学过 BASIC 语言,而且大部分注意力后来都放在机房里那些微机的游戏上了,比如《F-19 隐形战机》、《沙丘 2》、《德军总部 3D》……

根据高德纳咨询公司的统计,在全球约一万组大型机,仍存在 38000 个遗留系统,其程序代码总计约 3100 亿行,其中 FORTRAN 和其他汇编语言写的代码合计不到 100 亿行,而 COBOL 写的代码有 2000 亿行左右,占比达 65%,每年增长量约 50 亿行。

根据英国 Micro Focus 软件公司发布的信息,全球商用数据的 75%,以及商用数据处理的 80% 以上都依赖 COBOL。

专注于支持 COBOL 遗留系统的美国 COBOL COWBOYS 公司则指出,美国财富 500 强企业中,有九成仍在使用 COBOL。

由此,美国各级机构对 COBOL 的依赖,和其本身老化产生的各种问题之间,就形成了一个颇为魔幻的现实。一方面,时代变迁造成美国教育机构从三十年前就开始显著削减或撤销 COBOL 的教学课程,青壮年程序工程师大都没有接触过它。

另一方面,就是新泽西州州长现在要面对的问题了——在过去两周内,共有超过三十六万名该州居民申领失业保险,这一失业激增是 COVID-19 肺炎导致的,是平时失业保险业务处理量的十六倍,处理系统不堪重负处于崩溃边缘,大批申请阻塞,而这个已经运转了四十多年的系统,和许许多多美国政府、企业机构的基础系统一样,是基于 COBOL 的。

陈旧语言和系统造成的社会服务瘫痪危机并不是什么新鲜事物,二十多年前成为话题的「千年虫」问题也与此有关。在计算机产业的起步阶段,为尽量节省当时高昂的储存成本,霍珀规定在一号计算机上只能用六位数字存储时间,即年、月、日各两位。

这一定义被 COBOL 沿袭,年份只用后两位存储,虽然五十年代末就有人提出到了 2000 年,这会造成混乱,但毕竟当时很少人能想到那会儿写的程序会用上几十年。但如前所述,大量遗留系统的传承,使得这样的时间标记方式容易在 2000 年来临时导致日期卷回等问题。

为此,很多关键机构在九十年代末临时召集 COBOL 程序工程师进行事先堵漏,或更新系统,总算没有造成严重问题,但仍有一些无力负担此类成本的中小型企业遭殃。

在此之后,美国国内时有呼声,呼吁尽快将关键机构中基于 COBOL 的遗留系统换代,或尽量维持和培养相关技术支持人员。不过,成本等问题令这些呼声往往是干打雷不下雨,各级机构应对颇为缓慢。

不仅如此,COBOL 开发者的人数也在逐年下降,2009 年时估计有约二百万人,到 2019 年已减少到约八十五万人。综合目前的环境,这是个必然的趋势,拿新泽西州为例,政府肯定不会为了应对无法预测何时会到来的系统问题而保持常设的 COBOL 相关岗位和开支。

但只要美国社会仍在依赖基于 COBOL 的遗留系统并不愿从系统层面想办法逐步更新,那么足以威胁整个社会稳定的威胁,就会一直是挂在这个特级大国脑门子上头的达摩克利斯之剑,这一次,是成千上万失业者迟迟拿不到失业保险金和票券,那下一次呢?

这样的情况也并非孤例,由于这样那样的「非技术性」原因,很多人们以为理所当然的事其实难比登天,而很多匪夷所思的事也往往司空见惯。

和老白聊起这个话题时,他评之为「建造在浮木上的城堡」,一语中的。

晚饭时候我跟我妈说,你知道不,COBOL 就要 great again 了,纵横时光六十载,你这个行当才真是屹立不倒。

但她竟然飞起一脚踢到我的牙齿。

[1] 当时仅有 47 公斤,标准为 54 公斤。

[2] 即三型代数式翻译器(AT-3)。 

[3] 即零式商用语言(B-0)。

登录,参与讨论前请先登录

评论在审核通过后将对所有人可见

正在加载中