当前位置: 首页 > news >正文

1. 面向对象的由来

1. 概述

1.1 1940年以前: 面向机器编程的时代

1940年以前, 程序设计主要采用的是面向机器的方式.面向机器语言(Machine-Oriented Language): 指的是直接用于计算机硬件执行的指令集, 也称为机器语言或机器码.
机器语言是由二进制代码组成的, 这些代码直接对应于计算机的指令和操作.这意味着程序员需要直接编写由01组成的序列来代表计算机能够识别和执行的指令和数据.
例如, 使用0000代表加载(LOAD)指令, 0001代表存储(STORE)指令.由于机器语言直接控制硬件, 因此它具有高度的执行效率和硬件级别的控制能力.
但一个很明显的缺点就是: 写起来实在是太困难了, 一旦写错了, 改起来非常麻烦! 
这样直接导致程序编写效率十分低下, 编写程序花费的时间往往是实际运行时间的几十倍或几百倍.有一个广为流传的笑话, 说比尔·盖茨拿着绣花针在一张光盘上戳, 试图通过这种方式来编写Windows操作系统.
这当然是夸张的说法, 旨在形象地说明直接使用二进制码编写程序的复杂性和不现实性.
如果真的采用这种方式编写程序, 即使是一个简单的"Hello, World!"程序也会让人感到力不从心.
由于机器语言编写实在是太困难, 为了简化编程过程, 于是就发展出了汇编语言(1949年提出, 1950年亮相).
汇编语言亦称符号语言, 用助记符(mnemonic)代替机器指令的操作码, 用地址符号(Symbol)或标号(Label)代替指令或操作数的地址.
汇编语言由于是采用了助记符号来编写程序, 比用机器语言的二进制代码编程要方便些, 在一定程度上简化了编程过程.
例如, 使用LOAD来代替0000, 使用STORE来代替0001.即使汇编语言相比机器语言提升了可读性, 但其本质上还是一种面向机器的语言, 编写同样困难, 也很容易出错. 

1.2 脱离机器第一步: 面向过程

面向机器的语言, 由于其直接对应于计算机硬件的操作指令和存储细节, 通常被归类为'低级语言'.
为了克服这种低级语言带来的编程复杂性和限制, 计算机科学界的前辈们开发了面向过程的语言, 这是一种更高级别的编程语言.面向过程的语言(也称为'高级语言')不再需要程序员直接处理机器指令和内存管理, 而是将关注点转向了解决具体问题的过程.
这意味着程序员可以使用更高级别的抽象来描述问题, 并将问题分解为一系列的逻辑步骤, 即解决问题的过程.
这种编程范式使得程序员能够更专注于实现软件的功能, 而不是处理底层硬件的细节.面向过程的语言是一次重大的思想飞跃, 它极大地简化了编程工作, 将程序员从复杂的机器操作和细节中解放出来.
这种语言不再与特定的机器硬件绑定, 因此具有更好的可移植性和通用性.
这意味着使用面向过程语言编写的程序可以在不同的计算机平台上运行, 而无需进行大量的修改.此外, 面向过程的语言通常具有更丰富的编程结构和工具, 使得程序更易于编写, 理解和维护.
这些因素综合起来, 大大减轻了程序员的负担, 提高了他们的工作效率, 从而推动了软件行业的快速发展.典型的面向过程的语言包括COBOL, FORTRAN, BASIC和C语言等.
这些语言在各自的领域内有着广泛的应用, 并且为后续的面向对象语言和其他高级编程范式的出现奠定了基础.

1.3 第一次软件危机: 结构化程序设计

随着计算机硬件技术的飞速发展以及应用需求的日益复杂, 软件规模不断扩大, 传统的程序开发方式逐渐显露出其局限性.
特别是在1960年代中期, 软件行业遭遇了第一次软件危机, 其主要表现为软件质量参差不齐, 项目延期, 成本超支等严重问题,
甚至导致了因软件错误而引发的重大事故. 例如, 1963年美国水手一号火箭发射失败, 就是由于一行FORTRAN代码错误所致.IBM的System/360操作系统开发是软件危机的一个典型例子.
项目主管佛瑞德·布鲁克斯(Frederick P. Brooks, Jr.)率领超过2000名程序员投入巨大的人力物力, 总共花费了5000人一年的工作量,
撰写了近100万行的源代码, 投入资金高达5亿美元, 相当于美国'曼哈顿'原子弹计划投入的1/4.
然而, 如此巨大的投入并未带来预期的效果, 项目进度一再延误, 软件质量也难以保证.
布鲁克斯基于这次项目经验撰写的<<人月神话>>一书, 成为了软件工程领域的经典之作.
(书名中的'人月'指的是人力资源()与工作时间()的乘积, 用于估算软件开发项目所需的工作量.
然而, 书中指出, 简单地将人力资源和工作时间相加来估算项目进度是一个误区, 即所谓的'人月神话'.)为了应对软件危机, 1968年和1969年连续召开了两次著名的NATO会议, 会议上正式提出了'软件危机'的概念. 并探讨了解决方案.
其中, '软件工程'作为一种新的开发方法被提出, 旨在通过规范化的开发流程和工具来提高软件的质量和效率.
然而, 尽管软件工程曾被视为解决软件危机的'银弹', 但实践证明它同样无法完全解决问题.
(银弹(Silver Bullet): 通常意味着这种技术或方法被寄予厚望, 被认为是能够一举解决复杂问题的终极方案.)与此同时, '结构化程序设计'作为另一种解决软件危机的方案被提出.
Edsger Dijkstra在1968年发表了著名的<<GOTO有害论>>论文, 引起了业界的广泛关注和讨论.
他主张抛弃goto语句, 采用自顶向下, 逐步细化, 模块化的设计思想来构建软件.
这种设计方法通过将软件的复杂度控制在一定范围内, 降低了整体开发的复杂度, 提高了软件的可读性和可维护性.
结构化程序设计方法的提出, 标志着软件开发从面向过程向面向对象的重要转变.结构化程序设计的主要特点包括: 抛弃goto语句, 采用清晰的控制结构;
自顶向下进行设计, 逐步细化实现细节; 模块化开发, 将软件划分为若干个相对独立的模块, 每个模块具有明确的功能和接口.
这种设计方法不仅符合人类思维的7+-2原理(即人类短期记忆一般一次只能记住5-9个事物), 也使得软件开发更加高效, 可靠和易于维护.随着结构化程序设计方法的普及和应用, 软件开发进入了一个新的阶段.
越来越多的开发者开始采用这种方法来构建软件, 并取得了显著的效果.
结构化程序设计方法的提出和应用, 为解决软件危机提供了有力的支持, 也为后续的软件工程发展奠定了坚实的基础.
总结: 传统的面向过程语言中, goto语句的过度使用往往导致难以理解和维护的'面条式代码', 极大地限制了程序的规模和可维护性.
为了克服这一难题, 结构化程序设计(Structured programming)应运而生, 它摒弃了goto语句, 
转而采用子程序(包括函数), 代码区块, for循环和while循环等结构, 旨在提升程序的明晰性, 质量和开发效率.

1.4 第二次软件危机: 面向对象程序设计

随着硬件技术的飞速进步, 业务需求日趋复杂, 以及编程应用领域的广泛拓展, 软件行业很快就迎来了第二次软件危机.
这次危机的根源在于软件生产力与硬件和业务发展的不匹配.
与第一次软件危机主要聚焦于'复杂性'不同, 第二次软件危机更多地体现在'可扩展性''可维护性'.
传统的面向过程(包括结构化程序设计)方法逐渐显得力不从心, 无法适应快速变化的业务需求.在这种背景下, 面向对象的思想开始崭露头角.
虽然面向对象的概念并非在第二次软件危机后才出现, 它早在1967年的Simula语言中就已经被提出,
但正是这次危机推动了面向对象方法的进一步发展.到了1980年代, 面向对象的方法开始广泛流行, 特别是C++语言的崛起, 为面向对象编程注入了强大的动力.
随后, Java和C#等语言的推出更是将面向对象推向了新的高度.
如今, 面向对象已经成为主流的开发思想, 深受开发者的青睐.然而, 尽管面向对象方法曾一度被视为解决软件危机的'银弹', 但随着时间的推移, 人们逐渐认识到它并非万能之药.
和软件工程一样, 面向对象只是提供了一种新的软件设计方法, 而并非解决所有问题的终极方案.
尽管如此, 面向对象的思想相比面向过程更加贴近人类思维的特点, 更加远离了机器思维的局限, 这无疑是软件设计思想上的一次重大飞跃.

2. 详细发展历史

2.1 1940之前: 超越硬件的抽象之美

在计算机诞生之前, 编程语言的概念就已悄然孕育.
这些先驱者们利用特定的符号和机制, 让机器按照人类的意图运作, 这便是编程语言的雏形.回溯至1801, 提花织布机的发明是这一历程中的重要里程碑.
它通过打孔卡上的孔洞来指挥织布机的手臂动作, 自动化地织出精美的装饰图案.
这种简单的编码机制, 为后来的编程思想奠定了基础.1842年至1843年间, 爱达·勒芙蕾丝花费了九个月翻译了Luigi Menabrea关于查尔斯·巴贝奇分析机的回忆录, 
还在其后附加了一个详细的计算方法用以通过该机器计算伯努利数.
这一成果被一些历史学家誉为世界上第一个电脑程序, 展现了编程语言的强大潜力.Herman Hollerith则通过观察列车长对乘客票根的打孔方式, 发明了利用打孔卡来编码和记录信息的系统.
这一创新在1890年的人口统计中发挥了巨大作用, 进一步证明了编程语言在数据处理方面的实用性.随着技术的不断进步, 编程语言也逐渐从简单的编码机制发展为能够表达复杂逻辑和算法的工具.
阿隆佐·邱奇的λ演算和图灵机的出现, 标志着编程语言进入了新的阶段.
这些理论模型不仅为计算机科学的发展奠定了基础, 也为后来的编程语言设计提供了重要的参考.
就像许多历史上的'第一次'一样, 第一个现代编程语言的界定颇具争议.
在最初阶段, 编程语言的设计受到硬件的严格限制.
以打孔卡为例, 其长度限制为80, 但其中的部分列必须用于记录卡片的顺序, 这极大地限制了编码的灵活性和复杂性.随着技术的演进, 编程语言开始融入更多的元素和特性.
例如, FORTRAN作为早期的高级编程语言之一, 引入了一系列与英文字词相同的关键字, 'IF', 'GOTO', 'CONTINUE',
使得编程更加直观和易于理解.
然而, 这一时期的编程语言仍然高度依赖于特定的硬件, 如磁鼓存储器, 计算机程序需要按照磁鼓的转动方式来插入和执行.对于'编程语言'这一概念的界定, 历史学家和计算机科学家之间存在不同的观点.
一些人认为, 应该根据语言的能力, 可读性以及在实际应用中的表现来评判其是否为'第一个现代编程语言'.
例如, 提花织布机和查尔斯·巴贝奇所制作的差分机, 虽然它们并非为通用计算而设计, 
但却在特定限制下能够简单描述机器应运行的行为, 这可以视为一种早期的'编程语言'.此外, 还有一些特定领域语言, 如用于自动演奏钢琴的打孔卡编码, 虽然并非针对人类编程而设计, 但同样展现了编码和指令控制机器的能力.
这些语言虽然具有局限性, 但都为后来的编程语言发展提供了宝贵的经验和启示.
尽管如此, 我们仍然可以从这些早期的编程语言中看到编程思想的本质: 通过特定的符号和规则来描述机器的行为, 从而实现人类的意图.
这种思想不仅推动了计算机科学的飞速发展, 也为我们今天所使用的各种高级编程语言提供了灵感和基础.因此, 我们可以说, 第一个编程语言虽然诞生于计算机之前, 但它所蕴含的编程思想却超越了硬件的限制, 成为了计算机科学发展的重要基石.

2.2 1940年代: 早期电力引导计算机

最早被确认的现代化, 电力引导的计算机大约在1940年代被创造出来.
在这个时期, 程序员面临着有限的速度和存储器容量的挑战, 他们不得不使用汇编语言来编写人工调整过的程序.
然而, 这种方式被证明是极其耗费脑力且容易出错的.尽管有这些限制, 但计算机科学的先驱们仍然努力推进编程语言的发展.
在这一时期, 有几个重要的编程语言被开发出来, 它们为后续编程语言的演化奠定了基础.
* 1. Plankalkül (1943): 由康拉德·楚泽(Konrad Zuse)设计, 并于1948年发表了一篇关于该语言的论文.然而, 在他有生之年, 这一语言并未被实现, 他的贡献在一定程度上被其他的发展所掩盖.尽管如此, Plankalkül被视为一种高级编程语言的前身, 它的一些思想对后来的语言设计产生了影响.
* 2. ENIAC Coding System (1943): 伴随着世界上第一台电子计算机ENIAC的诞生, 相应的编码系统也应运而生.这一系统为早期的计算机编程提供了基本的框架, 但受限于硬件的复杂性和计算能力的限制, 其应用范围和效率都较为有限.
* 3. C-10 (1949): 一种特定的指令集或编码系统.C-101949年的UNIVAC计算机紧密相关, 这是计算机历史上的一个重要时期, 标志着从专用计算机向通用计算机的转变.
这些早期编程语言的开发, 虽然面临着许多挑战和限制, 但它们为后来的编程语言设计提供了宝贵的经验和启示.
随着技术的不断进步和计算机科学的深入发展, 编程语言逐渐变得更加高级, 抽象和易于使用, 极大地提高了编程的效率和准确性.

2.3 1950与1960年代:现代编程语言

1950年代, 三个重要的现代编程语言被设计出来, 它们分别是Fortran, LISP和COBOL, 这些语言及其派生语言至今仍在广泛使用.
以下是关于这些语言以及同期其他重要编程语言的详细介绍:
* 1. Fortran (1955)名称: FORmula TRANslator (公式翻译器)发明者: 约翰·巴科斯等人特点: Fortran是第一种完整的编译型高级编程语言, 主要用于科学计算和工程领域.
* 2. LISP (1958)名称: LISt Processor (枚举处理器)发明者: 约翰·麦卡锡等人特点: LISP是一种函数式的符号处理语言, 其程序由一些函数子程序组成. LISP在人工智能领域有着广泛的应用.
* 3. COBOL (1959)名称: COmmon Business Oriented Language (通用商业导向语言)发明者: Short Range Committee在葛丽丝·霍普的深刻影响下开发特点: COBOL适用于商业数据处理, 特别是金融, 保险和会计领域.
除了上述三个重要的编程语言, 1950年代还出现了其他里程碑事件和编程语言, 包括:
* 1. ALGOL 60报告 (1950年代末): 由美国与欧洲计算机学者针对'算法的新语言'所组成的委员会出版的ALGOL 60报告.(名称取自'ALGOrithmic Language', 算法语言). 这份报告强化了当时许多关于计算的想法, 并提出了两个语言上的创新功能:嵌套区块结构: 是指编程语言中允许将代码组织成嵌套的区块(block)或作用域(scope)的能力.这些区块可以是有意义的代码片段, 如函数体, 循环体, 条件语句体等.通过将代码组织成嵌套的区块, 程序员可以更好地控制变量的作用域和生命周期, 从而提高代码的可读性和可维护性.词汇范围(Lexical Scoping): 是编程语言中变量, 函数和类型的作用域规则的一种.在词汇范围中, 一个区块内部定义的标识符(例如变量名, 函数名)的作用域限于定义它们的区块以及该区块内部的任何嵌套区块.换句话说, 这些标识符在区块外部是不可见的, 除非它们被明确地导出或返回.词汇范围的一个关键特点是, 它基于源代码的文本结构(即词汇结构)来确定作用域, 而不是基于程序运行时的控制流或调用栈.这意味着即使在函数内部动态地执行了外部代码(例如通过 eval 函数, 外部代码也不能访问函数内部的词汇范围内的标识符, 除非这些标识符被明确地传递或返回.此外, 报告还引入了巴科斯-诺尔范式(BNF)来描述语言的语法.之后的编程语言几乎全部都采用类似BNF的方式来描述程序语法中上下文无关的部分.* 2. ALGOL 68: 作为ALGOL的扩展, 提供更强大和正交(即各组件间尽可能独立)的语法和语义.它引入了一些新的特性, 如匿名历程(类似于现代编程语言中的函数或过程)和高阶类型系统(支持类型作为参数或返回值).然而, 由于其复杂性和一些不常使用的特性, ALGOL 68 的学习曲线相对较陡, 被认为较难使用.正交语法和语义: ALGOL 68 致力于创建一种其语法和语义尽可能正交的编程语言.正交性意味着语言的不同部分(如语法规则和语义规则)尽可能独立, 以减少不必要的交互和依赖.匿名历程和高阶类型: ALGOL 68 引入了匿名历程(routines)的概念, 即不需要显式命名的函数或过程. 这提供了更灵活的编程方式.它还支持高阶类型系统, 允许类型作为参数或返回值, 这增强了语言的表达能力.递归式输入系统: 即类型可以引用自身. 这增加了类型的灵活性, 但也可能增加理解和实现的复杂性.Van Wijngaarden 语法: ALGOL 68的整个语言及其语义部分是通过Van Wijngaarden语法进行正式定义的.这是一种强大的语法描述工具, 可以处理复杂的语法结构和语义规则.复杂性和不常使用的特性: ALGOL 68 的一些特性, 如同步与并行区块, 复杂的语法快捷方式以及类型自动强制转换(coercions),增加了语言的复杂性, 且这些特性并不总是被频繁使用.这些复杂性和不常使用的特性导致了一些实现者对其缺乏兴趣, 也导致 ALGOL 68 被认为较难使用.由于 ALGOL 68 的复杂性和不常使用的特性, 尼克劳斯·维尔特(Niklaus Wirth)离开了 ALGOL 68 的设计委员会, 转而开发了更简单的Pascal语言.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的先驱)
这些编程语言的发展和演变不仅代表了技术上的进步, 也反映了计算机在不同领域应用的扩展和深化.

2.4 1967-1978: 确立了基础范式

1960年代晚期至1970年代晚期的这段黄金时期, 编程语言的发展取得了显著的进步, 并奠定了现代编程范式的基础.
以下是在这一时期涌现出的几种重要编程语言及其特点:
* 1. Simula: 由Ole-Johan Dahl和Kristen Nygaard在1960年代晚期开发, 基于Algol 60的超集, Simula是第一个支持面向对象编程(OOP)的语言, 它为后续面向对象语言的发展奠定了基础.
* 2. C: C语言由贝尔实验室的丹尼斯·里奇(Dennis Ritchie)和肯·汤普逊(Ken Thompson)1969年至1973年间开发,它是一种通用的, 过程式的计算机编程语言, 支持结构化编程, 词汇变量作用域和递归等功能, 尤其适合系统编程和嵌入式系统.
* 3. Smalltalk: Smalltalk是一种完全面向对象的编程语言, 1970年代中期由艾伦·凯(Alan Kay)等人开发.它的设计思想强调代码的可读性和可维护性, 是面向对象编程语言的先驱之一.
* 4. Prolog: Prolog由Alain Colmerauer, Philippe Roussel和Daniel Kowalski于1972年设计,它是第一个广泛使用的逻辑编程语言, 具有自动回溯和模式匹配等独特功能, 特别适合于人工智能和专家系统领域.
* 4. ML: ML(MetaLanguage)是一种函数式编程语言, 由罗宾·米尔纳(Robin Milner)1973年发明.ML具有静态类型系统和多态性, 是静态类型函数式编程语言的先驱之一, 对后续许多函数式编程语言产生了深远影响.这些编程语言不仅各自发展出了自己的家族分支, 而且它们的理念和特性也为后续编程语言的发展提供了重要的参考.
此外, 在这一时期, 结构化程序设计(强调清晰的控制结构和避免使用GOTO语句)的理念也逐渐得到普及,
尽管关于是否完全禁止GOTO的讨论在当时引起了很大争议, 但大多数程序员都认同在大多数情况下避免使用GOTO是一种良好的编程风格.
随着时间的推移, 结构化程序设计的思想逐渐被广泛接受, 并成为后续编程语言设计的重要原则之一.
(某些语言并没有包含GOTO, 这也强迫程序员必须结构化地编写程序.)
在这段期间被开发出来的重要语言包括有:
- 1968 - Logo
- 1970 - Pascal
- 1970 - Forth
- 1972 - C语言
- 1972 - Smalltalk
- 1972 - Prolog
- 1973 - ML
- 1975 - Scheme
- 1978 - SQL (起先只是一种查询语言, 扩充之后也具备了程序结构)

2.5 1980年代: 增强, 模块, 性能

1980年代的编程语言相较于之前确实展现出了更为强大的特性.
这一时期的编程语言不仅继承了先前发明的构想, 而且将它们发扬光大, 同时也在设计上呈现出了新的趋势.首先, C++的出现合并了面向对象编程和系统程序设计的概念, 使得程序员能够在同一语言中实现高级抽象和底层控制.
此外, 美国政府标准化的Ada系统编程语言, 为国防承包商提供了一种强大的系统编程语言选择.与此同时, 日本及其他地区投入了大量资金对采用逻辑编程语言结构的第五代语言进行研究.
这些语言试图通过逻辑推理来模拟人类的思维方式, 为人工智能和专家系统等领域的发展提供了强大的工具.在函数编程语言领域, 社区开始将焦点转移到标准化ML和Lisp身上.
这些语言具有强大的函数式编程特性, 能够支持复杂的算法和数据处理任务.然而, 在语言设计上, 1980年代出现了一个重大的新趋势, 即研究运用模块或大型组织化的程序单元来进行大型系统的开发.
Modula, Ada以及ML等语言都发展出了值得注意的模块化系统, 这些系统采用了泛型程序设计结构, 
: 泛型存在(generics being), 本质(essence)和参数化模块(parameterized modules).
这些特性使得程序员能够更加灵活地组织代码, 提高代码的可维护性和可重用性.尽管没有出现新的主要编程语言范式, 但许多研究人员仍然在不断扩充之前语言的构想, 并将它们运用到新的内容上.
例如, Argus和Emerald等系统的语言将面向对象语言的概念应用到了分布式系统上, 使得分布式系统的开发更加高效和可靠.此外, 1980年代的编程语言实现情况也有所进展.
随着计算机系统结构中RISC(精简指令集计算机)的兴起, 硬件设计开始更多地考虑编译器的需求, 而非直接为人类汇编语言程序员服务.
这一变化促进了编译技术的快速发展, 同时也使得高级语言编译技术得到了更多的关注.
中央处理器速度的增快也为编译器的优化提供了更多的可能性, 使得编译后的代码能够更加高效地运行.
语言技术持续发展并迈入了1990年代, 在这段期间被开发出来的重要语言包括有:
-   1980 - Ada
-   1983 - C++ 
-   1984 - Common Lisp
-   1985 - Eiffel
-   1986 - Erlang
-   1987 - Perl
-   1988 - Tcl
-   1989 - FL (Backus)

2.6 1990年代:互联网时代

1990年代在编程语言领域并未出现显著的创新, 而主要是对之前构想的重组和变化.
在这一时期, 编程语言的发展主要集中在提高程序员的生产力上.
为了适应这种需求, '快速应用程序开发'(RAD)语言应运而生.RAD语言大多都配备了相应的集成开发环境(IDE)和垃圾回收(GC)机制, 这些工具极大地提高了开发效率.
这些RAD语言大多是先前语言的派生, : Object Pascal、Visual Basic以及后来的C#, 
它们都继承了面向对象编程的特性, 使得开发者能够更加高效地进行应用程序的开发.与此同时, Java作为一种更加保守的编程语言也受到了广泛的关注.
Java拥有垃圾回收机制, 支持跨平台运行, 并且提供了丰富的API和工具库.
与其他RAD语言相比, Java的保守特性使得它在企业级应用中得到了广泛的应用.然而, 新的脚本语言也在这一时期崭露头角.
这些脚本语言并非直接从其他语言派生, 而是采用了新的语法和更加开放的功能设计.
与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

2.7 现今的趋势: 多样性与专业化

编程语言在学术和企业领域的持续发展进程中, 正展现出一系列引人注目的趋势.
这些趋势不仅体现了编程语言在功能和性能上的不断进步, 也反映了现代软件开发的需求和挑战.目前的一些趋势包含有:
* 1. 在语言中增加安全性与可靠性验证机制.为了提升软件的安全性和可靠性, 编程语言正在积极引入新的验证机制.这包括额外的堆栈检查以防止缓冲区溢出, 信息流控制以确保数据的安全传输, 以及静态线程安全分析来预防多线程环境中的潜在问题.这些措施为开发者提供了更强大的工具来构建安全可靠的软件应用.* 2. 提供模块化的替代机制: 混入(mixin), 委派(delegates), 以及观点导向编程(aspect-oriented programming, AOP).编程语言正在通过提供模块化的替代机制来增强代码的灵活性和可重用性.混入允许开发者将功能添加到现有类中, 而无需通过继承;委派则提供了一种将方法作为参数传递或在运行时动态调用的方式;观点导向编程则帮助开发者在编译或运行时将横切关注点(如日志记录, 事务管理)注入到代码中.这些机制使得开发者能够更高效地组织和管理代码, 提高软件的可维护性和可扩展性.* 3. 组件导向(component-oriented)软件开发(正在成为主流).这种方法强调构建可重用的软件组件, 这些组件可以在不同的应用程序和项目之间共享.这不仅减少了代码冗余, 提高了软件质量, 还加速了开发过程.* 4. 提供元编程, 反射和访问抽象语法树(AST)等特性, 这为编程语言带来了更大的灵活性.元编程允许程序在运行时检查和修改其自身的结构或行为; 反射则提供了在运行时查询和操作代码结构的能力;而访问AST则允许开发者在编译时或运行时检查和操作源代码的语法结构.这些特性使得开发者能够更深入地控制代码的行为和结构, 实现更高级别的定制和优化.* 5. 更重视分布式及移动式的应用.随着云计算和移动互联网的普及, 分布式和移动式应用的重要性日益凸显.因此, 编程语言正越来越重视对这些应用的支持.这包括提供对并发编程, 网络通信, 设备访问等特性的内置支持, 以及优化性能以适应移动设备的限制.* 6. 与数据库的集成, 包含XML及关系数据库.同时, 编程语言也在加强与数据库的集成.这包括支持XML和关系数据库等不同的数据格式和存储方式, 以便开发者能够更方便地存储和检索数据.这种集成不仅提高了数据处理的效率, 还使得开发者能够更灵活地处理各种类型的数据.* 7. 支持使用Unicode编写程序, 所以源代码不会受到ASCII字符集的限制, 而可以使用像是非拉丁语系的脚本或延伸标点符号.现代编程语言普遍支持使用Unicode编写程序, 这意味着源代码不再受ASCII字符集的限制, 而是可以使用任何语言的字符来编写.这不仅有助于国际化软件开发和协作, 还使得源代码更具可读性和可维护性.* 8. 图形用户界(GUI)面所使用的XML(XUL: 'XML User Interface Language', XAML: 'Extensible Application Markup Language'). XUL和XAML等语言使用XML来定义界面布局和组件属性, 这使得GUI的开发更加灵活和可定制.综上所述, 编程语言在学术和企业领域的持续发展进程中展现出了众多引人注目的趋势.
这些趋势不仅推动了编程语言自身的进步和发展, 也为现代软件开发提供了更强大的支持和工具.
在这段期间被开发出来的重要语言包括有:
- 2001 - C#
- 2001 - Visual Basic .NET
- 2002 - F#
- 2003 - Scala
- 2003 - Factor
- 2006 - Windows PowerShell
- 2007 - Clojure
- 2009 - Go
- 2014 - Swift 

2.8 编程语言发展史上的杰出人物

以下是对这些计算机科学和编程语言领域的杰出人物的简要概述:
* 1. 约翰·巴科斯(John Backus): 设计了Fortran, 这是一种广泛使用的科学计算编程语言, 被认为是第一种高级编程语言.* 2. 阿兰·库珀(Alan Cooper): 虽然他并没有直接开发Visual Basic,但他是Visual Basic编程环境背后的概念推动者之一, 强调直观的用户界面设计.* 3. 艾兹格·迪杰斯特拉(Edsger Dijkstra): 算法设计和分析的先驱, 尤其是最短路径算法(Dijkstra算法)的发明者.他在编程语言设计和软件工程方面也做出了重要贡献, 提出了'goto语句是有害的'等观点.* 4. 詹姆斯·高斯林(James Gosling): 开发了Oak语言(后更名为Java), 该语言后来成为了互联网时代的标志性编程语言.* 5. 安德斯·海尔斯伯格(Anders Hejlsberg): 开发了Turbo Pascal, Delphi, 并在微软期间对C#语言的开发做出了重大贡献.* 6. 葛丽丝·霍普(Grace Hopper): 开发了Flow-Matic编程语言, 这是第一个将英语用于编程的编译器, 对后来的COBOL语言产生了影响.* 7. 肯尼斯·艾佛森(Kenneth Iverson): 开发了APL(A Programming Language)编程语言, 这是一种用于数学和工程计算的数组编程语言.后来, 他与Roger Hui合作开发了J编程语言.* 8. 比尔·乔伊(Bill Joy): BSD Unix操作系统的前期作者之一, 也是SunOS操作系统的发起人之一(该操作系统后来改名为Solaris).他还发明了vi文本编辑器.* 9. 艾伦·凯(Alan Kay): 面向对象编程的先驱, 也是Smalltalk编程语言的发起人之一.Smalltalk被广泛认为是第一个面向对象的编程语言.* 10. Brian Kernighan与丹尼斯·里奇合著了第一本C程序设计语言的书籍, 同时也是AWK和AMPL程序设计语言的共同作者.* 11. 约翰·麦卡锡(John McCarthy): LISP(List Processing)语言的发明者, 这是一种功能强大的符号处理语言, 对人工智能和计算机科学领域产生了深远影响.* 12. 约翰·冯·诺伊曼(John von Neumann): 是计算机科学的先驱, 提出了许多重要的概念, 包括计算机体系结构, 存储程序和浮点表示法等.       他虽然不是直接提出'操作系统'这一术语的人, 但他的工作为操作系统的概念奠定了基础.* 13. 丹尼斯·里奇(Dennis Ritchie)与肯·汤普逊一起开发了Unix操作系统, 并发明了C编程语言, 这是一种广泛使用的系统级编程语言.* 14. 比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup): 开发了C++编程语言, 这是C语言的一个扩展, 增加了面向对象编程的特性.* 15. 肯·汤普逊(Ken Thompson)与丹尼斯·里奇一起开发了Unix操作系统, 并发明了B语言和C语言的前身.* 16. 尼克劳斯·维尔特(Niklaus Wirth): 发明了Pascal编程语言, 这是一种教学用编程语言, 旨在教授编程的基本概念.他还开发了Modula-2和Modula-3等后续语言.* 17. 拉里·沃尔(Larry Wall): 创造了Perl编程语言, 这是一种用于文本处理和系统管理的脚本语言. 他还继续参与了Perl 6的开发.* 18. 吉多·范罗苏姆(Guido van Rossum): 创造了Python编程语言, 这是一种易于学习和使用的高级编程语言, 广泛应用于网站开发, 数据科学等领域.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MyBatis面试题系列三
  • 何为屎山代码?
  • Facebook海外户|如何制作出引人注目的Facebook广告素材?
  • lua vm 五: upvalue
  • django ORM model update常规用法
  • java面试题:java三大特性多态又是如何实现的
  • 作文笔记11 推荐一本书
  • 磁力狗ciligou,磁力链接使用步骤
  • Java--Math类和Random类
  • 【设计模式】面向对象与UML
  • uni-app加持下的Vue开发:效率与功能的双赢
  • requests库的常用方法
  • 数据结构--第七章--树和二叉树
  • 调研管理系统的设计
  • odoo15升级odoo16遇到的问题及解决过程
  • Angularjs之国际化
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ECMAScript入门(七)--Module语法
  • go append函数以及写入
  • Linux gpio口使用方法
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • PHP变量
  • Ruby 2.x 源代码分析:扩展 概述
  • Unix命令
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 简单基于spring的redis配置(单机和集群模式)
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 算法-插入排序
  • 正则表达式-基础知识Review
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • (+4)2.2UML建模图
  • (4)Elastix图像配准:3D图像
  • (arch)linux 转换文件编码格式
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (js)循环条件满足时终止循环
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • **PHP分步表单提交思路(分页表单提交)
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .Mobi域名介绍
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net 8 发布了,试下微软最近强推的MAUI
  • .Net IOC框架入门之一 Unity
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET中GET与SET的用法
  • .php文件都打不开,打不开php文件怎么办
  • ?.的用法
  • @SuppressWarnings(unchecked)代码的作用
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)