马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不二如是 于 2018-2-2 23:02 编辑
现代编程语言的祖先
1801 —— Joseph Marie Jacquard 用打孔卡为一台织布机编写指令,在挂毯上织出了“hello, world”字样。
当时的reddit网友对这项工作的反响并不热烈,因为它既缺少尾递归调用,又不支持并发,而且甚至都没有注意在拼写时恰当地区分大小写。
Jacquard织布机是第一台可进行程序控制的织布机。
用打孔卡进行编程的概念,直到电子计算机被发明出来之后仍然被广泛运用。
最早的Hello World程序(出自K&R C)打印的是全小写的字符串:"hello, world"。
在许多英文技术社区里,不正确地使用大小写发贴会被视作是小白的行为。
(如把“Python”拼作“python”,把“FreeBSD”拼作“freebsd”,把“Qt”拼作“QT”)
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。
现代编程语言
1957 —— John Backus 和 IBM 发明了 FORTRAN (FORmula TRANslator)语言。
关于IBM 或 FORTRAN 并没有什么特别好笑的地方。
除了,写 FORTRAN程序的时候不系蓝领带将被编译器视作是一个 syntax error。
早期FORTRAN(FORTRAN 77)对程序书写格式的要求那是相当严格。
1958 —— John McCarthy (和Paul Graham)发明了LISP。
由于冷战期间的战略括号资源储备所造成的巨大成本,LISP从未流行过。
尽管欠缺足够的流行度,LISP(现在叫做 “Lisp”,有时叫“Arc”)仍然被视作一门有影响力的语言。
在关键的算法思想诸如递归(recursion)和提升逼格 (condescension)上尤为典范。
幸运的是对于计算机科学来说,花括号和尖括号的供应尚充足。“关键的算法思想”这一说法来自于Verity Stob的 Catch as catch can。
LISP发明的那一年Paul Graham其实还没有出生。
据说是因为某本叫做 Haste 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语言以代码极其冗长和通篇大写字母的书写风格而闻名。
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”。
John Kemeny(左),Thomas Kurtz(右)
1964 —— John Kemeny 和 Thomas Kurtz 创造了BASIC,一个为非计算机科学家设计的非结构化的程序语言。
调侃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真是极先进的……
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类型理论是在吐槽神马……
1980 —— Alan Kay 创造了 Smalltalk 并发明了“面向对象”这个词。
当被问到它的含义时,他回答道:
当被问到对象是由 什么组成时,他回答到:
当再一次被问到这个问题时,他说
“看,它从里到外都是对象。直到你抽出一只乌龟。”
Smalltalk的设计从很大程度上受到了Logo的影响。
这门语言在70年代初期就诞生了,但公开可用的第一版是Smalltalk-80 Version 1。
1983 —— 为了纪念伟大的先辈程序员 Ada Lovelace。
那能够写出永远也无法被执行的代码的彪悍技能。
Jean Ichbiah 和美国国防部创造了 Ada语言。
尽管缺乏证据显示有任何重要的Ada程序曾经被完成过,历史学家仍然确信Ada是个成功的公益项目。
它让数以千计的国防承包商免于沦落为与黑帮为伍。
Ada 曾经是美国国防部指定的嵌入式计算机系统唯一开发语言,在其研发上耗资巨大。
(国防承包商们于是不用靠贩卖军火给黑帮来维持生计了。)
虽然有充分的证据显示:
Ada的整型范围溢出检查失败导致弄坏了欧空局的一枚Ariane 5 运载火箭,不过美国国防部发言人对此表示:关我P事。
1983 —— Bjarne Stroustrup把他所听说过的一切都试图嫁接到C上:
创造出了C++
最后得到的语言是如此地复杂,以至于程序必须被送到未来去让“天网”人工智能进行编译。
编译时间难以容忍。
天网开展这项服务的动机仍然不为人知,但来自未来的发言人说道:
“没什么好担心的,宝贝。”
带着一口奥地利腔的机械口音。
有 一些来自坊间的推测,所谓的天网只不过是个自命不凡的缓冲区溢出而已。
无论什么都改变不了C/C++是个经典的“缓冲区溢出语言”的事实。
1986 —— Brad Cox 和 Tom Love 创造了Objective-C,宣称:
“该语言完美地结合了 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)说白了不过就是自函子范畴上的一个幺半群而已,这有什么难以理解的?”
素食主义鼓吹者:为了获取食物而不必要地杀死动物是邪恶的;
“纯函数式编程”鼓吹者:为了编程而引入不必要的副作用是邪恶的。
自函子说穿了就是把一个范畴映射到自身的函子,自函子范畴说穿了就是从小范畴映射到自身的函子所构成的以自函子为对象以自然变换为态射的范畴,幺半群说穿了就是只有单个对象的范畴,给定了一个幺半群则可构造出一个仅有单个对象的小范畴使其态射由幺半群的元素给出而合成由幺半群的运算给 出,而单子说穿了就是自函子范畴上的这样一个幺半群。
(这都不理解么亲连这种最基本的概念都不理解还学什么编程!)
1991 —— 荷兰程序员 Guido van Rossum 为了一次神秘的手术而进行了一次阿根廷之旅。
而被数以军团计的追随者们加冕为“终生大独裁者”,并向全世界宣布:
“要办到一件事情,只可有唯一的一种方法!”
整个波兰陷入了恐慌。
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 的国际会议不是 RubyConf,而是每年在澳大利亚举办的OSDConf。
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是一个相对繁冗的、带垃圾收集的、基于类的、静态类型的、单分派的面向对象语言,拥有单实现继承和多接口继承。
太经典不说了。。。
2001 —— Anders Hejlsberg 发明了 C# 。
C#是一个相对繁冗的、带垃圾收集的、基于类的、静态类型的、单分派的面向对象语言,拥有单实现继承和多接口继承。
微软不遗余力地宣传着C#的独一无二不同凡响之处。
2003 —— 一个叫 Martin Odersky 的醉汉看见了好时瑞森花生酱杯的广告。
展示了某个人的花生酱倒入另一个人的巧克力的场景,他忽然有了个点子。
他创造了 Scala ,一种结合了面向对象和函数式编程的语言。
这同时激怒了两个阵营的忠实信徒,他们立刻宣布要发动圣战烧死异教徒。
未完待续
|