1.1 引言
语言是人们交流思想的工具。人类在长期的历史发展过程中,为了交流思想、表达感情和交换信息,逐步形成了语言。这类语言,如汉语和英语,通常称为自然语言(Natual Lan guage)。另一方面,人们为了某种用途,又创造出各种不同的语言,如旗语和哑语,这类语言通常称为人工语言(Artificial Language)。
1946年出现了第一台电子数字计算机(Electronic Digital Computer),它一问世就成为强有力的计算工具。只要针对预定的任务(问题),告诉计算机“做什么”和“怎么做”,计算机就可以自动地进行计算,对给定的问题求解。为此,人们需要将有关的信息告诉计算机,同时也要求计算机将计算结果告诉人们。这样,人与计算机之间就要进行通信(Communication),既然要通信,就需要信息的载体。人们设计出词汇量少、语法简单、意义明确的语言作为载体,这样的载体通常称为程序设计语言(Programmig Language)。这类语言有别于人类在长期交往中形成的自然语言,它是由人设计创造的,故属于人工语言。本书将讨论这类语言的设计(De-sign)和实现(Implementation)。
每当设计出一种类型的计算机,就随之产生一种该机器能理解并能直接执行的程序设计语言,这种语言称为机器语言(Machine Language)。用机器语言编写的程序由二进制代码组成,计算机可以直接执行。对人来说,机器语言程序既难编写,又难读懂。为了提高程序的可写性(Writability)和可读性(Readability),人们将机器语言符号化,于是产生了汇编语言(As-semble Language)。机器语言和汇编语言都是与机器有关的语言(Machine-dependent Lan-guage),通常称为低级语言(Low-level Language)。其他与机器无关的程序设计语言(Ma-chine-independent Language),通常称为高级语言(High-level Language)。由于计算机只能够理解机器语言,可直接执行用机器语言编写的程序,而用汇编语言和高级语言编写的程序,机器不能直接执行,必须将它们翻译成功能完全等价的机器语言程序才能执行。这个翻译工作是自动进行的,由一个特殊的程序来完成。将汇编语言的程序翻译为机器语言程序的程序称为汇编程序(Assembler),又称为汇编器;将高级语言程序翻译为低级语言程序的程序称为编译程序(Compiler),又称为编译器。编写一个高级语言的编译程序的工作,通常称为对这个语言的实现。
每种高级语言都有一个不大的字汇表(Vocabulary)及构造良好的语法(Syntax)规则和语义(Semantics)解释。规定这些基本属性,便于实现高级语言程序到低级语言程序的机器翻译。高级语言较接近于数学语言和自然语言,它具有直观、自然和易于理解的优点。用高级语言编写的程序易读、易写、易交流、易出版和易存档。由于易理解,使程序员容易编出正确的程序,以便验证程序的正确性,发现错误后也容易修改。因此,用高级语言开发软件的成本比用低级语言低得多。今天,绝大多数的软件都是用高级语言开发的,因此,高级语言是软件开发的最重要工具。
由于高级语言独立于机器,用高级语言编写的程序很容易从一种机器应用到另一种机器上,因而具有较好的可移植性(Portability)。
高级语言至今还没有完全取代低级语言,在一些场合还必须使用机器语言或汇编语言,例如编译程序的目标程序和各种子程序,以及实时应用系统中要求快速执行的代码段等。但是,随着功能强大且具有高级语言和汇编语言特性的C语言的出现,使应用汇编语言的人越来越少。
人们在进行科学研究的过程中,总是对具体现象和事物进行观察、分析和综合,以发现它们的重要性质和特征,建立相应的模型。这种通过观察、分析和综合建立模型的过程称为抽象(Abstract)。利用抽象模型,人们可以把注意力集中在有关的性质和特征上,忽略那些不相干的因素。本书在后面的讨论中,大量使用抽象的方法阐述程序设计语言的概念和结构,然后以各种语言中的具体实例来说明这些概念和结构,从而教会读者如何去设计一个程序设计语言。事实上,程序设计语言中处处都使用了抽象概念,例如变量(Variable)是存储单元(Memory Cell,Memory Location)的抽象;子程序(Subroutine或Subprogram)是一段多处重复执行的程序段的抽象等。
在此,我们讨论的对象是高级语言,接下来利用抽象的方法讨论高级语言具有的共性概念和结构以及它们的属性。为了叙述简洁,在不引起混淆的情况下,以下将高级语言简称为语言。
一种语言涉及设计者、实现者和使用者,有了设计者和实现者,才可能有使用者。读者在中学或进入大学后,已经使用过这种或那种程序设计语言,也就是说,已经是使用者。本书的目标是引导读者成为语言的设计者和实现者。由于教学学时及篇幅的限制,本书仅给出入门知识和技术,读者如果要真正设计或实现一个语言,尚需查阅相关的文献资料,建议感兴趣的读者阅读参考文献[59]。通过本书的学习,读者可以提高鉴赏和评价语言(或语言设计方案)的能力;了解语言的重要概念、功能和限制,以便具有为某个目的选择一种恰当语言的能力;具有设计一种语言或扩充现有语言的能力;初步具有实现一个语言的能力。最终使读者能够鉴赏、分析、选择、设计和实现程序设计语言。