1940年之前:面向机器html
机器语言由机器直接执行,速度快,但一个很明显的缺点就是:写起来实在是太困难了,一旦你发现本身 写错了,改起来更蛋疼!这样直接致使程序编写效率十分低下,编写程序花费的时间每每是实际运行时间 的几十倍或几百倍。
有一个关于机器语言和比尔盖茨的笑话,是说比尔盖茨拿着绣花针在一张光盘上戳,把 Windows 给戳出 来了!但若是真的让你去戳,不要说 Windows,连一个简单的“Hello world”都要让人戳到眼睛冒烟!程序员
因为机器语言实在是太难编写了,因而就发展出了汇编语言。汇编语言亦称符号语言,用助记符代替机器 指令的操做码,用地址符号(Symbol)或标号(Label)代替指令或操做数的地址,。汇编语言因为是采用 了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在必定程度上简化了编程过程。例如 使用 LOAD 来代替 0000,使用 STORE 来代替 0001。算法
即便汇编语言相比机器语言提高了可读性,但其本质上仍是一种面向机器的语言,编写一样困难,也很容 易出错。相信不少计算机毕业的学生至今都对学校的汇编课程中的练习程序心有余悸。 数据库
面向机器的语言一般状况下被认为是一种“低级语言”,为了解决面向机器的语言存在的问题,计算机科 学的前辈们又建立了面向过程的语言。面向过程的语言被认为是一种“高级语言”,相比面向机器的语言 来讲,面向过程的语言已经再也不关注机器自己的操做指令、存储等方面,而是关注如何一步一步的解决具体的问题,即:解决问题的过程,这应该也是面向过程说法的来由。编程
相比面向机器的思想来讲,面向过程是一次思想上的飞跃,将程序员从复杂的机器操做和运行的细节中解 放出来,转而关注具体须要解决的问题;面向过程的语言也再也不须要和具体的机器绑定,从而具有了移植 性和通用性;面向过程的语言自己也更加容易编写和维护。这些因素叠加起来,大大减轻了程序员的负担, 提高了程序员的工做效率,从而促进了软件行业的快速发展。小程序
典型的面向过程的语言有:COBOL、FORTRAN、BASIC、C 语言等。安全
第一次软件危机:结构化程序设计网络
根本缘由就是一些面向过程语言中的goto语句致使的面条式代码,极大的限制了程序的规模。结构化程序设计(英语:Structured programming),一种编程范型。它采用子程序(函数就是一种子程序)、代码区块、for循环以及while循环等结构,来替换传统的goto。但愿借此来改善计算机程序的明晰性、质量以及开发时间,而且避免写出面条式代码。dom
随着计算机硬件的飞速发展,以及应用复杂度愈来愈高,软件规模愈来愈大,原有的程序开发方式已经越 来越不能知足需求了。1960 年代中期开始爆发了第一次软件危机,典型表现有软件质量低下、项目没法 如期完成、项目严重超支等,由于软件而致使的重大事故时有发生。例如 1963 年美国 (http://en.wikipedia.org/wiki/Mariner_1) 的水手一号火箭发射失败事故,就是由于一行 FORTRAN 代码 错误致使的。编程语言
软件危机最典型的例子莫过于 IBM 的 System/360 的操做系统开发。佛瑞德·布鲁克斯(Frederick P. Brooks, Jr.)做为项目主管,率领 2000 多个程序员夜以继日的工做,共计花费了 5000 人一年的工做量,写出将 近 100 万行的源码,总共投入 5 亿美圆,是美国的“曼哈顿”原子弹计划投入的 1/4。尽管投入如此巨大, 但项目进度却一再延迟,软件质量也得不到保障。布鲁克斯后来基于这个项目经验而总结的《人月神话》 一书,成了史上最畅销的软件工程书籍。
为了解决问题,在 196八、1969 年连续召开两次著名的 NATO 会议,会议正式创造了“软件危机”一词, 并提出了针对性的解决方法“软件工程”。虽然“软件工程”提出以后也曾被视为软件领域的银弹,但后 来事实证实,软件工程一样没法解决软件危机。
差很少同一时间,“结构化程序设计”做为另一种解决软件危机的方案被提出来了。 Edsger Dijkstra 于 1968 发表了著名的《GOTO 有害论》的论文,引发了长达数年的论战,并由此产生告终构化程序设计方 法。同时,第一个结构化的程序语言 Pascal 也在此时诞生,并迅速流行起来。
结构化程序设计的主要特色是抛弃 goto 语句,采起“自顶向下、逐步细化、模块化”的指导思想。结构 化程序设计本质上仍是一种面向过程的设计思想,但经过“自顶向下、逐步细化、模块化”的方法,将软 件的复杂度控制在必定范围内,从而从总体上下降了软件开发的复杂度。结构化程序方法成为了 1970 年 代软件开发的潮流。
科学研究证实,人脑存在人类短时间记忆通常一次只能记住 5-9 个事物,这就是著名的 7+- 2 原理。结构化 程序设计是面向过程设计思想的一个改进,使得软件开发更加符合人类思惟的 7+-2 特色。
第二次软件危机:面向对象程序设计
结构化编程的风靡在必定程度上缓解了软件危机,然而好景不长,随着硬件的快速发展,业务需求愈来愈
复杂,以及编程应用领域愈来愈普遍,第二次软件危机很快就到来了。
第二次软件危机的根本缘由仍是在于软件生产力远远跟不上硬件和业务的发展,相比第一次软件危机主要 体如今“复杂性”,第二次软件危机主要体如今“可扩展性”、“可维护性”上面。传统的面向过程(包括 结构化程序设计)方法已经愈来愈不能适应快速多变的业务需求了,软件领域迫切但愿找到新的银弹来解 决软件危机,在这种背景下,面向对象的思想开始流行起来。
面向对象的思想并非在第二次软件危机后才出现的,早在 1967 年的 Simula 语言中就开始提出来了,但 第二次软件危机促进了面向对象的发展。 面向对象真正开始流行是在 1980s 年代,主要得益于 C++的功 劳,后来的 Java、C#把面向对象推向了新的高峰。到如今为止,面向对象已经成为了主流的开发思想。
虽然面向对象开始也被当作解决软件危机的银弹,但事实证实,和软件工程同样,面向对象也不是银弹, 而只是一种新的软件方法而已。
虽然面向对象并非解决软件危机的银弹,但和面向过程相比,面向对象的思想更加贴近人类思惟的特色, 更加脱离机器思惟,是一次软件设计思想上的飞跃。
第一个编程语言比现代的计算机还早诞生。首先,这种语言是种编码(en:code)。
于1801年发明的提花织布机(或称甲卡提花织布机),运用打孔卡上的坑洞来表明缝纫织布机的手臂动做,以便自动化产生装饰的图案。
爱达·勒芙蕾丝在1842年至1843年间花费了九个月,将意大利数学家Luigi Menabrea关于查尔斯·巴贝奇新发表机器分析机的回忆录翻译完成。她于那篇文章后面附加了一个用分析机计算伯努利数方法的细节,被部分历史学家认为是世界上第一个电脑程序。
Herman Hollerith在观察列车长对乘客票根在特定位置打洞的方式后,意识到他能够把信息编码记载到打孔卡上,随后根据这项发现使用打孔卡来编码并纪录1890年的人口统计数据。
第一个计算机代码是针对他们的应用面设计的。在20世纪的前十年主要是用十进制来算数,后来人们发现不仅是用文字,也能够用数字来表现逻辑。举例来讲,阿隆佐·邱奇曾以公式化(formulaic)的方式表达λ演算。图灵机是一种纸带标记(tape-marking)机器(就像电话公司用的那种)操做方法抽象化后的集合。图灵机这种经过有限数字(finite number)呈现机器的方式,奠基了程序如同冯·诺伊曼结构计算机中的数据同样地存储的基础。但不一样于λ演算,图灵机的代码并无办法成为高级编程语言的基石,这是是由于它主要的用途是分析算法的复杂度。
就像许多历史上的"第一次"同样,第一个现代编程语言也很难界定。最一开始是由于硬件限制而限定了语言,打孔卡容许80行(column)的长度,但某几行必须用来记录卡片的顺序。FORTRAN则归入了一些与英文字词相同的关键字,像是"IF"、"GOTO"(原字词为go to),以及"CONTINUE"。以后采用磁鼓(magnetic drum)做为存储器使用,也表明计算机程序也必须插入(interleave)到磁鼓的转动(rotation)中。和现今比较起来,这也让编程语言必须更加依赖硬件(hardware-dependent)。
对部分的人认为必须在"编程语言"的状态确立以前,根据能力(power)以及可读性(human-readability)的程度来决定历史上第一个编程语言是什么语言。提花织布机和查尔斯·巴贝奇所制做的差分机(en:Difference Engine)都具有在大量限制下,简单描述机器应运行行为的语言。也有种并不是设计给人类运用的受限特定领域语言(en:domain-specific language),是将打孔卡运用到自动演奏钢琴(en:player piano)上。
1940年代:
最先被确认的现代化、电力引导(electrically powered)的计算机约在1940年代被创造出来。程序员在有限的速度及存储器容量限制之下,撰写人工调整(hand tuned)过的汇编语言程序。并且很快就发现到使用汇编语言的这种撰写方式须要花费大量的脑力(intellectual effort)并且很容易出错(error-prone)。
康拉德·楚泽于1948年发表了他所设计的Plankalkül编程语言的论文[1]。可是在他有生之年却未能将该语言实现,而他本来的贡献也被其余的发展所孤立。
在这段期间被开发出来的重要语言包括有:
1950与1960年代:
有三个现代编程语言于1950年代被设计出来,这三者所派生的语言直到今日仍旧普遍地被采用:
另外一个1950年代晚期的里程碑是由美国与欧洲计算机学者针对"算法的新语言"所组成的委员会出版的ALGOL 60报告(名称取自"ALGOrithmic Language"(算法语言))。这份报告强化了当时许多关于计算的想法,并提出了两个语言上的创新功能:
另外一个创新则是关于语言的描述方式:
Algol 60对以后语言的设计上带来了特殊的影响,部分的语言很快的就被普遍采用。后续为了开发Algol的扩充子集合,设计了一个名为Burroughs(en:Burroughs large systems)的大型系统。
延续Algol的关键构想所产生的成果就是ALGOL 68:
Algol 68一些较少被使用到的语言功能(如同步与并行区块)、语法快捷方式的复杂系统,以及类型自动强制转换(coercions),使得实现者兴趣缺缺,也让Algol 68得到了很难用(diffcult)的名声。尼克劳斯·维尔特就干脆离开该设计委员会,另外再开发出更简单的Pascal语言。
在这段期间被开发出来的重要语言包括有:
1967-1978:确立了基础范式
1960年代晚期至1970年代晚期的期间中,编程语言的发展也有了重大的成果。大多数如今所使用的主要语言范式都是在这段期间中发明的:
这些语言都各自演展出本身的家族分支,现今多数现代编程语言的祖先均可以追溯他们其中至少一个以上。
在1960年代以及1970年代中结构化程序设计的优势也带来许多的争议,特别是在程序开发的过程当中彻底不使用GOTO。这项争议跟语言自己的设计很是有关系:某些语言并无包含GOTO,这也强迫程序员必须结构化地编写程序。尽管这个争议在当时吵翻了天,但几乎全部的程序员都赞成就算语言自己有提供GOTO的功能,在除了少数罕见的状况下去使用GOTO是种不良的程序风格。结果是以后世代的编程语言设计者发觉到结构化编程语言的争议实在既乏味又使人眼花撩乱。
在这段期间被开发出来的重要语言包括有:
1980年代:加强、模块、性能
1980年代的编程语言与以前相较显得更为强大。C++合并了面向对象以及系统程序设计。美国政府标准化一种名为Ada的系统编程语言并提供给国防承包商使用。日本以及其余地方运用了大量的资金对采用逻辑编程语言结构的第五代语言进行研究。函数编程语言社区则把焦点转移到标准化ML及Lisp身上。这些活动都不是在开发新的范式,而是在将上个世代发明的构想进一步发扬光大。
然而,在语言设计上有个重大的新趋势,就是研究运用模块或大型组织化的程序单元来进行大型系统的开发。Modula、Ada,以及ML都在1980年代发展出值得注意的模块化系统。模块化系统常拘泥于采用泛型程序设计结构:泛型存在(generics being)、本质(essence),参数化模块(parameterized modules)。(参阅多态)
尽管没有出现新的主要编程语言范式,许多研究人员仍就扩充以前语言的构想并将它们运用到新的内容上。举例来讲,Argus以及Emerald系统的语言配合面向对象语言运用到分布式系统上。
1980年代的编程语言实现状况也有所进展。计算机系统结构中RISC的进展假定硬件应当为编译器设计,而非身为人类的汇编语言程序员。借由中央处理器速度增快的帮助,编译技术也愈来愈积极,RISC的进展对高级语言编译技术带来不小的关注。
语言技术持续这些发展并迈入了1990年代。
在这段期间被开发出来的重要语言包括有:
1990年代:互联网时代
1990年代未见到有什么重大的创新,大多都是之前构想的重组或变化。这段期间主要在推进的哲学是提高程序员的生产力。许多"快速应用程序开发" (RAD) 语言也应运而生,这些语言大多都有相应的集成开发环境、垃圾回收等机制,且大可能是先前语言的派生语言。这类型的语言也大可能是面向对象的编程语言,包含有Object Pascal、Visual Basic,以及C#。Java则是更加保守的语言,也具有垃圾回收机制。与其余相似语言相比,也受到更多的观注。新的脚本语言则比RAD语言更新更好。这种语言并不是直接从其余语言派生,并且新的语法更加开放地(liberal)与功能契合。虽然脚本语言比RAD语言来的更有生产力,但大多会有由于小程序较为简单,可是大型程序则难以使用脚本语言撰写并维护的顾虑[来源请求]。尽管如此,脚本语言仍是网络层面的应用上大放异彩。
在这段期间被开发出来的重要语言包括有:
现今的趋势
编程语言持续在学术及企业两个层面中发展进化,目前的一些趋势包含有:
在这段期间被开发出来的重要语言包括有: