复杂, 以及编程应用领域越来越广泛, 第二次软件危机很快就到来了
第二次软件危机的根本原因还是在于软件生产力远远跟不上硬件和业务的发展, 相比第一次软件危机主要 体现在复杂性, 第二次软件危机主要体现在可扩展性可维护性上面传统的面向过程 (包括 结构化程序设计) 方法已经越来越不能适应快速多变的业务需求了, 软件领域迫切希望找到新的银弹来解 决软件危机, 在这种背景下, 面向对象的思想开始流行起来
面向对象的思想并不是在第二次软件危机后才出现的, 早在 1967 年的 Simula 语言中就开始提出来了, 但 第二次软件危机促进了面向对象的发展 面向对象真正开始流行是在 1980s 年代, 主要得益于 C++ 的功 劳, 后来的 JavaC# 把面向对象推向了新的高峰到现在为止, 面向对象已经成为了主流的开发思想
虽然面向对象开始也被当做解决软件危机的银弹, 但事实证明, 和软件工程一样, 面向对象也不是银弹, 而只是一种新的软件方法而已
虽然面向对象并不是解决软件危机的银弹, 但和面向过程相比, 面向对象的思想更加贴近人类思维的特点, 更加脱离机器思维, 是一次软件设计思想上的飞跃
二详细发展历史
1940 之前:
图: 霍列瑞斯式的打孔机(pantograph), 用于 1890 年的人口普查
第一个编程语言比现代的计算机还早诞生首先, 这种语言是种编码(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] 但是在他有生之年却未能将该语言实现, 而他原本的贡献也被其他的发展所孤立
在这段期间被开发出来的重要语言包括有:
- 1943 - Plankalkül (Konrad Zuse)
- 1943 - ENIAC coding system
- 1949 - C-10
1950 与 1960 年代:
有三个现代编程语言于 1950 年代被设计出来, 这三者所派生的语言直到今日仍旧广泛地被采用:
Fortran (1955), 名称取自 "FORmula TRANslator"(公式翻译器), 由约翰. 巴科斯等人所发明;
LISP, 名称取自 "LISt Processor"(枚举处理器), 由约翰. 麦卡锡等人所发明;
COBOL, 名称取自 "COmmon Business Oriented Language"(通用商业导向语言), 由被葛丽丝. 霍普深刻影响的 Short Range Committee 所发明
另一个 1950 年代晚期的里程碑是由美国与欧洲计算机学者针对 "算法的新语言" 所组成的委员会出版的 ALGOL 60 报告 (名称取自 "ALGOrithmic Language"(算法语言)) 这份报告强化了当时许多关于计算的想法, 并提出了两个语言上的创新功能:
嵌套区块结构: 可以将有意义的代码片段组群成一个区块(block), 而非转成分散且特定命名的程序
词汇范围(lexical scoping): 区块可以有区块外部无法通过名称访问, 属于区块本身的变量程序以及函数
另一个创新则是关于语言的描述方式:
一种名为巴科斯 - 诺尔范式 (BNF)的数学化精确符号被用于描述语言的语法之后的编程语言几乎全部都采用类似 BNF 的方式来描述程序语法中上下文无关的部分
Algol 60 对之后语言的设计上带来了特殊的影响, 部分的语言很快的就被广泛采用后续为了开发 Algol 的扩充子集合, 设计了一个名为 Burroughs(en:Burroughs large systems)的大型系统
延续 Algol 的关键构想所产生的成果就是 ALGOL 68:
语法跟语义变的更加正交 (orthogonal), 采用匿名的历程(routines), 采用高级(higher-order) 功能的递归式输入 (typing) 系统等等
整个语言及语义的部分都通过为了描述语言而特别设计的 Van Wijngaarden grammar 来进行正式的定义, 而不仅止于上下文无关的部分
Algol 68 一些较少被使用到的语言功能 (如同步与并行区块) 语法快捷方式的复杂系统, 以及类型自动强制转换 (coercions), 使得实现者兴趣缺缺, 也让 Algol 68 获得了很难用(diffcult) 的名声尼克劳斯. 维尔特就干脆离开该设计委员会, 另外再开发出更简单的 Pascal 语言
在这段期间被开发出来的重要语言包括有:
- 1951 - Regional Assembly Language
- 1952 - Autocode
- 1954 - FORTRAN
1954 - IPL (LISP 的先驱)
1955 - FLOW-MATIC (COBOL 的先驱)
1957 - COMTRAN (COBOL 的先驱)
- 1958 - LISP
- 1958 - ALGOL 58
1959 - FACT (COBOL 的先驱)
- 1959 - COBOL
- 1962 - APL
- 1962 - Simula
- 1962 - SNOBOL
1963 - CPL (C 的先驱)
- 1964 - BASIC
- 1964 - PL/I
1967 - BCPL (C 的先驱)
1967-1978: 确立了基础范式
1960 年代晚期至 1970 年代晚期的期间中, 编程语言的发展也有了重大的成果大多数现在所使用的主要语言范式都是在这段期间中发明的:
Simula, 于 1960 年代晚期由奈加特与 Dahl 以 Algol 60 超集合的方式发展, 同时也是第一个设计支持面向对象进行开发的编程语言
C, 于 1969 至 1973 年间由贝尔实验室的研究人员丹尼斯. 里奇与肯. 汤普逊所开发, 是一种早期的系统程序设计 (en:system programming) 语言
Smalltalk, 于 1970 年代中期所开发, 是一个完全从零开始 (ground-up) 设计的面向对象编程语言
Prolog, 于 1972 年由 ColmerauerRoussel, 以及 Kowalski 所设计, 是第一个逻辑程序语言
ML, 于 1973 年由罗宾. 米尔纳所发明, 是一个基于 Lisp 所建构的多态 (polymorphic) 类型系统, 同时也是静态类型函数编程语言的先驱
这些语言都各自演展出自己的家族分支, 现今多数现代编程语言的祖先都可以追溯他们其中至少一个以上
在 1960 年代以及 1970 年代中结构化程序设计的优点也带来许多的争议, 特别是在程序开发的过程中完全不使用 GOTO 这项争议跟语言本身的设计非常有关系: 某些语言并没有包含 GOTO, 这也强迫程序员必须结构化地编写程序尽管这个争议在当时吵翻了天, 但几乎所有的程序员都同意就算语言本身有提供 GOTO 的功能, 在除了少数罕见的情况下去使用 GOTO 是种不良的程序风格结果是之后世代的编程语言设计者发觉到结构化编程语言的争议实在既乏味又令人眼花撩乱
在这段期间被开发出来的重要语言包括有:
- 1968 - Logo
- 1970 - Pascal
- 1970 - Forth
1972 - C 语言
- 1972 - Smalltalk
- 1972 - Prolog
- 1973 - ML
- 1975 - Scheme
1978 - SQL (起先只是一种查询语言, 扩充之后也具备了程序结构)
1980 年代: 增强模块性能
1980 年代的编程语言与之前相较显得更为强大 C++ 合并了面向对象以及系统程序设计美国政府标准化一种名为 Ada 的系统编程语言并提供给国防承包商使用日本以及其他地方运用了大量的资金对采用逻辑编程语言结构的第五代语言进行研究函数编程语言社区则把焦点转移到标准化 ML 及 Lisp 身上这些活动都不是在开发新的范式, 而是在将上个世代发明的构想进一步发扬光大
然而, 在语言设计上有个重大的新趋势, 就是研究运用模块或大型组织化的程序单元来进行大型系统的开发 ModulaAda, 以及 ML 都在 1980 年代发展出值得注意的模块化系统模块化系统常拘泥于采用泛型程序设计结构: 泛型存在 (generics being) 本质(essence), 参数化模块(parameterized modules)(参阅多态)
尽管没有出现新的主要编程语言范式, 许多研究人员仍就扩充之前语言的构想并将它们运用到新的内容上举例来说, Argus 以及 Emerald 系统的语言配合面向对象语言运用到分布式系统上
1980 年代的编程语言实现情况也有所进展计算机系统结构中 RISC 的进展假定硬件应当为编译器设计, 而非身为人类的汇编语言程序员借由中央处理器速度增快的帮助, 编译技术也越来越积极, RISC 的进展对高级语言编译技术带来不小的关注
语言技术持续这些发展并迈入了 1990 年代
在这段期间被开发出来的重要语言包括有:
1980 - Ada
1983 - C++ (就像有类别的 C)
- - Common Lisp
- - Eiffel
- - Erlang
- - Perl
- - Tcl
- - FL (Backus)
1990 年代: 互联网时代
1990 年代未见到有什么重大的创新, 大多都是以前构想的重组或变化这段期间主要在推动的哲学是提升程序员的生产力许多 "快速应用程序开发" (RAD) 语言也应运而生, 这些语言大多都有相应的集成开发环境垃圾回收等机制, 且大多是先前语言的派生语言这类型的语言也大多是面向对象的编程语言, 包含有 Object PascalVisual Basic, 以及 C#Java 则是更加保守的语言, 也具备垃圾回收机制与其他类似语言相比, 也受到更多的观注新的脚本语言则比 RAD 语言更新更好这种语言并非直接从其他语言派生, 而且新的语法更加开放地 (liberal) 与功能契合虽然脚本语言比 RAD 语言来的更有生产力, 但大多会有因为小程序较为简单, 但是大型程序则难以使用脚本语言撰写并维护的顾虑 [来源请求] 尽管如此, 脚本语言还是网络层面的应用上大放异彩
在这段期间被开发出来的重要语言包括有:
- 1990 - Haskell
- 1991 - Python
- 1991 - Visual Basic
- 1993 - Ruby
- 1993 - Lua
- 1994 - CLOS (part of ANSI Common Lisp)
- 1995 - Java
- 1995 - Delphi (Object Pascal)
- 1995 - JavaScript
- 1995 - PHP
- 1997 - REBOL
- 1999 - D
现今的趋势
编程语言持续在学术及企业两个层面中发展进化, 目前的一些趋势包含有:
在语言中增加安全性与可靠性验证机制: 额外的堆栈检查信息流 (information flow) 控制, 以及静态线程安全
提供模块化的替代机制: 混入 (en:mixin) 委派(en:delegates), 以及观点导向
组件导向 (component-oriented) 软件开发
元编程反射或是访问抽象语法树(en:Abstract syntax tree)
更重视分布式及移动式的应用
与数据库的集成, 包含 XML 及关系数据库
支持使用 Unicode 编写程序, 所以源代码不会受到 ASCII 字符集的限制, 而可以使用像是非拉丁语系的脚本或延伸标点符号
图形用户界面所使用的 XML(XULXAML)
在这段期间被开发出来的重要语言包括有:
- 2001 - C#
- 2001 - Visual Basic .NET
- 2002 - F#
- 2003 - Scala
- 2003 - Factor
- 2006 - Windows PowerShell
- 2007 - Clojure
- 2009 - Go
2014 - Swift (编程语言)
编程语言发展史上的杰出人物
约翰. 巴科斯, 发明了 Fortran
阿兰. 库珀, 开发了 Visual Basic
艾兹格. 迪杰斯特拉, 开创了正确运用编程语言 (proper programming) 的框架
詹姆斯. 高斯林, 开发了 Oak, 该语言为 Java 的先驱
安德斯. 海尔斯伯格, 开发了 Turbo PascalDelphi, 以及 C#
葛丽丝. 霍普, 开发了 Flow-Matic, 该语言对 COBOL 造成了影响
肯尼斯. 艾佛森, 开发了 APL, 并与 Roger Hui 合作开发了 J
比尔. 乔伊, 发明了 vi,BSD Unix 的前期作者, 以及 SunOS 的发起人, 该操作系统后来改名为 Solaris
艾伦. 凯, 开创了面向对象编程语言, 以及 Smalltalk 的发起人
Brian Kernighan, 与丹尼斯. 里奇合著第一本 C 程序设计语言的书籍, 同时也是 AWK 与 AMPL 程序设计语言的共同作者
约翰. 麦卡锡, 发明了 LISP
约翰. 冯. 诺伊曼, 操作系统概念的发起者
丹尼斯. 里奇, 发明了 C
比雅尼. 斯特劳斯特鲁普, 开发了 C++
肯. 汤普逊, 发明了 Unix
尼克劳斯. 维尔特, 发明了 Pascal 与 Modula
拉里. 沃尔, 创造了 Perl 与 Perl 6
吉多. 范罗苏姆, 创造了 Python
来源: http://www.bubuko.com/infodetail-2499175.html