- 警告:原文中的内容不一定都是真实的。
- 警告:小字部分不属于原文,是翻译君为了便于读者读懂原文擅自所加的注解。当然,也不能保证一定都是真实的。
- 为了照顾那些幽默感退化的人们,维基百科有一个主题关于:History of programming languages。
1801 - Joseph Marie Jacquard用打孔卡为一台织布机编写指令,在挂毯上织出了“hello, world”字样。当时的reddit网友对这项工作的反响并不热烈,因为它既缺少尾递归调用,又不支持并发,而且甚至都没有注意在拼写时恰当地区分大小写。
- Jacquard织布机是第一台可进行程序控制的织布机。用打孔卡进行编程的概念,直到电子计算机被发明出来之后仍然被广泛运用。
- 最早的Hello World程序(出自K&R C)打印的是全小写的字符串:
"hello, world"
。 - 在许多英文技术社区里,不正确地使用大小写发贴会被视作是小白的行为。(如把“Python”拼作“python”,把“FreeBSD”拼作“freebsd”,把“Qt”拼作“QT”)
- reddit / Hacker News的月经帖标题:“.*: a new .*-based .* programming language”。底下常见的回帖形式:“它支持并发吗?”“没有尾调用优化果断差评。”“现在的编程语言已经足够多了,为什么我们还需要更多的语言?”……
1842 - Ada Lovelace写了世界上第一个程序。她的努力只遇到了一点点小小的麻烦,那就是:实际上并没有任何计算机能够用来运行她的程序。后来的企业架构师们重新吸收了她的这个技能,用来学习如何更好地使用UML进行编程。
- Ada Lovelace为Charles Babbage的分析机写了一个计算伯努利数的算法实现,因此被后世公认为是世界上第一个程序员。实际上,分析机由于其设计思想过于先进,在当时根本没有被制造出来。(Babbage的分析机一般被认为是现代电子通用计算机的先驱)
- 讽刺现在的某些“软件架构师”顶多只会纸上谈兵地画画UML。
1936 - Alan Turing发明了世间一切程序语言的最终形态,但很快他就被英国军情六处“请”去当007了,以至于他根本来不及为这些语言申请专利。
- 与通用图灵机(Universal Turing machine)等价的语言被称为图灵完备的(Turing completeness),它定义了“什么样的语言可以被称作是程序语言”。
- 二战期间Turing曾秘密地为英国军方工作,破解德军的Enigma密码机,并在战后被授予大英帝国勋章。但这项事实直到多年以后才向公众公开。
1936 - Alonzo Church同时也发明了世间一切程序语言的最终形态,甚至做得更好。但他的λ演算被绝大部分人忽视了,因为它与C语言“不够像”。尽管存在着这样的批评,但事实上,C在当时还没有被发明出来。
- Church是Turing在Princeton的博士生导师,他在λ演算方面的工作先于Turing指出了不存在一个对可判定性问题的通用解法,这后来证明和Turing针对停机问题提出的图灵机模型是等价的。即著名的Church-Turing论题。
- 说Church“甚至做得更好”,因为λ演算为后世所有的函数式语言提供了理论基础。
- 现在一种常见的关于函数式编程的批评就是:“它们与C语言不够像”。
1940年代 - 一些直接采用布线和开关来进行程序控制的“计算机”出现了。工程师们当时这么做,据说是为了避开“用空格还是用制表符缩进”这样的论战。
- 据说当时负责设计ENIAC的工程师中间曾经发生过这样的争论:
- 空格比制表符好。
- 制表符比空格好。
- 4个空格比8个空格好。
- 什么?用2个空格的统统烧死。
- 关于这台具有里程碑意义的人类史上第一台电子计算机ENIAC上应该预装何种编辑器,工程师们还发生过这样的争吵:
- Vim比Emacs好!
- Emacs比Vim好!
- 强烈推荐Sublime Text。
- 你丫用编辑器的都是找虐,IDE才是王道。
- 没错,要用就用世界上最好的公司微软开发出来的世界上最好的IDE:Visual Studio。
- 我早就看透了无谓的编辑器论战什么的了,我要告诉楼上吵架的,你们全都是傻逼!
- 最后,工程师们一致决定使用布线和开关来为他们即将发明的计算机进行编程,机智地避开了所有这些无谓的争吵,最终齐心协力创造出了人类历史上第一台电子计算机:ENIAC。(鼓掌
- (图:两位ENIAC程序员在运用敏捷开发方法进行愉快的结对编程。“自从抛弃伴随我多年的Emacs和HHKB Pro、改用布线和开关进行编程之后,我的左手小指麻痹奇迹般地痊愈了。”其中一位接受采访时如是说。另一位则表示:“新的编程方式让曾经专注颈椎病20年的我得到了彻底的康复,不用再整天盯着显示屏,身心同时得到了极大的放松,值得大力推广!”)
1957 - John Backus和IBM发明了FORTRAN语言。关于IBM或FORTRAN并没有什么特别好笑的地方。除了,写FORTRAN程序的时候不系蓝领带将被编译器视作是一个syntax error。
- 蓝领带、白衬衫、深色西装似乎是IBM公司20世纪经典的dress code。
- 早期FORTRAN(FORTRAN 77)对程序书写格式的要求那是相当严格。(例如,蛋疼的固定格式缩进)
1958 - John McCarthy和Paul Graham发明了LISP。由于冷战期间的战略括号资源储备所造成的巨大成本,LISP从未流行过。尽管欠缺足够的流行度,LISP(现在叫做“Lisp”,有时叫“Arc”)仍然被视作一门有影响力的语言,在关键的算法思想诸如递归(recursion)和提升逼格(condescension)上尤为典范。
(原文的脚注:
-
幸运的是对于计算机科学来说,花括号和尖括号的供应尚充足。
-
“关键的算法思想”这一说法来自于Verity Stob的Catch as catch can。)
- 战略括号储备:据信是因为克格勃对于他们费尽千辛万苦搜集到的程序片段全都是括号感到极端愤怒,于是封锁了世界各地的括号矿产资源,导致白宫方面不得不加强战略浓缩括号的储备。(误
- LISP发明的那一年Paul Graham其实还没有出生。据说是因为某本叫做《Ha
ste and Waste》的伪程装黑圣典实在太有名了,以至于许多编程小白们把写这本书的传奇人物同Lisp之间画上了等号。 - 提升逼格确实是一种与递归调用同样关键的算法思想。嗯,你懂的。
1959 - 在输掉了和L. Ron Hubbard之间的一场打赌之后,Grace Hopper和其他几个抖S发明了所谓的“面向Boilerplate的全大写化语言(Capitalization Of Boilerplate Oriented Language,COBOL)”。多年以后,由于一些被误导的、性别歧视主义者对Adm. Hopper关于COBOL的工作的报复,在Ruby技术会议上不时会看到一些厌女主义乃至仇视女性的材料出现。
- L. Ron Hubbard是山达基教(Scientology)的创始人,二战期间曾与Grace Hopper同样供职于美国海军。(尚不清楚这两人之间有无其他联系)
- COBOL语言以代码极其冗长和通篇大写字母的书写风格而闻名。
- Adm. Hopper:Grace Murray Hopper女士的军衔是Rear Admiral Lower Half,即美国海军准将。
- Ruby技术会议与性别歧视:在09年的GoGaRuCo会议上,有人做了一场题为“CouchDB perform like a pr0n star”的报告,幻灯片演示中使用了大量色情材料,引起了在场的少数女性观众的极大不适(“This was a national conference, not a gathering of teenager boys in a smelly upstairs bedroom!”)。会后,DHH(Ruby on Rails的作者)发推表示“it's "absolutely" appropriate to use porn in a business presentation”。关于其他更多技术会议上出现的性别歧视事件,参见这里。
1964 - John Kemeny和Thomas Kurtz创造了BASIC,一个为非计算机科学家设计的非结构化的程序语言。
1965 - Kemeny和Kurtz两人goto
到了1964。
- 调侃BASIC语言对行号和
goto
的无节制滥用。
1970 - Guy Steele和Gerald Sussman创造了Scheme。他们的工作导致了一系列以《Lambda之究极(Lambda the Ultimate)……》为标题开头的论文发表,并在《Lambda之究极厨房神器》这一篇中达到了最高潮。以这篇论文为基础,开始了一个长年累月的、收视率究极失败的晚间电视购物节目。Lambda们因为其概念相对难以理解而被大众所忽视,直到未来的某一天,Java语言终于让它们变得有名了起来。通过不包含它们这件事情。
- Lambda之究极神器系列:(Lambda之究极命令式编程、Lambda之究极宣告式编程、Lambda之究极GOTO语句、Lambda之究极Opcode)
- Guy Lewis Steele, Jr. and Gerald Jay Sussman. "Lambda: The Ultimate Imperative"). MIT AI Lab. AI Lab Memo AIM-353. March 1976.
- Guy Lewis Steele, Jr.. "Lambda: The Ultimate Declarative". MIT AI Lab. AI Lab Memo AIM-379. November 1976.
- Guy Lewis Steele, Jr.. "Debunking the 'Expensive Procedure Call' Myth, or, Procedure Call Implementations Considered Harmful, or, Lambda: The Ultimate GOTO". MIT AI Lab. AI Lab Memo AIM-443. October 1977.
- Guy Lewis Steele, Jr. and Gerald Jay Sussman. "Design of LISP-based Processors, or SCHEME: A Dielectric LISP, or Finite Memories Considered Harmful, or LAMBDA: The Ultimate Opcode". MIT AI Lab. AI Lab Memo AIM-514. March 1979.
- 后来大概有人觉得每次都投一篇正式的paper太麻烦了,于是干脆专门开了一个博客,名字就叫做Lambda the Ultimate。这样他们将来要发《Lambda之究极割草机》《Lambda之究极厕所皮拔子》这样的营销广告就更加方便了。
- 长年累月的收视率究极失败的晚间电视购物节目:也许是在暗讽MIT专注用SICP作为教给CS学生的第一门编程课20余年。
- 众Java程序员:听说Java 8要开始支持lambda了,想来Java真是极先进的……等一下,我先看看lambda是个啥玩意?
- 于是lambda这个“新鲜货”就一下子在主流业界变得流行起来了。
1970 - Niklaus Wirth创造了Pascal,一个过程式的语言。很快就有人开始声讨Pascal,因为它使用了类似“x := x + y
”这样的语法,而不是更为人熟知的类C语法“x = x + y
”。尽管存在着这样的批评,而事实上当时C还没有被发明出来。
1972 - Dennis Ritchie发明了一把射击时能同时向前和向后两个方向发射子弹的绝世好枪。但他对此发明造成的致死和终身残疾数量感到还不够满意,所以他又发明了C语言和Unix。
- 翻译君:……
1972 - Alain Colmerauer设计了逻辑编程语言Prolog。他的目标是创造一个具有两岁小孩智商的程序语言。为了证明他成功达到了这个目标,他展示了一个Prolog程序,它对于每条查询都会机智地给出相同的回答:“No”。
1973 - Robin Milner创造了ML,一个建立在M&M类型理论基础上的语言。由ML衍生而来的SML加上了一套形式语义的规范。当被要求给这个形式语义本身书写一套形式语义时,Milner的脑子爆掉了。其他ML家族的著名语言还包括OCaml,F#,和,Visual Basic。
- SML的形式语义规范事实上被写成了这样一本书(SML'97):《The Definition Of Standard ML》。
- ML明显是建立在H-M(Hindley–Milner)类型推断的基础上的,不太清楚原文所说的M&M类型理论是在吐槽神马……
- Visual Basic近年来吸收了函数式编程里的不少东西(不知道是不是因为受到了F#影响的缘故)。最典型的是它具备和ML相似的类型推断。