闲聊计算机语言

任何最复杂的计算(比如求解非线性偏微分方程组)最终都归结为算术运算(加减乘除
)。电子计算机就是能执行二进制算术运算的工具。二进制(0,1)算术运算在电子计
算机中是由数字电路(门电路)等来物理实现。在电子计算机中有两种运算:定点运
算和浮点运算。定点运算就是整数运算。而浮点运算是带小数点的数的运算。冯-诺

曼式计算机(现在大多数计算机还是这种形式)是指令和数据不分的。比如,11001010 
在程序的不同位置可以是指令也可以是数据。起初人们直接用机器指令来编写程序,
这当然是很繁复的劳动。后来人们用汇编语言(如,MOV,INT 等)来代替机器指令。
再后来人们开发出很多高级语言。计算机高级语言的出现,使非专业的人员都能编
程和使用计算机,大大地促进了计算机普及使用,而且也促进了计算机理论的发展。
现有一千多种计算机语言,但其中只有十几种被广泛使用。在计算机语言领域,人
们的创造力是无限的。有以函数为对象的语言,如ML;有以表(LIST)为对象的语言,
如LISP;有以

OBJECT 为对象的语言,如SMALLTALK,等等。就程序语言来说,可以分为三类:函数
语言,如ML;逻辑语言,如PROLOG;IMPERATIVE语言,如C。(有些语言,如XML,不
是程序语言。)  人们是用编译方法将高级语言转换成机器码,而编译器的设计是基
于自动机理论。现有四种自动机:有限自动机,堆栈自动机,线性有界(LINEAR BOUNDED)
自动机和图灵(TURING)机。其中以图灵机功能最强。图灵机由磁带,读写头和控制
器等组成。图灵机计算模型虽然简单,但它的功能和每秒运算数亿次的电子计算机
是一样的,而且至今人们还没有找到比图灵机功能更强的计算模型。
编译器的设计必须面对如下的事实:
1) 不是所有的语言都有编译器存在。设有一字母集合A。由集合A中的字母组成的所
有单词的集合B是一个可数无穷集合。由集合B中的所有子集(单词组)组成的集合(语
言)将是一个不可数无穷集合(集合的幂集)。而图灵机只能处理可数无穷集合,所以
说不是所有的语言都有编译器存在。
2) 最佳编译器是不存在的。早在世界上第一个编译器出现以前,就有人证明最佳编
译器是不存在的。证明的思路也很简单:如果最佳编译器存在,图灵的HALTING问题
也就解决了。因为最佳编译器可以将死循环程序变成:
L1      SOME CODE
           GOTO  L1
只要发现程序中有上述程序,就可判断该程序是死循环。事实上图灵的HALTING问题
是不能解决,所以说最佳编译器是不存在的。
早期广泛应用的程序语言都是PROCEDURE语言,比如 COBOL,FORTRAN,C 等。
PROCEDURE语言的运行就像流水帐一样,当然不适用于大型系统的设计。于是,近二
十多年发展的OBJECT-ORIENTED语言,比如 C++,JAVA 等得到广泛应用。在OBJECT-ORIENTED语
言中,OBJECT自带数据和方法,并且可以重复使用。不过,OBJECT也有机器码兼容
问题,因此人们进一步发展COMPONENT和INTERFACE设计。
显然,不是所有的东西都可以设计成OBJECT(比如SECURITY就不能设计成一个OBJECT)。
所以人们进一步发展ASPECT-ORIENTED语言。
应用程序在运行时也会出错,但错误原因在机器码上。这使得纠错(DEBUG)变成很复
杂。有人研究用示范的方法让计算机自动生成执行程序,但至今在这方面的研究进
展很慢。编译完的程序还必须链接。链接过程也是很复杂。早些年,“程序的增量
链接”还是美国斯丹福大学计算机系研究课题。最后的执行程序也有它的结构,比
如 COFF 结构。这结构分为头部和执行码。头部的数据显示有关执行程序的信息。
在头部和执行码之间通常有中断(微软用 INT 3),以便于操作系统加载DLL和DEBUG。

 

登录后才可评论.