700 likes | 906 Views
程序设计语言概论. 焦文品 jwp@sei.pku.edu.cn http://www.sei.pku.edu.cn/~jwp/. 课程目的. 了解高级程序设计语言发展历史及现状 了解高级程序设计语言的基本概念和原理 了解高级程序设计语言实现技术及原理 了解若干主要的高级程序设计语言. 课程主要内容. 高级程序设计语言的基本概念、原理、及实现技术 语法 —— 程序看起来像什么 语义 —— 程序的含义是什么 实现 —— 程序是如何执行的 了解求解特定问题最合适的语言,例如: Pascal, C -- 过程式的,面向语句的
E N D
程序设计语言概论 焦文品 jwp@sei.pku.edu.cn http://www.sei.pku.edu.cn/~jwp/
课程目的 • 了解高级程序设计语言发展历史及现状 • 了解高级程序设计语言的基本概念和原理 • 了解高级程序设计语言实现技术及原理 • 了解若干主要的高级程序设计语言
课程主要内容 • 高级程序设计语言的基本概念、原理、及实现技术 • 语法——程序看起来像什么 • 语义——程序的含义是什么 • 实现——程序是如何执行的 • 了解求解特定问题最合适的语言,例如: • Pascal, C -- 过程式的,面向语句的 • C++, Java, Smalltalk -- 面向对象的 • ML, Lisp -- 函数式的 • Prolog -- 基于规则的
课程主要内容 • 围绕高级语言程序的基本性质及构成展开 • 语法、语义 • 编码及运行 • 数据、处理及其抽象 • 数据:简单、复杂 • 处理:语句级(语句内及语句间)、模块级、系统级
授课方式及考核方法 • 授课方式: • 课堂讲授为主 • 考核方法: • 作业占40% • 期末考试占60%
参考书 • Terrence W. Pratt & Marvin V. Zelkowitz, Programming Languages: Design and Implementation, 3rd Edition, Prentice Hall, Englewood Cliffs, New Jersey, 1996 • Robert W. Sebestaa, Concepts of Programming Languages (5th edition), 机械工业出版社,2003。 • 招兆铿,朱洪,程序设计语言原理,上海科技文献出版社,1998 • 徐家福,吕建,软件语言及其实现,科学出版社,2000
主要内容 • 程序设计语言的定义及其特征 • 为什么研究程序设计语言 • 程序设计语言的评价 • 程序设计语言简史 • 代表性语言 • 程序设计语言的角色 • 影响语言的主要因素 • 程序设计语言的范型
什么是语言 (1/4) • 语言是信息交流工具。有如下几种定义: 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/4) 2、Longman字典定义 • Any system of signs, movements, etc., used to express meanings or feelings • 任何表情达意的记号系统。 3、英汉双解计算机辞典定义(清华大学出版社) • A set of characters, conventions and rules, that is used for conveying information. The three aspects of language are pragmatics, semantics and syntax • 用于传递信息的字符、约定和规则的集合。语言的三个方面是语用、语义和语法。
什么是语言 (3/4) 4、中国大百科全书,电子学与计算机卷 • 语言的基础是一组记号和一组规则,根据规则由记号构成之记号串的总体就是语言。 5、徐家福:软件语言及其实现 • 语言是基于一组记号与一组规则、根据规则由记号构成之记号串的总体。任何语言均包括语法、语义和语用三个方面。
什么是语言 (4/4) • 语言的作用 • 描述作用、交流作用和标志作用(软件语言可作为计算技术发展的里程碑标志) • 语言是人类生活的必要工具,不同的语言被使用于不同的领域和方面 • 在计算领域,也存在不同层次的语言,本书所论及的是实现层次的语言,即程序设计语言。 • 程序设计语言=字符集+规则集(用于组合字符) • 任何用于描述算法和数据结构的一套符号系统均可称为程序设计语言
程序设计语言的四个基本特征 1. 用户不需要具有机器代码的知识,只需学习特定的程序设计语言,并独立于任何特定的机器代码而使用。这并不意味着用户可以完全忽略实际的计算机,如:需知道浮点数的表示或使用某些机器资源。 2. 程序设计语言必须有较大程度的机器独立性(完全的机器独立性)。这意味着必须有较大潜力,使得源程序可运行在具有不同机器代码的两台计算机上,不需要完全重写。 3. 当源程序翻译成机器代码时,通常对每个执行单元有多个机器指令,如:A=A+B需多个机器指令来实现 4. 程序设计语言的记号比机器语言更接近于被求解的问题。 如:A=A+B比其机器翻译更易于理解。
本课程研究的对象 • 主要考虑那些在计算机上实现的程序设计语言 • 术语“程序设计语言”并没有一个公认的范围定义 • 通常这个术语是指高级语言 返回
计算机上语言的层次 Byte或word,指令、数据不分 纯二进制 用一些符号来代表指令,如sub代表减,Add代表加等,机器地址用十进制。有时汇编语言等同于符号机器码。 机器码或符号机器码 变量名用符号,地址也可用符号而非数字。 编制的程序称为汇编语言程序。 符号汇编语言 用户可以定义新指令及子程序 宏汇编语言 源程序编译为目标程序,或解释执行 高级语言 高级程序语言的高层规约语言,提供比高级 程序语言更高级的语言设施。又称为“可执行的规约语言”。有时也不区别于高级语言。 甚高级语言 返回
1.1 为什么研究程序设计语言 • 两个基本观察: 1.已有数百种语言被设计和实现。在1969年,Sammet就列出了当时120种相当广泛使用的语言,在此以后,又有很多语言被开发。在早期,为一个项目的进行而开发一种语言是常有的事。 2.大多数程序员通常不会同时使用多种语言,一般限制到1~2种。事实上,都是直接使用计算机上已有的语言如C、Ada、 Fortran等。 • 既然如此,为什么要去研究各种不同的语言, • 有的语言甚至永远不可能再被使用?
学习、研究程序设计语言的理由 • 不仅仅是停留于肤浅的对语言特性的了解和考虑 • 深入了解根本性的语言设计概念及它们对语言实现的影响
学习、研究程序设计语言的理由 (1/6) 1、提高开发有效算法的能力 • 很多语言提供的特性如果被合适地使用,会给程序员带来益处,但如被不合适地使用,将可能导致大量计算机时间浪费或使程序员出现耗时的逻辑错误。 • 有可能一个长期使用某一语言的程序员也并不理解该语言的所有特性。
学习、研究程序设计语言的理由 (1/6) 1、提高开发有效算法的能力 • 如递归特性:是一个非常便利的程序设计语言特性 • 如正确、合适使用,可得到优美和高效算法的直接实现。 • 如不正确使用,将可能导致执行时间的天文数字增长。 • 如果程序员不知道递归蕴含的设计问题和实现困难,将难于使用这种结构;对递归原理和实现技术的了解可使程序员了解在特定语言中的递归的相对代价并通过其理解确定其使用是否合适。 • 新的程序设计方法不断在文献中引入,如OO程序设计,逻辑程序设计和并发程序设计的使用均需要对实现这些概念的语言的详细了解和掌握。
学习、研究程序设计语言的理由 (2/6) 2、改善对现行程序设计语言的使用方式 • 通过对语言特性的实现细节的了解,可大大增加书写高效的程序的能力。如: • 对数据结构,诸如数组、串、表、记录等,如何被创建和操作的了解 • 对递归的实现细节的了解 • 以及对对象类如何被创建的了解 • 将对书写高效程序有很大帮助
学习、研究程序设计语言的理由 (3/6) 3、增加可使用的有用的程序设计结构的词汇量 • 语言对思维既有帮助,也有限制 • 人们使用语言去表达思想,但语言也控制人如何思维,用字句中没有直接表达的方式来思维是十分困难的。 • 在解决一个问题时,要寻找合适的数据和程序结构,通常人们首先考虑他熟悉的语言中可直接表达的结构。 • 研究各种语言提供的结构和这些结构被实现的方式,程序员可增加其编程词汇。
学习、研究程序设计语言的理由 (3/6) 3、增加可使用的有用的程序设计结构的词汇量 • 对实现技术的了解非常重要。如要使用一个结构,该结构在语言中没有直接提供,程序员必须提供自己的实现(使用语言提供的基本结构)。 • 如子程序控制结构、协同例程(coroutine)在很多程序中有用,但很少有语言直接提供协同例程特性。 • C或Fortran程序员可以设计程序来使用协同例程结构,然后将它们实现为C或Fortran程序(如果熟悉相关概念及实现)从而可以提供大型程序的正确控制结构。
学习、研究程序设计语言的理由 (4/6) 4、更好地选择程序设计语言 • 对程序设计语言知识的掌握可以允许程序员针对特定的项目,恰当地选取合适的语言,从而减少编码工作量。如:C、Fortran、Ada可用于数字运算,Lisp、ML、Prolog可用于人工智能应用。对每种语言的特性的长处和弱点的了解和掌握有利于程序员做出广泛而正确的选择。
学习、研究程序设计语言的理由 (5/6) 5、更易于学习新语言 • 对自然语言语法结构的学习和了解可使对新语言的学习更容易 • 对程序设计语言各种结构和实现技术的了解,也可使程序员能够在需要时更容易学习新语言
学习、研究程序设计语言的理由 (6/6) 6、更易于设计新语言 • 很少有程序员把自己考虑为语言设计者,然而,任何程序都有一个用户界面,这事实上也是某种形式的程序设计语言,用户界面包括提供给用户用于和程序通讯的命令和数据格式。 • 大型程序,如文本编辑器、操作系统、图形包的用户界面的设计者,必须考虑很多存在于通用程序设计语言设计中的相同问题。 • 如果程序员熟悉一般程序设计语言中的结构和实现方法,则程序设计将可以大为简化。
学习、研究程序设计语言的理由 • 总之,程序设计语言的研究十分重要,包括语言特性和实现技术(特别是不同结构的运行时表示技术)等主要研究内容。 • 理解 • 使用 • 设计和实现 返回
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上,这大概是第一个运行的编译器。它可以书写数学表达式(具有上、下标)、赋值、分叉、输入/输出、子程序,并处理微分方程。
程序设计语言简史 (1/5) • 第一个广泛使用的高级语言是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的主要源泉。
程序设计语言简史 (2/5) • 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,这是第一次通用性尝试。
程序设计语言简史 (3/5) • 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。
程序设计语言简史 (4/5) • 针对非数值数学计算(如形式代数操作)的需要。 • IBM的Jean Sammet于1962-1964开发了Formac。 • MIT的Joel Moses于1970年代早期开发了Macsyma。 • 专用领域语言开发。 • 1956年,MIT的Douglas Ross为机床控制开发了APT。 • 其他有: • civil engineer iy: Cogo • computer-assisted instruction: Coursewriter • equipment checkout: Atlas。 • 1967~1977,在美国,在给定年度内使用的语言数大概是170种,同时,每年或每两年有25—30的增减。
程序设计语言简史 (5/5) • 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年代后期成为非常重要的语言,特别是在计算机教学方面。 返回
代表性语言(1/3) • 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,第一个表处理语言。
代表性语言(2/3) • 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书写。
代表性语言(3/3) • 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条指令将并不是全正确的,存在着大量将在大量使用后才会显示出来的问题。
程序设计语言的角色 (2) • 60年代中期,程序设计发生了变化,机器价格下降,程序设计价格上升。程序移植的需求越来越多,软件的维护占用了大量的计算资源。此时的目标不再是编译程序后使其高效地运行,高级语言的任务变成使其易于开发正确的程序以解决给定应用领域中的问题。 • 编译技术成熟于60、70年代,语言技术以解决特定领域问题为中心,如:Fortran用于科学计算,COBOL用于商业应用,JOVIAL用于军事应用,LISP用于人工智能应用,以及Ada用于嵌入式军事应用等。
程序设计语言的角色 (2) • 程序设计语言也会进化和消亡,如:Algol已不再使用,Cobol使用正在下降,Pascal的很多结构仍在Ada中存在,但其黄金时代已过去。 • 仍在使用的旧语言也经历了不断的修订以反应来自其他计算领域的影响,Fortran和Cobol已有多个标准化标本。Ada有1995年新标准。Lisp修订后有Scheme和Common Lisp。C++和ML则反应了人们在设计和使用语言中获得的经验的混合。 返回
影响语言的主要因素 (1) 1、计算机能力 • 计算机经历了数代的巨大变化,操作系统成为语言基于的平台(不再仅依靠硬件)。这些因素影响了高级语言的结构和使用语言特性的代价。 2、应用 • 应用领域有了很大变化,计算机应用已渗透到几乎所有领域,新应用的需求影响了新语言的设计和旧语言的修订。特别是近几年,INTERNET的发展进一步拓广的应用范围。 3、程序设计方法 • 人们对书写大型复杂系统的方法的深入研究和程序设计环境的变化也影响语言的发展。
影响语言的主要因素 (2) 4、实现方法 • 更好的实现方法影响到新语言中特性的选择。 5、理论研究 • 使用形式化的数学方法,对语言设计和实现的概念基础的研究加深了我们对语言特性的优势和弱点的理解,从而影响语言中特性的选取,如“继承”,因语义复杂,而被有的语言放弃。 6、标准化 • 标准化语言需要易于在不同计算机上实现,使程序易于移植,这对语言的设计影响是保守的,即轻易不引入新特性。
软硬件技术对语言的影响 (1) • 1951-55: • 硬件:电子管计算机,水银延迟线内存 • 方法:汇编语言,基础概念:子程序,数据结构 • 语言:表达式编译器的实验性使用 • 1956-60: • 硬件:磁带存储器,磁芯内存,晶体管电路 • 方法:早期编译技术,BNF文法,代码优化,解释器,动态存储方法和表处理 • 语言:FORTRAN,ALGOL 58,ALGOL 60,COBOL,LISP
软硬件技术对语言的影响 (2) • 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
软硬件技术对语言的影响 (3) • 1971-75 • 硬件:微型计算机,小型计算机时代,小型大规模存储系统,磁性内存的衰落和半导体内存的兴起 • 方法:程序验证,结构化程序设计,软件工程作为一门学科的早期发展 • 语言:PASCAL,COBOL 74,PL/1(标准),C,Scheme,Prolog • 1976-80 • 硬件:商用质量的微机,大型大规模存储系统,分布式计算 • 方法:数据抽象,形式化语义,并发、嵌入式、和实时程序设计技术 • 语言:Smalltalk,Ada,FORTRAN 77,ML
软硬件技术对语言的影响 (4) • 1981-85 • 硬件:个人计算机,第一代工作站,视频游戏,局域网,Arpanet • 方法:面向对象程序设计,交互式环境,语法制导编辑器 • 语言:Turbo Pascal,Smalltalk 80,Prolog的发展,Ada 83,Postscript • 1986-90 • 硬件:微机时代,工程工作站的上升,RISC体系结构,全域网,Internet • 方法:客户/服务器计算 • 语言:FORTRAN 90,C++,SML(标准ML)
软硬件技术对语言的影响 (5) • 1991-95 • 硬件:非常快的廉价工作站和微机,大规模并行体系结构,语音,视频,传真,多媒体 • 方法:开放系统,环境框架,国家信息基础设施(信息高速公路) • 语言:Ada 95,过程语言(TCL,PERL) • 1996-2000 • 硬件:二代Internet,机群,网络计算机(NC) • 方法:软件构件技术,Agent,中间件,浏览器/服务器计算,Internet计算 • 语言:JAVA,XML,IDL(后两种一个意义上不能算为程序设计语言) 返回
1.3 程序设计语言的评价 • 1、可读性 • 判断程序设计语言的最重要的标准之一就是看程序是否易读和易懂 • 易维护性在很大程度上取决于可读性 • 可读性已成为程序语言及程序质量的重要评测指标之一。 • 2、可写性 • 可写性是判定程序设计语言是否易于编写给定问题域的程序的度量标准之一 • 可读性往往会影响可写性 • 可写性是与应用领域相关的
程序设计语言的评价 (2) • 3、可靠性 • 如果程序能在任意条件下执行任务,则程序是可靠的 • 4、代价 • 程序的执行、程序的翻译、程序的创建、以及程序的维护
好语言应具备的性质(1) 1、清晰、简单、一致 • 程序设计语言既是思考算法的概念框架,又是表达算法的工具。语言对程序的帮助不仅在编码阶段,还会在此阶段前较长一段时间,均有帮助。语言应该是提供清晰、简单、一致的概念,用作算法开发的基本原语。概念的数量尽可能少、组合规则尽可能简单和规范。 • 语言的语法对程序的书写、测试、理解和修改有较大影响,因此,可读性是一个中心问题。特别精简或隐义的语言使程序易于书写(对有经验的程序员),但难于读(当要修改时),如APL,甚至程序员本人过一段间后也难读懂。有的语言几乎相同的语句实际上代表了完全不同的事。因此,一条基本原则是,语义不同应在语法中完全反映出来。
好语言应具备的性质(2) 2、正交性 • 不同不同的语言特征的任意一种组合都是有意义的,如条件语句和任意表达式的组合。 • 正交性使语言易学,程序易写,因为不需记住太多的例外和特殊情况,缺点是:逻辑上不协调或极端低效的组合可能会被编译器忽略。 • 正交性在语言设计中是一个有争议的属性。