710 likes | 971 Views
高级程序设计语言原理. 梅 宏. 办公室:理科楼一号 1620 房间 电话: 62753048 EMAIL : meih@pku.edu.cn. 课程目的: 1 .了解高级程序设计语言发展历史及现状 2 .了解高级程序设计语言的基本概念和原理 3 .了解高级程序设计语言实现技术及原理 4 .了解若干主要的高级程序设计语言 授课方式: 课堂讲授和研究分析论文相结合 教材与参考书:
E N D
高级程序设计语言原理 梅 宏 办公室:理科楼一号1620房间 电话:62753048 EMAIL:meih@pku.edu.cn
课程目的: • 1.了解高级程序设计语言发展历史及现状 • 2.了解高级程序设计语言的基本概念和原理 • 3.了解高级程序设计语言实现技术及原理 • 4.了解若干主要的高级程序设计语言 • 授课方式: • 课堂讲授和研究分析论文相结合 • 教材与参考书: • 1. Terrence W. Pratt & Marvin V. Zelkowitz, Programming Languages: Design and Implementation, 3rd Edition, Prentice Hall, Englewood Cliffs, New Jersey, 1996 • 2. 招兆铿,朱洪,程序设计语言原理,上海科技文献出版社,1998 • 3. 徐家福,吕建,软件语言及其实现,科学出版社,2000 • 考核方法: • 研究分析报告占30%,期末考试占70%
第一章 程序设计语言研究
什么是语言: • 语言是信息交流工具。有如下几种定义: • 1、Webster字典定义 • An artificially constructed primarily formal system of signs and symbols (as symbolic logic) including rules for the formation of admissible expressions and for their transformation • 基于一组记号与符号由人工构造的(基本上是)形式化的系统(如符号逻辑),包括合法表达式的形成规则和转换规则。 • 2、Longman字典定义 • Any system of signs, movements, etc., used to express meanings or feelings • 任何表情达意的记号系统。
3、英汉双解计算机辞典定义(清华大学出版社)3、英汉双解计算机辞典定义(清华大学出版社) • A set of characters, conventions and rules, that is used for conveying information. The three aspects of language are pragmatics, semantics and syntax • 一种用于传递信息之字符、约定和规则的集合。语言的三个方面是语用、语义和语法。 • 4、中国大百科全书,电子学与计算机卷 • 语言的基础是一组记号和一组规则,根据规则由记号构成之记号串的总体就是语言。 • 5、徐家福:软件语言及其实现 • 语言是基于一组记号与一组规则、根据规则由记号构成之记号串的总体。任何语言均包括语法、语义和语用三个方面。
语言的作用 • 描述作用、交流作用和标志作用(软件语言可作为计算技术发展的里程碑标志) • 语言是人类生活的必要工具,不同的语言被使用于不同的领域和方面 • 在计算领域,也存在不同层次的语言,本书所论及的是实现层次的语言,即程序设计语言。 • 程序设计语言=字符集+规则集(用于组合字符) • 任何用于描述算法和数据结构的一套符号系统均可称为程序设计语言 • 本课程研究的对象: • 主要考虑那些在计算机上实现的程序设计语言
术语所界定的范围: • 术语“程序设计语言”并没有一个公认的范围定义 • 通常这个术语是指高级语言 • 计算机上语言的层次 : Byte或word,指令、数据不分 纯二进制 用一些符号来代表指令,如sub代表减, Add代表加等,机器地址用十进制。有 时汇编语言等同于符号机器码。 机器码或符号机器码 变量名用符号,地址也可用符号而非数字。 编制的程序称为汇编程序。 符号汇编语言 用户可以定义新指令及子程序 宏汇编语言 源程序编译为目标程序,或解释执行 高级语言 高级程序语言的高层规约语言,提供比高级 程序语言更高级的语言设施。又称为“可执行 的规约语言”。有时也不区别于高级语言。 甚高级语言
程序设计语言的四个基本特征: • 1、用户不需要具有机器代码的知识,只需学习特定的程序设计语言,并独立于任何特定的机器代码而使用。这并不意味着用户可以完全忽略实际的计算机,如:需知道浮点数的表示或使用某些机器资源。 • 2、程序设计语言必须有较大程度的机器独立性(完全的机器独立性)。这意味着必须有较大潜力,使得源程序可运行在具有不同机器代码的两台计算机上,不需要完全重写。 • 3、当源程序翻译成机器代码时,通常对每个执行单元有多个机器指令,如:A=A+B需多个机器指令来实现 • 4、程序设计语言的记号比机器语言更接近于被求解的问题。 如:A=A+B比其机器翻译更易于理解。
1.1 为什么研究程序设计语言 • 两个基本观察: • 1、已有数百种语言被设计和实现。在1969年,Sammet就列出了当时120种相当广泛使用的语言,在此以后,又有很多语言被开发。在早期,为一个项目的进行而开发一种语言是常有的事。 • 2、大多数程序员通常不会同时使用多种语言,一般限制到1~2种。事实上,都是直接使用计算机上已有的语言如C、Ada、 Fortran等。 • 既然如此,为什么要去研究各种不同的语言, • 有的语言甚至永远不可能再被使用? • 学习、研究程序设计语言的理由 • 不仅仅是停留于肤浅的对语言特性的了解和考虑 • 深入了解根本性的语言设计概念及它们对语言实现的影响
1、提高开发有效算法的能力 • 很多语言提供的特性如果被合适地使用,会给程序员带来益处,但如被不合适地使用,将可能导致大量计算机时间浪费或使程序员出现耗时的逻辑错误。 • 有可能一个长期使用某一语言的程序员也并不理解该语言的所有特性。 • 如递归特性:是一个非常便利的程序设计语言特性 • 如正确、合适使用,可得到优美和高效算法的直接实现。 • 如不正确使用,将可能导致执行时间的天文数字增长。 • 如果程序员不知道递归蕴含的设计问题和实现困难,将难于使用这种结构;对递归原理和实现技术的了解可使程序员了解在特定语言中的递归的相对代价并通过其理解确定其使用是否合适。 • 新的程序设计方法不断在文献中引入,如OO程序设计,逻辑程序设计和并发程序设计的使用均需要对实现这些概念的语言的详细了解和掌握。
2、改善对现行程序设计语言的使用 • 通过对语言特性的实现细节的了解,可大大增加书写高效的程序的能力。 • 如: • 对数据结构,诸如数组、串、表、记录等,如何被创建和操作的了解 • 对递归的实现细节 的了解 • 以及对对象类如何被创建的了解 • 将对书写高效程序有很大帮助
3、增加可使用的有用的程序设计结构的词汇量3、增加可使用的有用的程序设计结构的词汇量 • 语言对思维既有帮助,也有限制 • 人们使用语言去表达思想,但语言也控制人如何思维,用字句中没有直接表达的方式来思维是十分困难的。 • 在解决一个问题时,要寻找合适的数据和程序结构,通常人们首先考虑他熟悉的语言中可直接表达的结构。 • 研究各种语言提供的结构和这些结构被实现的方式,程序员可增加其编程词汇。 • 对实现技术的了解非常重要。如要使用一个结构,该结构在语言中没有直接提供,程序员必须提供自己的实现(使用语言提供的基本结构)。 • 如子程序控制结构、协同例程(coroutine)在很多程序中有用,但很少有语言直接提供协同例程特性。 • C或Fortran程序员可以设计程序来使用协同例程结构,然后将它们实现为C或Fortran程序(如果熟悉相关概念及实现)从而可以提供大型程序的正确控制结构。
4、允许更好地选择语言 • 对程序设计语言知识的掌握可以允许程序员针对特定的项目,恰当地选取合适的语言,从而减少编码工作量。如:C、Fortran、Ada可用于数值运算,Lisp、ML、Prolog可用于人工智能应用。对每种语言的特性的长处和弱点的了解和掌握有利于程序员做出广泛而正确的选择。 • 5、更易于学习新语言 • 对自然语言语法结构的学习和了解可使对新语言的学习更容易 • 对程序设计语言各种结构和实现技术的了解,也可使程序员能够在需要时更容易地学习新语言
6、更易于设计新语言 • 很少有程序员把自己考虑为语言设计者,然而,任何程序都有一个用户界面,这事实上也是某种形式的程序设计语言,用户界面包括提供给用户用于和程序通讯的命令和数据格式。 • 大型程序,如文本编辑器、操作系统、图形包的用户界面的设计者,必须考虑很多存在于通用程序设计语言设计中的相同问题。 • 如果程序员熟悉一般程序设计语言中的结构和实现方法,则程序设计将可以大为简化。 • 总之,程序设计语言的研究十分重要,包括语言特性和实现技术(特别是不同结构的运行时表示技术)等主要研究内容。
程序设计语言的优点 • 比机器或汇编语言更易于学习。 • 这涉及很多方面的问题,如一个极端强大的程序设计语言可能比一个只有十几条指令的机器的汇编语言更难学。但给定基本相同的复杂度,程序设计语言更易学(记号更接近问题域;更少关心物理硬件) • 程序设计语言书写的程序更易于调试debug(程序更为短小;记号本身更自然,因此更多注意力可放在程序逻辑而非语法细节上)。 • 程序更易于理解 • 程序设计语言的记号自然起到了文档的作用 • 上述原因导致解决问题的时间和代价减少。
程序设计语言的缺点 • 编译过程需要机器时间, • 它可能超过易于调试所节省的时间 • 编译器可能产生低效的代码 • 如果用户不知道机器代码或编译器未提供合适的调试工具, • 则程序调试可能非常困难。
程序设计语言的分类 • 这是一个非常困难的问题,并没有公认的定义。这里给出一些术语,有些是相互交迭的,一个语言可能归属于两个类别。 • 面向过程的语言(procedure-oriented) • 用户刻划一个可执行操作集合,它将以某种顺序完成,从而刻划了一个过程。关键因素是这些明确可执行的操作,执行顺序由用户确定。 • 非过程型语言(nonprocedural) • 这只是一个相对的术语,没有人定义过,也不可能定义。意指用户指定的顺序步骤的减少程度,越接近于用户只陈述问题而不指定求解步骤,语言就越是非过程的。 • 更进一步,可以有一个有序的步骤序列,其中每一步是某种程度上非过程性的,或是一个可执行操作的集合,其顺序用户并没有指定。两种情形均导致更多的非过程性。
在Fortran出现前, • 语句Y=A+B*C-D/E被认为是非过程性的。 • 因为它不能写成一个可执行单元和被任何系统翻译。 • 随着编译系统的发展,过去非过程的今天变成过程的, • 而今天非过程的,明天可能是过程的。 • 当今非过程系统的例子如: • RPG(报告生成器)或排序生成器, • 只需给定输入和希望的输出即可,过程将被自动完成。 • 说明型语言(Declarative Language)——完全非过程的 • 程序只定义做什么,不需指定如何做,如函数式(归约)、逻辑式(归结、合一)语言及其它甚高级语言。
面向问题的语言(problem-oriented) • 该术语有不同解释和用法,最常见用法是强调一个语言易于对特定问题求解(相对汇编语言),很多人将其用于针对非常特殊的应用领域。 • 面向应用的语言(Application-oriented) • 这是极易误解的、但广为使用的术语。实际上,所有语言均是面向应用的,只是领域大小不同罢了。 • 如:Fortran适合数值科学计算,Cobol适合商业数据处理 • PL/1则二者均适合,领域更广,又称通用(general purpose)语言,实际上很少有真正通用的语言 • 一般考虑:数值科学应用,非数值应用(如形式代数),商业数值处理,串、表处理等 • 更特殊的领域:网形、仿真、数控、设备检查等
专用语言(special purpose) • 用于满足单一的目标(指定领域;对特殊应用易用;提高效率等) • 问题定义或规约语言(problem-defining, specification) • 文字地定义问题,或特别定义输入、输出,但不定义变换方法 • 问题求解语言(problem-solving) • 可以完整地刻划一个问题的求解,这也是一个相对的术语
标注语言(reference) • 是一个确定的字符集,具有语言的格式。通常用唯一字符表示某概念或语言中的字符,不一定要适合计算机输入。通常包含英文单词(作为多单个字符),也可能提供固定符号集。不需要易读。 • 出版语言(publication) • 标注语言的变种,如A↑2变成A2。 • 硬件语言(hardware) • 又称hardware representation,是标注语言直接映射到合适的格式以利于计算机直接输入。 • 硬件语言本身和标注语言必须有很好映射,如**作为↑的硬件表示,begin用‘BEGIN’表示等
1.2 程序设计语言简史 • 程序设计的历史很复杂,至今已很难于拟出一条全面清晰的发展轨迹。已有各种不同的总结方式。1978年,ACM Special Interest Group on Programming Language (SIGPLAN)召开了一个会议,HOPL(History of Programming Language),专门研讨语言发展历史。 • 程序语言的早期发展 • 语言发展可追溯到1945年,德国的Konrad Zuse设计了“Plankalkul”,未实现。 • 1954年,Laning和Zierler开发了一个用于数学计算的高级语言,运行于M.I.T的Whirlwind上,这大概是第一个运行的编译器。它可以书写数学表达式(具有上、下标)、赋值、分叉、输入/输出、子程序,并处理微分方程。
第一个广泛使用的高级语言是Fortran。 • IBM的John Backus领头在50年代中期完成,初衷是解决科学及工程计算,但后也用于更多领域,甚至写编译器。该语言证明了高级语言的可行性,奠定了后来语言研究的基础。 • 1958年,ACM和欧洲的GAMM联合开发用于算法处理的语言IAL(International Algebraic Language),最终修改变成了Algol60(早点的版本是Algol58),Algol58和Algol60导致了很多相关的程序设计语言研究和编译技术开发的发展。在实践方面Fortran有很大影响,但Algol带动了语言的理论研究热潮。 • 50年代中期,Remington Rand Univac的Grace Hopper及其同事设计了Flow-Matic,该语言面向商业数据处理,这是第一个面向英语的语言,并成为Cobol的主要源泉。
1959年,在DoD赞助下,组织了一批计算机制造商和用户开发了Cobol(Common Business Oriented Language),该语言在商业数据处理领域的影响甚至大于Fortran在科学计算领域的影响。 • 1958、1959可能是语言历史上生产率最大的两年。 • M.I.T的Victor Yngve开发了Comit,这是串处理语言,用于翻译自然语言。M.I.T的John McCarthy和其学生开发了人工智能语言Lisp。Lisp至今仍在使用,Comit后来变成了Snobol(Bell电话实验室于60年代中期开发) • 科学计算和数据处理是计算机早期的主要应用,语言也是如此,向跨两个领域的通用性发展。 • 1959-1960,System Development Corporation和Jules Schwartz在Algol58基础上开发了Jovial,这是第一次通用性尝试。
1963-1964,IBM和SHARE的一个联系计划开发了第一个通用语言(跨两个领域)PL/I。1963-1964,IBM和SHARE的一个联系计划开发了第一个通用语言(跨两个领域)PL/I。 • Algol68是随后的一个大的语言计划,这是一个全新的开发,而不仅仅是升版,其主要特性是正交性,它定义了少量的基本特征和组合它们的系统规则,允许程序员定义新的数据类型及操作。 • 下一个大的语言计划是,1975年开始的DOD项目,目标是开发适合于嵌入式计算机系统的语言,此即Ada。1979年开始发布,1980年定稿,成为后期开发、实现和标准化的基础,Ada不仅仅是适合嵌入系统,可有更广用途。 • 随着交互计算系统的出版,适合交互环境的语言开始出现。 • 1963年,Rand Corporation的J. Cliff Shaw开发了Joss.。 • 1964年,Dartmouth College的John Kemeny和Thomas Kurtz开发了广为流传的Basic。
针对非数值数学计算(如形式代数操作)的需要。针对非数值数学计算(如形式代数操作)的需要。 • IBM的Jean Sammet于1962-1964开发了Formac。 • MIT的Joel Moses于1970年代早期开发了Macsyma。 • 专用领域语言开发。 • 1956年,MIT的Douglas Ross为机床控制开发了APT。 • 其他有:civil engineeriy: Cogo • computer-assisted instruction: Coursewriter • equipment checkout: Atlas。 • 1967~1977,在美国,在给定年度内使用的语言数大概是170种,同时,每年或每两年有25—30的增减。
1978年HOPL会议,讨论的语言满足如下标准: • a.1967年时已出版并被使用。 • b.1977年仍在使用。 • c.在计算领域有很大影响。 • 选出的语言有: • Algol, Apl, APT, Basic, Cobol, Fortran, GPSS, Joss, • Jovial, Lisp, PL/I, Simula, Snobol。 • 80年代的两个重要语言PASCAL(Niklaus Wirth, 1968)和Ada未列入。 PASCAL在70年代后期成为非常重要的语言,特别是在计算机教学方面。
E.Sammet在“Programming Language: History and Future”,Communications of the ACM中列出了若干代表性语言: • APT(Automatically Programmed Tools) • 1956,第一个专用领域语言。 • Fortran(FORmula TRANslation) • 1956,第一个广泛使用的高级语言,为大量的科学和工程人员打开了使用计算机的大门。 • Flow-Matic • 1956,第一个商业数据处理语言,第一次强调“类英文”的语法。 • IPL-V(Information Processing Language V) • 1958,第一个表处理语言。
Comit • 1957,第一个实用的串处理和模式匹配语言。 • Cobol(Common Business-Oriented Language) • 1960,最广泛使用的数据处理语言。具有类英文的语法和机器独立性。 • Algol60(ALGOrithmic Language) • 1960,用于刻划算法。形式化语法定义,带动了语言的理论和实现技术研究。 • Lisp(LISt Processing) • 1960,引入了函数程序设计概念,基于表处理。 • Jovial(Jules Own Version of IAL) • 1960,第一次包含了科学计算,I/O信息的逻辑操作、数据存贮和处理等能力。大多数Jovial编译器用Jovial书写。
GPSS(General-Purpose System Simulator) • 1961,第一个仿真语言。 • Joss(JOHNNIAC Open-Shop System) • 1964,第一个交互式语言。 • Formac(FORmula Manipulation Compiler) • 1964,第一个广泛使用的形式代数操作语言。 • APL/360(A Programming Language) • 1967,引入了许多高级操作子,允许很短的算法,产生了看问题的新方式。 • Pascal • 1971,在一个小语言中引入了如赋类型的新概念,并以优美方式组合了各种著名结构。
程序设计语言的角色 • 早期,计算机非常昂贵,而程序员年薪不高,关键资源是计算机。因此,语言设计是为了更高效地执行程序,高级语言需和汇编语言竞争。 • Fortran的主要设计者Backus在Fortran面世十年后曾说: • 坦率地讲,我们当时未曾有过任何最模糊的关于FORTRAN及其编译器将如何工作的想法。我们只是简单地努力优化目标程序,运行时间,因为当时大多数人不相信你可以真正完成这样的事。他们认为机器编码的程序将是极端低效的,对很多应用都是不实用的。 • 我们未曾想到的一个结果是:有这样一个系统,它被设计为完全独立于程序将最终运行于其上的机器。这后来证明是非常有价值的能力,但当时我们肯定未曾想到。 • 我们的活动没有任何组织。程序的每个部分由一到二人完成,除了极少数例外,他们完全负责他们所做的事情。事情无序地发展,当FORTRAN发布时,我们面临这样一个事实:25000条指令将并不是全正确的,存在着大量将在大量使用后才会显示出来的问题。
60年代中期,程序设计发生了变化,机器价格下降,程序设计价格上升。程序移植的需求越来越多,软件的维护占用了大量的计算资源。此时的目标不再是编译程序后使其高效地运行,高级语言的任务变成使其易于开发正确的程序以解决某给定应用领域中的问题。60年代中期,程序设计发生了变化,机器价格下降,程序设计价格上升。程序移植的需求越来越多,软件的维护占用了大量的计算资源。此时的目标不再是编译程序后使其高效地运行,高级语言的任务变成使其易于开发正确的程序以解决某给定应用领域中的问题。 • 编译技术成熟于60、70年代,语言技术以解决特定领域问题为中心,如:Fortran用于科学计算,COBOL用于商业应用,JOVIAL用于军事应用,LISP用于人工智能应用,以及Ada用于嵌入式军事应用等。 • 程序设计语言也会进化和消亡,如:Algol已不再使用,Cobol使用正在下降,Pascal的很多结构仍在Ada中存在,但其黄金时代已过去。 • 仍在使用的旧语言也经历了不断的修订以反应来自其他计算领域的影响,Fortran和Cobol已有多个标准化标本。Ada有1995年新标准。Lisp修订后有Scheme和Common Lisp。C++和ML则反应了人们在设计和使用语言中获得的经验的混合。
对语言的主要影响源自如下几个方面: • 1、计算机能力 • 计算机经历了数代的巨大变化,操作系统成为语言基于的平台(不再仅依靠硬件)。这些因素影响了高级语言的结构和使用语言特性的代价。 • 2、应用 • 应用领域有了很大变化,计算机应用已渗透到几乎所有领域,新应用的需求影响了新语言的设计和旧语言的修订。特别是近几年,INTERNET的发展进一步拓广的应用范围。 • 3、程序设计方法 • 人们对书写大型复杂系统的方法的深入研究和程序设计环境的变化也影响语言的发展。
4、实现方法 • 更好的实现方法影响到新语言中特性的选择。 • 5、理论研究 • 使用形式化的数学方法,对语言设计和实现的概念基础的研究加深了我们对语言特性的优势和弱点的理解,从而影响语言中特性的选取,如“继承”,因语义复杂,而被有的语言放弃。 • 6、标准化 • 标准化语言需要易于在不同计算机上实现,使程序易于移植,这对语言的设计影响是保守的,即轻易不引入新特性。
一些重要的语言和技术影响: • 1951-55: • 硬件:电子管计算机,水银延迟线内存 • 方法:汇编语言,基础概念:子程序,数据结构 • 语言:表达式编译器的实验性使用 • 1956-60: • 硬件:磁带存储器,磁芯内存,晶体管电路 • 方法:早期编译技术,BNF文法,代码优化,解释器,动态存储方法和表处理 • 语言:FORTRAN,ALGOL 58,ALGOL 60,COBOL,LISP
1961-65 • 硬件:可兼容的体系结构家族,磁盘存储器 • 方法:多道程序设计操作系统,语法制导的编译器 • 语言:COBOL 61,ALGOL 60(修订),SNOBOL,JOVIAL,APL符号体系 • 1966-1970 • 硬件:增加尺寸和速度并降低成本,小型计算机,微程序设计,集成电路 • 方法:分时和交互式系统,优化编译器,翻译器书写系统 • 语言:APL,FORTRAN 66,COBOL 65,ALGOL 68,SNOBOL 4,BASIC,PL/1,SIMULA 67,ALGOL-W
1971-75 • 硬件:微型计算机,小型计算机时代,小型大规模存储系统,磁性内存的衰落和半导体内存的兴起 • 方法:程序验证,结构化程序设计,软件工程作为一门学科的早期发展 • 语言:PASCAL,COBOL 74,PL/1(标准),C,Scheme,Prolog • 1976-80 • 硬件:商用质量的微机,大型大规模存储系统,分布式计算 • 方法:数据抽象,形式化语义,并发、嵌入式、和实时程序设计技术 • 语言:Smalltalk,Ada,FORTRAN 77,ML
1981-85 • 硬件:个人计算机,第一代工作站,视频游戏,局域网,Arpanet • 方法:面向对象程序设计,交互式环境,语法制导编辑器 • 语言:Turbo Pascal,Smalltalk 80,Prolog的发展,Ada 83,Postscript • 1986-90 • 硬件:微机时代,工程工作站的上升,RISC体系结构,全域网,Internet • 方法:客户/服务器计算 • 语言:FORTRAN 90,C++,SML(标准ML)
1991-95 • 硬件:非常快的廉价工作站和微机,大规模并行体系结构,语音,视频,传真,多媒体 • 方法:开放系统,环境框架,国家信息基础设施(信息高速公路) • 语言:Ada 95,过程语言(TCL,PERL) • 1996-2000 • 硬件:二代Internet,机群,网络计算机(NC) • 方法:软件构件技术,Agent,中间件,浏览器/服务器计算,Internet计算 • 语言:JAVA,XML,IDL(后两种一个意义上不能算为程序设计语言)
1.3 程序设计语言的评价 • 好语言的属性 • 1、清晰、简单、一致(协调) • 程序设计语言既是思考算法的概念框架,又是表达算法的工具。语言对程序的帮助不仅在编码阶段,还会在此阶段前较长一段时间,均有帮助。语言应该是提供清晰、简单、一致的概念,用作算法开发的基本原语。因此,希望有最少数量的不同概念及其尽可能简单和规则的组合规则,称为概念完整性。 • 语言的语法对程序的书写、测试、理解和修改有较大影响,因此,可读性是一个中心问题。特别精简或隐义的语言使程序易于书写(对有经验的程序员),但难于读(当要修改时),如APL,甚至程序员本人过一段间后也难读懂。有的语言几乎相同的语句实际上代表了完全不同的事。因此,一条基本原则是,语义不同应在语法中完全反映出来。
2、正交性 • 意味着可以以所有可能的方式来组合语言特性以得到有意义的组合结果,如条件语句和任意表达式的组合。 • 正交性使语言易学,程序易写,因为不需记住太多的例外和特殊情况,缺点是:逻辑上不协调或极端低效的组合可能会被编译器忽略。 • 正交性在语言设计中是一个有争议的属性。 • 3、应用自然性 • 语言的语法应使得正确的使用可以允许程序结构反映出算法的逻辑结构。理想地:直接将程序的设计翻译为合适的反映算法结构的程序语句。顺序算法、并发算法、逻辑算法等各有不同的自然结构。 • 语言应提供合适的数据结构、操作、控制结构和面向问题的自然语法。语言流行的主要原因之一便是对自然性的需要。 • 特别适合某类应用的语言将大大简化该领域程序的创建,如Prolog适合于推导,C++适合于OO设计。
4、对抽象的支持 • 即使对最自然的语言,在刻划问题求解的抽象数据结构和操作与语言固有的特别的基本数据结构和操作间总是存在着差距。 • 如C可能是一个合适的用于构造大学课程调度应用的语言,但抽象的数据结构如“学生”、“课程”、“授课老师”、“教室”等以及抽象操作“分配某学生到某课程”,“安排某课在某教室”等并不在C语言中提供,而它们对应用本身是非常自然的。 • 程序员的任务之一便是为问题求解设计合适的抽象,然后用实际语言提供的更基本的特性来实现这些抽象。 • 理想地:语言应允许数据结构、数据类型和操作作为自包含的抽象而定义,程序员可以将它们用在程序的其他部分(只需了解其抽象性质,而无需知道实现细节)。
5、程序易于验证 • 程序的可靠性总是一个中心的问题,有很多技术验证一个程序是否正确地完成所需功能。 • 程序可以用形式化方法证明是正确的, • 也可以用桌面检查方式非形式地证明正确性(读程序文本) • 也可以用测试的方法,用测试数据输入,检查输出结果是否满足规约, • 对大型程序,可能需要这些方法的组合 • 语言应该对程序验证提供支持,其支持力度是选择语言的主要标准之一。 • 语义和语法结构的简单性是简化程序验证的主要因素。
6、编程环境 • 语言的技术结构仅仅是影响其使用的一个方面,而合适的编程环境可以弥补语言技术上的弱点。 • 编程环境包含很多因素: • 可靠的、有效的、有良好文档的语言实现自然是首要因素。 • 特殊的编辑器和测试包可以加速程序的创建和测试。 • 维护和修改程序的多个版本的机制有利于大型程序的开发。 • 7、程序的易移植性 • 程序的易移植性是很多项目的重要目标。 • 广泛使用的和独立于机器特性而定义的语言是易移植性的有用的基础,如:Ada、Fortran、C、Pascal等有标准化定义的语言书写的程序易移植性较好。
8、使用代价 • 代价是评价语言的主要元素,但具有不同的代价度量。 • a. 程序执行代价 • 在早期,代价主要是程序执行代价。因此,优化编译器的实现、高效的寄存器的分配和高效的运行时支持机制的设计是非常重要的。 • 程序执行代价对语言设计是重要的,但主要对将重复执行的大程序更为重要。 • 目前,对很多应用、执行速度不再是主要考虑。 • 对程序开发的更好诊断和更容易的用户控制以及程序的维护也需要考虑,在此情况下,执行时间增加10%—20%,也是可容忍的。
b. 程序翻译代价 • 当Fortran或C等用于教学时,高效的翻译(编译)比高效执行更为重要。通常学生程序会多次编译,而执行次数不多,需要快速、高效的编译器。 • c. 程序生成、测试和使用的代价 • 对某类问题,求解应该在程序员最少投入的情形下被设计、编码、测试、修改和使用。如:Smalltalk是价格有效的,求解一个问题的时间和努力均较少。 • 对使用语言的总代价的考虑在很多情况下变得和传统的代价同等重要。 • d. 程序维护的代价 • 研究表明,对较长时间运行的程序的代价不是初始设计、编码、测试的代价而是整过生命周期代价(涉及开发和维护)。 • 维护包括发现错误的修改、平台的变化所需的修改、程序的扩展和加强。语言对维护的支持是非常重要的(长期运行的程序由多个人员维护,语言应有支持)
语言的应用领域 • 语言的使用依赖于所求解问题的应用领域,过去30年各种应用领域的语言已有很大变化。 • 1、60年代的应用 • 60年代的程序设计可分为四个基本类:商业处理、科学计算、系统程序设计、人工智能应用。 • 商业处理 • 这类应用大多是大的数据处理系统,运行在大型机上,其基本特征是:读大量在多个磁带设备上的历史数据,读少量的当前事务集,写出一个新的历史数据集。 • COBOL是这类应用的代表语言。 • 商业应用还包括商业计划、风险分析和“ What if ”方案(60年代,这样一个应用通常需几个月)。 • 科学计算 • 主要用于各种数学方程的求解,包括数值分析、微积分求解、统计,这是计算机的第一个应用领域,Fortran是最流行语言,其语法接近数学。
系统 • 操作系统和编译器 • 这类应用要求能够访问硬件的全部功能和资源,当时没有有效的语言存在。汇编语言是主要的选择。 • Jovial(Algol的变体)曾用于美国DoD的一些项目,60年代末,PL/I可用于此目的。 • 一个相关的应用领域是过程控制,由于当时计算机的庞大和昂贵,大多数过程控制应用是非常大的,如电站控制和自动装配线控制。Forth语言专为此而设计,汇编语言也常被使用。 • 人工智能 • 其特征是对大的数据空间的搜索算法。 • LISP是主要语言。
2、90年代的应用 • 当前的情况远较过去复杂,有更多的应用领域,可选语言也更多。 • 商业处理 • COBOL仍然是主要语言,C和PL/1也时常被使用 • 然而“What if”方案已完全改变,spreadsheet已完全改革该领域 • 过去对典型的商业计划程序需化一个程序员几个月,现在可在几小时内泡制出很多。 • 第四代语言也开始进入此市场。4GL提供了基于窗口的程序员界面,易于访问数据库记录,易于产生填空式的输入表和优美的输出报告,有时4GL编译器产生COBOL程序作为输出。
科学计算 • Fortran仍有较大市场,C开始进入该领域。 • Fortran 90加入了许多Ada和其他语言的特征。 • 系统软件 • 60年代末的C和后来的C++占据了这个领域。 • C提供了非常高效的执行,允许程序员对操作系统和硬件的完全访问,其他语言如:Modula、Pascal、现代BASIC也可用于此。 • Ada以支持系统软件开发为目标,但从未达到其成为此领域主要语言的目标。 • 汇编语言的使用已成为过去。 • 实时语言的需求也在增加,C、Ada、Pascal常用于此。