我做电台的时候,做过一期讲世界上第一个程序员,诗人拜伦的女儿——Ada。但是那时候的电台归那时候的电台,已经是历史电台了,不算数的。这类似于说足球起源于山东淄博一样,这个是国际足联认可的,世界足球起源于我们山东淄博市。这种说法,多少类似于世界上第一个程序员是Ada。
这种说法大家听听就好,虽然我也做过一期那样的电台,但是我内心一直认为,现代足球起源于英国,现代编程语言起源于FORTRAN。
世界上第一台计算机——这么说其实有点问题,换个说法吧,世界上比较早的最知名的计算机——ENIAC,是没有编程语言的。如果想对这台计算机进行编程,那就要重新连接电缆。早期连接计算机的人,都是女人,可能是因为女的比男的更加心灵手巧吧。当然了,后来程序员又成了男人,所以软件的bug越来越多。
不管怎么说,ENIAC那种靠螺丝刀扳手来接电缆的“编程”,不能算现代意义上的编程。那第一台现代意义上的编程是从哪台电脑上来的呢?普遍认为是从另一台计算机——EDSAC——上开始的,关于这台计算机,我在电台的第202期里讲了。这台计算机的创新之处在于,可以编程了,最初使用的方法是:打孔纸带,洋文叫punched tape。
创新之处在于,如果要改变计算机的运行程序,不用再上扳手,钳子来手动连接了,只需要输入不同的纸带就可以。大家可以自己搜一下打孔纸带是什么样子,就是一卷纸,上面打了不同的孔。如果你写代码写错了,就要重新打孔,而且,人类根本读不懂。孔是相同的孔,你根本不知道这些孔代表什么意思。有些孔是用来表示数据的,有些孔是用来卡住齿轮,让纸带能传送的。
说实在的,我也没用过纸带,也没用过机器码,但是咱们学《汇编语言》的时候,书上说纸带的孔就是对应的机器码。汇编语言实际上不能算是一种语言,只能算是一种符号,比如用LOAD代表0000,用STORE代表0001。
那谁以明的汇编语言呢?是一个叫David Wheeler的人,他是世界上第一个获得计算机科学博士的人,这个人有一句话大家肯定听说过,我一会儿讲那句话。先说他是怎么发明的汇编,这个家伙是刚刚讲的EDSAC这台机器的程序员,或者叫打孔员。这个工作其实挺适合他的,因为他的家族就是干打孔的,给房子打孔,做装修的。他给纸带打孔也算是子承父业了。打孔的时候,他要记住0000,打4个洞,下一个是0001,那就打3个洞……这种工作做多了,手也麻。他就给这些固定的数字起了个名字,于是,汇编语言诞生了。
从这个角度来看,汇编语言根本不算是语言,就是一些代号。而且每种型号的电脑,有不同型号的机器码,因此也就有不同的汇编语言。我不清楚现在大学里还搞不搞汇编,当年我大学里学的是x86的汇编,我很喜欢这个语言,我至今记得,我用汇编来控制电脑的蜂鸣器,一运行就播放一首歌,算是汇编的大作业。有点烦,但是只要你喜欢,乐在其中。
再来说 David Wheeler那句著名的话,他说:在计算机科学中,没有什么功能是加一层不能解决的,如果还没解决,就再加一层。不愧是世界上第一个计算机科学的博士,这句话就是所有编程的真谛。如果你觉得目前不能解决问题,你就加一层,如果还不能解决,就再加一层。大家看看TCP/IP协议,7层。看看目前的编程语言,前端,有多少层了……一层一层又一层,最终,谁也搞不清自己在哪一层。于是,大家都在自己的那一层上,混吃混喝。
大家可以想一下,不止是计算机技术上如此。我们的社会也是如此,一层一层的,栋哥现在处于最底层,可能混一辈子,也没爬到上一层。随着钱增多,人家上层就分裂成了两层,于是我又下降了一层。大家看看大公司也是如此,没钱的时候,就是扁平化管理,有钱了以后,就有30多个层。
如果大家对OSI的七层协议有所了解,可能觉得现实中用不了七层,有的是4层,有的是5层,7层太麻烦了。这说明你不紧跟技术的发展潮流,大家打开Google,在里面输入Layer 8,就会看到现在已经在OSI的七层模型上,扩展了3层。第8层是用户,第9层是公司,第10层是国家。第9层协议解决的问题是,我们公司上班不允许摸鱼,请支持把摸鱼网站屏蔽了。第10层协议是国家,我们国家不允许上外网,请把外网屏蔽了。还是David Wheeler说的好啊“在计算机科学中,没有什么功能是加一层不能解决的,如果还没解决,就再加一层”,你看,加到第10层,啥问题都解决了。
汇编语言还是太不亲民了,那还有没有“现代”一点的语言呢?有的,就是人类历史上第一个“现代”编程语言——FORTRAN——语言。这个语言的意义不亚于十月革命的一声炮响。FORTRAN语言的全称是Formula Translating System,叫公式翻译系统。如果在汇编或者机器语言中,要写1+3的话,要写好几句。但是在FORTRAN中,就写1+3就行了,然后,这个叫“公式翻译系统”的语言,再把这个公式翻译成汇编语言。
这是一个巨大的进步,但是呢,总有些人觉得不舒服。为什么呢?当斯蒂芬森发明蒸汽机车以后,有人用有轨马车跑赢了它,并断言蒸汽机车没什么用。当富尔顿发明了第一艘轮船以后,也被当时的人力帆船轻松超越,他那艘船被人称之为“富尔顿的蠢物”。有一部分人类总是这样,认为自己做的才是最好的。
这种情况,在FORTRAN发明以后,又重复了一次。因为FORTRAN是把公式自动转化为汇编语言,在有些情况下,转化成的汇编语言没有人优化的那么好。可能是人天生骄傲吧,总觉得手工做的比机器做的好,像现在无论买什么东西,只要是说纯手工的,那就贵了一大截。我在电台里做过几期节目(123期-127期)讲冯诺伊曼,这个家伙和FORTRAN语言的发明者巴科斯极其不对付。两个人在技术上互相瞧不上,冯诺伊曼当年是IBM的顾问,多次要取消FORTRAN项目组。同样作为花花公子的巴科斯当然对冯诺伊曼设计的这种“垃圾架构”也非常的不感冒,他第一个提出了冯诺伊曼架构——今天我们用的大部分计算机都是这个架构——有巨大的问题,这个问题也被称之为“冯诺伊曼瓶颈”。为了解决这个问题,科学家采用了很多技术,比如分支预测,流水线技术以及L1,L2和L3缓存技术,给我们这些学生增加了不少负担。如果采用当年巴科斯的建议,彻底不要用冯诺伊曼的垃圾架构,也许会有其它问题,这都不好说。当然了,美国人,说话不留点情面,互相看不惯是常态。神仙打架,我们暂时不再追究了,等到我讲并行与分支预测的时候,还会请两位出来。
再来说手工,不少程序员也有这毛病,比如觉得用IDE写的代码,不如用VIM这种文本编辑器写的好。前些日子我看了一个宣传片,说茅台酒的,做酒的时候,要用“少女光脚踩曲”,这个不能叫纯手工,只能叫纯脚工了。再说了,宣传片上的根本不是少女,就是一些40多岁的中年女性,当然了,我并不是暗示少女的脚就比妇女的脚好。我只是认为,现代工业,至少应该想个办法,别用臭脚丫子了行不行?
FORTRAN语言目前仍然被广泛的应用,主要应用在科学领域,需要计算比较多的地方。像咱们不是科学家的人,几乎没可能接触到这个语言。原因是,在FORTRAN语言的那个年代,电脑的主要用途是计算,所以叫计算机,如果你把计算机之父图灵也好,FORTRAN语言的作者巴科斯也好,从天堂里喊过来,让他们看看他们发明的计算机,被后代的人用来干什么。也许,他们能惊讶的一屁股坐地上,半天起不来。
当年做电脑,就是为了计算,为了科学。现在人们用电脑,主要是用来看小姐姐露着屁股跳舞,或者在玩互相爆头的游戏。
清代邓汉仪《题息夫人庙》里有这样一句:“千古艰难惟一死”。这句话可以说是中华民族最高的智慧了,好死不如赖活着,只要活着,其它的,去TMD的,能当饭吃么?西方没那么怕死,他们更看重荣誉,所以西方人有源远流长的决斗史。美国的国父汉密尔顿就是决斗被人爆头了,更牛的是,他儿子也是决斗死的,父子两人是在同一样地方——新泽西州的威豪肯——相隔三年死于决斗。为什么决斗呢?为了荣誉,如果你不认同我的观点,又不想拉黑,那找个地方决斗吧, 美国国父汉密尔顿的决斗对手是美国副总统阿伦博尔。
今天,决斗的血腥与野蛮已经远去,而其中有关荣誉与高贵人格的部分,依旧在西方人的心目中活跃着。与大部分温文尔雅的编程大师不同,这个FORTRAN语言的作者比较火爆。这一点,在FORTRAN语言的作者身上能明显的显露出来,这不仅是一个技术非凡的人,而且是一个有高贵精神的贵族——当然了,如果仅说钱的话,他也算得上贵族,他爸爸是巨富。
如果你发明了FORTRAN语言,并且取得了如此巨大的成就,我们是不是可以做巡回演讲了?但是巴科斯并没有这样做,他发明FORTRAN以后,这个曾经的花花公子,变成了学术达人。他发现他可以把编程引入了一个危险的境地,所以,在余生里,他一直试图阻止他引起的这种编程风潮,虽然用处不大,但是一个人能否定自己的工作,并极力推荐别人的工作,我觉得这是非常大的勇气。
巴科斯发明了FORTRAN语言以后,他发现了他的编程语言与现存的冯诺伊曼架构都不是最优解。他写了论文,把编程分成两种,一种是值级编程,就是现在我们都在用的编程。另一种叫对象式编程——好吧,对象式编程后来这个名字被面向对象抢走了,从们只要又起了另外一个名字——函数式编程。
一般来说,冯·诺依曼程序都是值级的:在赋值语句右侧的表达式专一的关注建造接着要存储的一个值。这是我们99%的程序员每天都在做的事情。这种编程范式就是FORTRAN所引入的,就好像跑马拉松一样,领跑的人,一下子就跑错路了,结果后面的人都跟着跑错了。与之相对的,是基于Lambda演算的语言,他发明报FORTRAN以后,又马上发明了另一种语言叫FP(Functional Programming),这个语言是函数编程语言,但是没有FORTRAN成功,没什么人用。随后,他又发明了一个叫FL(Function Level)的语言,来推广函数式编程,仍然没有成功。
在他生命的后半段,他一直试图扭转由他引发的值级编程范式,但是值级编程范式这个巨石已经被他推下山坡了,越滚越快,几乎后来所有的编程语言——C/C++,Java,Python——都是值级编程。反而他晚年所推广的函数式编程,始终处于不温不火的状态,从Lisp语言到最近的Haskell,包括Java和Python都引入了lamda这样的函数编程的特征,仍然没有翻盘的迹象。
在他领取图灵奖的时候,他发表了一篇名为《Can Programming be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs》的论文,这篇论文有时被看作是他为发明了Fortran而致歉。这篇演讲可以很容易的搜到,希望大家看看。这篇论文后面的部分都是在讲函数式编程的思想。
如果你非常喜欢计算机相关的事情,读这么一篇论文,比读1000个计算机大牛写的公众号或者电台收获要大。真的不要认为你读不懂,我很早就发现了一个问题,知名的计算机科学家写的论文,除了图灵老先生写的我实在是读不下去,其它的人,写的都是很清晰的。越著名的人,写的文章越清晰,反而是一些自己也不太懂,去水论文的那种人,用中文写的,你一看题目就晕了。
虽然我吹了一波函数式编程,但是在接下来的节目里,我也是少有涉及,原因有两个:第一,函数式编程虽然很好,但是目前不是主流。第二,我经验不丰富。我写函数式编程最多的时候是读研究生的时候,给GIMP写插件,GIMP是一个开源的Photoshop吧,它的插件系统是用一种lisp方言写的,可以把它称之为类scheme方言。做那个项目,我最大的收获是:千万别无脑相信什么xxxx创新项目,有自主知识产权的项目,有可能这种项目就是两三个研究生,半年时间,边学边做边偷代码做出来的。毕业以后,几乎没再用过函数式编程。所以我怕说错了,鲁班门前弄大斧,让人笑死了。
接下来几期节目,主要是讲FORTRAN开创的值级编程时代,如果你不是主要学习的scheme,lisp或者Haskell语言,那基本上就是值级编程。
真是涨知识,谢谢D哥。
唉,看着文章这么难。
今天翻检公众号突然发现好久没看到“软件那些事”的更新了,点一下历史列表提示账号违规禁止跳转,一个个点历史推送文章,发现都被举报屏蔽了。
打开浏览器,谷歌搜索框输入 liu ting?yan!dong 拼出 刘延栋 从列表中找到看着像的点开,终于找到组织了,一篇篇看完