各代程序设计语言拓扑
Wegner根据语言的功能和产生的时间,将一些流行的高级语言进行了分类。
第一代 (1954-1958)
- Fortran I
- Algol 58
- Flowmatic
- IPL V
第二代 (1959-1961)
- Fortran II
- Algol 60
- Cobol
- Lisp
第三代 (1962-1970)
- PL/1
- Algol 68
- Pascal
- Simula
代沟 (1970-1980)
- C
- Fortran 77
面向对象 近代 (1980-1990)
- Smalltalk 80
- C++
- Ada83
- Eiffel
框架出现 (1990-)
- VB
- Java
- Python
- J2EE
- .NET
我们看看各代的拓扑结构,所谓拓扑指的是采用该语言开发后的基本物理构成单元,以及各部分是如何连接的。
第一代和第二代早期编程语言拓扑
这些语言编写出的程序体现出相对较平的物理结构,只包含全局数据(全局变量)和子程序(函数)。
箭头表明子程序对全局数据的依赖。设计时应该将逻辑上不同功能的全局数据分开,但语言却没有任何机制强制确保分开。由于全局数据对所有子程序都是可见的,因此某个不相干的子程序修改了另一个功能的全局数据就会带来意想不到的bug,甚至灾难。
第二代后期和第三代早期程序设计语言拓扑
基本结构和第一代差不多,但子程序更进一步了。子程序在1950年就发明了,作为一种抽象那时却没有被完全接受。到了第二代,子程序被认为是抽象程序功能的一种主要方式。
此时子程序发生了一些变化,改进:
- 很多语言发明了参数传递
- 很多语言支持嵌套子程序
出现了结构化程序设计,利用子程序作为基本构建块,为试图构建大型系统提供了指导。
第三代后期程序设计语言拓扑
与第二代相比,此时出现了模块,模块中包括数据和子程序,功能按模块分组,各模块中数据互不干扰。
虽然有模块的概念,但模块却很少被认为是一种重要的抽象机制,实践中它们只是用于对最有可能同时改变的子程序分组而已。
第四代(基于对象和面向对象程序设计拓扑)
数据抽象对于把握复杂性是很重要的,抽象数据类型到类型概念理论的出现导致基于对象和面向对象语言的诞生。
从Pascal,Simula再到完全面向对象的Smalltalk。这些语言的构建块是模块,逻辑上是一组类或对象,而不是早期的子程序。基于对象或面向对象语言的应用程序表现为一个图,而不是面向算法(过程)语言那样通常是一棵树。此外,很少或基本没用有全局数据(变量)。