标签:避免 recursion tom 理论 机智 name 方式 开源 nis
原文出处: A Brief, Incomplete, and Mostly Wrong History of Programming Languages 译文出处: Mort Yao
警告:
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。
- Visual Basic 近年来吸收了函数式编程里的不少东西(不知道是不是因为受到了 F# 影响的缘故)。最典型的是它具备和 ML 相似的类型推断。
1980 - Alan Kay 创造了 Smalltalk 并发明了 “面向对象” 这个词。当被问到它的含义时,他回答道:“Smalltalk 程序本身就是对象。”当被问到对象是由 什么组成时,他回答到:“对象。”当再一次被问到这个问题时,他说“看,它从里到外都是对象。直到你抽出一只乌龟。”
- Smalltalk 的设计从很大程度上受到了 Logo 的影响。
1983 - 为了纪念伟大的先辈程序员 Ada Lovelace 那能够写出永远也无法被执行的代码的彪悍技能,Jean Ichbiah 和美国国防部创造了 Ada 语言。尽管缺乏证据显示有任何重要的 Ada 程序曾经被完成过,历史学家仍然确信 Ada 是个成功的公益项目,它让数 以千计的国防承包商免于沦落为与黑帮为伍。
- Ada 曾经是美国国防部指定的嵌入式计算机系统唯一开发语言,在其研发上耗资巨大。(国防承包商们于是不用靠贩卖军火给黑帮来维持生计了)
- 虽然有充分的证据显示 Ada 的整型范围溢出检查失败导致弄坏了欧空局的一枚 Ariane 5 运载火箭,不过美国国防部发言人对此表示:关我 P 事。
1983 - Bjarne Stroustrup 把他所听说过的一切都试图嫁接到 C 上,创造出了 C++。最后得到的语言是如此地复杂,以至于程序必须被送到未来去让 “天网” 人工智能 进行编译。编译时间难以容忍。天网开展这项服务的动机仍然不为人知,但来自未来的发言人说道:“没什么好担心的,宝贝。”带着一口奥地利腔的机械口音。有 一些来自坊间的推测,所谓的天网只不过是个自命不凡的缓冲区溢出而已。
- 这篇文章写出来的时候,一个被称作 C++0x 的新标准还遥遥无期。许多编译器对它的支持似乎永远停留在 “partial” 阶段。
- 请自行脑补终结者里的 T-800……
- 无论什么都改变不了 C/C++ 是个经典的 “缓冲区溢出语言” 的事实。
1986 - Brad Cox 和 Tom Love 创造了 Objective-C,宣称 “该语言完美地结合了 C 的内存安全性与 Smalltalk 的神奇效率”。现在的历史学家怀疑这两人其实是诵读障碍症患者。
“C 的内存安全性十分好”。
- Smalltalk 编译出来的程序以低效缓慢著称。
1987 - Larry Wall 在电脑前打了个盹,Larry Wall 的脑门子压到了键盘上。醒来之后,Larry Wall 深信 ,在 Larry Wall 的显示器上出现的神秘字符串并非是随机的,那是某种编程语言之程序样例的神谕。那必是上帝要他的先知,Larry Wall,去设计的。Perl 语言就此诞生了。
1990 - 一个由 Simon Peyton-Jones、Paul Hudak、Philip Wadler、Ashton Kutcher 和善待动物组织(PETA)组成的委员会创造了 Haskell,一种纯函数式的、非严求值的语言。Haskell 由于使用了 Monad 这种 较费解的概念来控制副作用而遭到了一些批评意见。Wadler 试图平息这些质疑,他解释说:“一个单子(Monad)说白了不过就是自函子范畴上的一个幺 半群而已,这有什么难以理解的?”
- 素食主义鼓吹者:为了获取食物而不必要地杀死动物是邪恶的;“纯函数式编程” 鼓吹者:为了编程而引入不必要的副作用是邪恶的。
- (科普帖)自函子说穿了就是把一个范畴映射到自身的函子,自函子范畴说穿了就是从小范畴映射到自身的函子所构成的以自函子为对象以自然变换为态射 的范畴,幺半群说穿了就是只有单个对象的范畴,给定了一个幺半群则可构造出一个仅有单个对象的小范畴使其态射由幺半群的元素给出而合成由幺半群的运算给 出,而单子说穿了就是自函子范畴上的这样一个幺半群。(这都不理解么亲连这种最基本的概念都不理解还学什么编程!)
- 又:“A monad is a monoid in the category of endofunctors(一个单子是自函子范畴上的一个幺半群)” 这句话的原出处据信是 Mac Lane 的这本书:
1991 - 荷兰程序员 Guido van Rossum 为了一次神秘的手术而进行了一次阿根廷之旅。回来后他带着一个巨大的颅疤,发明了 Python,而被数以军团计的追随者们加冕为 “终生大独裁 者”,并向全世界宣布 “要办到一件事情,只可有唯一的一种方法!”。整个波兰陷入了恐慌。
- BDFL(Benevolent Dictator for Life):开源社区一种流行的说法,“仁慈的” 终生大独裁者。这个说法最早指的就是 Guido van Rossum。
- 希特勒在提出建立 “纯正的雅利安人国家”“统一的大德意志帝国” 并实现了德奥合并之后,翌年便入侵了波兰,引发了第二次世界大战。“我一个人征服了整个欧洲!”
(感觉好棒好棒的)
1995 - 在家门口附近的一个意大利饭馆用餐时,Rasmus Lerdorf 意识到他吃的那盘意面正好是一个用来理解 WWW 万维网的极好模型,而所有的 Web 应用都应该仿照它们的媒介那样去做。在他的餐巾的背后,他 设计出了著名的 “可编程超链接 Pasta(Programmable Hyperlinked Pasta,PHP)” 语言。PHP 的文档至今仍然保留在那片餐巾上。
- PHP 最显著的特点就是:代码是可以直接嵌在 HTML 文档中的。
1995 - 松本 “Mad Matz” 行弘创造出了 Ruby 语言,用来辟谣一些意味不明的、有关澳洲将会变成一片由莫霍克族战士和 Tina Turner 统治的荒漠的末世预言。该语言后来被它的真正发明者 David Heinemeier Hansson 重新命名为 Ruby on Rails。(关于某个叫松本行弘的人发明了一种叫做 Ruby 的语言这件事情从未发生过,最好在这篇文章的下一个版本中删掉。 - DHH 表示)
- 最早关于 Ruby 的国际会议不是 RubyConf,而是每年在澳大利亚举办的 OSDConf。
- 这里应该是在吐槽 Ruby 的杀手级应用 Ruby on Rails 实在太有名了,以至于超越了原来的 Ruby 语言本身。
- Matz 并没有为 “Ruby” 这个名字注册商标——本着开源的黑客精神。
- 而 DHH(RoR 的作者)却把 “Ruby on Rails” 这个(包含了 “Ruby” 字样的)名称注册成了商标,并且阻止别人未经授权使用 “Rails” 这个名字。
- (虽然抢注商标对开源来说未必是一件坏事情——Python 基金会今年在欧洲还卷入了一场商标之争了不是)
- 假如你从来没听说过的话,莫霍克族战士据说是像这个样子的:
1995 - Brendan Eich 读完了历史上所有在程序语言设计中曾经出现过的错误,自己又发明了一些更多的错误,然后用它们创造出了 LiveScript。之后,为了紧跟 Java 语言的时髦潮流,它被重新命名为 JavaScript。再然后,为了追随一种皮肤病的时髦潮流,这语言又被命名为 ECMAScript。
- WAT!https://www.destroyallsoftware.com/talks/wat
- JavaScript 和 Java 语言没有任何实质上的联系;就像 ECMAScript 和 Eczema(湿疹)没有任何实质上的联系一样。 (Brendan Eich 曾表示:“ECMAScript was always an unwanted trade name that sounds like a skin disease.”)
- 但很多人觉得其实 JavaScript 设计中包含的错误还不够多,本着为程序语言的设计贡献更多错误这样的目的,他们群策群力创造出了更多的、JavaScript 中未曾成功涵盖的错误。这儿有一个五花八门的列表,以供有志于为程序语言设计的谬误史添砖加瓦的人们参考。
1996 - James Gosling 发明了 Java。Java 是一个相对繁冗的、带垃圾收集的、基于类的、静态类型的、单分派的面向对象语言,拥有单实现继承和多接口继承。Sun 不遗余力地宣传着 Java 的独一无二不同凡响之处。
2001 - Anders Hejlsberg 发明了 C#。C# 是一个相对繁冗的、带垃圾收集的、基于类的、静态类型的、单分派的面向对象语言,拥有单实现继承和多接口继承。微软不遗余力地宣传着 C# 的独一无二不同凡响之处。
2003 - 一个叫 Martin Odersky 的醉汉看见了好时瑞森花生酱杯的广告,展示了某个人的花生酱倒入另一个人的巧克力的场景,他忽然有了个点子。他创造了 Scala,一种结合 了面向对象和函数式编程的语言。这同时激怒了两个阵营的忠实信徒,他们立刻宣布要发动圣战烧死异教徒。
(原文请戳:http://james-iry.blogspot.co.at/2009/05/brief-incomplete-and-mostly-wrong.html)
- 补充:原文的评论中有人尖锐地指出,开头提到的 Jacquard 可编程织布机不但支持并发(concurrency),而且是一个典型的多线程 (multi-threaded)的例子。如你所见,它确实通过良好的同步机制避免了多个 thread 间产生竞争条件导致死锁,其实可以看作是现代操作系 统最早的雏形。(目测此项科技树成果已突破天际)
《编程语言伪简史》
标签:避免 recursion tom 理论 机智 name 方式 开源 nis
原文地址:https://www.cnblogs.com/cx2016/p/13299667.html