程序设计语言ProgrammingLanguageDesignandImplementation网络教学第1章程序语言设计问题[学习目标]:初步掌握程序语言的基本概念,了解程序语言的发展;了解编程环境对语言的影响。-理解学习程序设计语言的作用;-了解几种语言的特点;-了解对程序语言影响的主要要素;-了解语言标准问题;-学习程序设计语言的基本计算模式;[重点和难点]:本章的重点是:程序设计语言的基本概念;好的程序语言的基本特征;本章的难点是:程序设计语言的一般计算模型;[知识点]:程序;算法;数据结构;机器语言;汇编语言;高级语言;翻译;可读性;可维护型;使用代价;计算模型;1.1为什么学习程序设计语言(学习程序语言有何作用)?1.2程序设计语言的发展简史1.3对程序语言影响的主要因素1.4好语言的特征1.5程序设计语言的基本计算模型1.6语言标准1.7编程环境第1章程序语言设计问题1.1为什么学习程序设计语言?增强设计高效率算法的能力;(如递归)提高对现存程序语言的运用能力;增加有用程序结构的词汇表;可以对程序语言有更好的选择;更容易学习新语言;更容易设计出一种新语言;=+程序算法数据结构返回1.2程序语言发展简史机器语言—汇编语言—高级语言;基于数字计算的语言,如Fortran;基于商业语言,如COBOL;人工智能语言,如LISP;系统语言,如C语言;机器语言高级语言汇编语言}低级语言执行语言翻译语言的应用领域商业:COBOL,C++,Java,Excel,Delphi科学:Fortran,C,C++,Java,Delphi,Basic系统:C,C++,Java,Ada人工智能:LISP,Prolog出版:Tex,Postscript,Word处理:Unixshell,TCL,Perl,Javascript返回1.3对程序语言影响的主要因素1)计算机性能:计算机性能价格比在不断提高,嵌入了OS,使用高级语言成为可能。2)应用:从军事、科技、商业、工业领域—计算机游戏、个人计算机,乃至各个领域。3)编程方法:简单程序—复杂程序;技巧性—可读性。4)实现方法:设计新的数据结构和算法,实现高效性—可维护性。5)理论研究:采用形式化的数学方法进行语言数据结构、算法等设计、实现方面的研究。6)标准化:强调可移植性。返回1.4好语言的特征1)透明性、简单性和统一性:从语法上的区别就能体现语义上的区别。2)正交性:是指能将一种语言的各种特征以所有可能的情况加以组合,并且每一种组合均有意义。例,假设某种语言(如C)提供了能够产生值的表达式,而且也提供了条件语句以计算一个表达式的值是真或假。如果任何一个表达式在条件语句中都能使用(和计算),那么这种语言中的这两个特征,即表达式和条件语句就具有正交性。正交性的好处:需要记忆的特殊情况较少,易于学习和编程。缺点:可能包含逻辑不连贯性的特征组合。3)应用的自然性:使得程序结构能够反映出算法的逻辑结构基础。理想情况下,能够将程序设计直接转化成正确的反映算法结构的程序语句(自然语言描述的算法可直接转化成程序语句)。4)抽象性的支持:能够支持抽象性的数据结构(如包含有“学生、班级、教师、教室”等成员的记录Record,结构Struct等)以及抽象的操作(如给一个班级分配教室)。程序员的一项重要工作就是:设计抽象类、实现抽象类。5)程序的易验证性:语义和语法的简单性是简化程序验证的一个基本要素。6)编程环境:集成化的编程环境。如VB、VC、VJ、JBuilder、Delphi等。7)可移植性:能将一台机器上开发的程序在另一台机器上运行。如Java程序。8)使用代价–程序执行代价:运行时占用系统资源代价。如今,不是关心的主要问题。–翻译的代价:翻译的速度和占用系统资源代价,对于教学性的语言较为强调。–程序创建、测试和使用的代价:程序员设计、编码、调试、修改、集成、测试和使用时投入的总时间与工作量。这是目前最关心的代价之一。如Perl,Smalltalk–程序维护的代价:在程序的使用过程中对程序反复修改、修复和升级扩充所花费的代价。这是目前最关心的代价之一。返回1.5程序设计语言的基本计算模型命令式语言(过程式语言)–是命令驱动和面向语句的语言。–程序由一系列的语句组成,其一般语法形式为:语句1;语句2;……–每条语句执行的结果是的计算机改变一个或多个存储单元的值,即进入一个新的状态。其操作过程如图所示。–模型的优点:效率较高。–语言实例:C,Pascal,Fortran,COBOL等。–应用领域:科学计算、系统设计、商业应用、工业控制等领域。+命令式语言:寄存器为一系列的“盒子”应用式语言(函数式语言)–以数据为驱动的强调程序(函数)执行的初始状态和处理(输出)结果。–不是将计算看成连续的机器状态的转换,而是看成为了得到答案而应用于数据的连续的函数转换。其一般语法形式为:functionn(…function2(function1(data))…)–该模型可看成是一个以原始数据作为输入,对内存进行操作以产生答案的透镜。其操作过程如图所示–模型的优点:较好的灵活性和可靠性。–语言实例:侧重于人工智能的LISP,ML语言等。–应用领域:人工智能。+应用式语言:改变内存中数据的访问方式透镜基于规则语言(逻辑编程语言)–以条件作为驱动而执行相应动作的语言。规则=条件+动作–类似于命令式语言,但语句不是连续的,启用条件决定语句的执行顺序。其一般语法形式为:启用条件1动作1启用条件2动作2……–该模型可看作是应用于数据的一个过滤器集合。通过使用过滤器来改变状态。其操作过程如图所示。–模型的优点:较好的灵活性和决策推理性。–语言实例:Prolog语言。–应用领域:人工智能和决策支持。+基于规则的语言:使用过滤器来改变状态(每个条件相当与一个过滤器)每个盒子都可能是标志操作和操作数的过滤器面向对象语言–以对象为程序单元。–通过建立复杂的数据对象,并且设计有限的函数集对对象实施操作。–模型的优点:结合命令式和应用式语言的优点。具有较高的效率以及较好的灵活性和可靠性。–语言实例:VC++,Java等–应用领域:科学计算、系统设计、商业应用、工业控制等领域。计算模型的一般性意大利面条代码–程序没有明显的结构,程序的控制跳转随意。–程序模块可能存在多个入口和出口。–缺点:模块之间的分解不易确定,分工协作较困难。程序运行时难以确定任何点上的计算机状态。程序的可读性和可维护性较差。?意大利面条代码结构化程序代码–属于应用式模型,程序具有明显的结构,程序的控制跳转不是随意的。–程序模块只有存在一个入口和出口。–优点:模块之间的分界易确定,易于分工协作。程序的可读性和可维护性较好。结构化代码返回1.6语言标准inti;i=(1&&2)+3;该C代码有效?i的值?方法:–阅读C语言手册?–编程试验?–按语言标准理解?语言开发商可能希望加入新的特征以增加功能,增加的特性是否合法?用户是否能够对语言进行扩充,扩充后的语言能否在其它系统上运行?标准化分类:–专有化标准:语言开发商定义。一般不适用于已经流行并广泛使用的语言。由于在使用过程中很快有许多增强但不兼容的语言版本出现。–共识性标准:相关组织定义。是使一种语言在几个实现中保证相同性的主要方法。标准化组织:–美国国家标准协会(ANSI);–电子电器工程师协会(IEEE);–计算机商业设备制造商联盟的X3委员会(CBEMA);–英国标准协会(BSI)。–国际标准化组织(ISO);影响标准化的因素:–时机性:什么时候标准化一个语言最合适?不能太早,否则人们还没有足够的使用经验,难以被接受(如Ada语言);也不能太晚,否则已经了许多不兼容的版本,在标准化较为困难(如Fortran语言)。而应该在它们正在发展的时候标准化最为合适,如C和Pascal。–一致性:对于一个符合标准的程序和能编译标准程序的编译器,它意味着什么?在标准化的保证下,符合该语言标准的程序能够正确执行,即程序具有一致性;对于一致性程序能够产生正确执行结果的编译器,称之为一致性编译器。–时效性:标准的有效性有多久?一般在5-10年就需要修改,注意语言的向后兼容性。返回国际化语言进行国际化问题–排序问题:不同的字符在不同的国家具有不同的意义。–大小写:有些国家的字符具有大小写区分,而有写国家的字符不具有大小写区分,如日文,中文,阿拉伯语。–读取方向:左到右、右到左、上到下等。–日期格式:如美国10/25/2003、英国25/10/2003、法国25.10.2003、意大利25_X_2003、中国2003.10.25–时间格式:如美国3:30p.m;中国15:30;法国15h30–时区:格林威治时间,夏时制。–货币:不同国家具有不同的货币单位。1.7编程环境编程环境:程序一般在编程环境下开发和测试。什么是编程环境?支持工具(编辑器、编译器、调试器、验证器、测试数据产生器、打印器等)+命令。每一种支持工具其本身既是一个程序。编程环境对语言设计的影响主要表现在两个方面:1)单独编译和汇编2)测试和调试–分别编译:将程序的各个组成部分分别进行设计、编码、编译、测试、调试,然后连接成一个完整的程序。要求:程序具有结构化的特性。实现的难点:一、程序的各个模块本身具有相互关联性,当编译一个子程序时,编译器可能需要其他子程序或共享数据对象的信息,比如:1)调用外部子程序的参数的数量、顺序和类型等信息。2)应用的外部变量的类型、存储形式等。3)与局部变量同名的外部变量信息。解决方法:1)将信息在子程序中重定义,如fortran语言。多人编程时,有些困难,也易出错。2)规定特别的编译顺序:要求每个程序的编译跟在所有调用则程序和共享数据的声明之后,如pascal语言。3)用一个专门的运行库包含所有的相关声明信息。分别编译的缺点:在一般情况下,无法检查外部子程序相关信息的一致性以及在子程序中重新声明的数据。二、同名问题:不同编程人员使用相同子程序、全局变量名字。解决方法:1)各个编程人员(小组)在程序编制之前相互沟通和协调,避免使用相同的名字,每个编程人员(小组)用它们约定的特殊字符作为名字的开头,如a组用前缀aa,b组用前缀bb。C中#include文件中的名字一般用前缀_.2)使用范围规则来屏蔽名字,如一个子程序包含在另一个子程序中,则只有最外层子程序中的名字对其他分别编译的子程序右影响。如Pascal。3)通过从外部库中显式增加名字定义,如面向对象语言中的继承机制。利用重载技术,允许不同的对象使用相同的名字。测试与调试:跟踪执行、断点、断言。–跟踪执行:提供对特殊语句及变量作标记以便在程序中跟踪的特性。–断点:提供在程序中某处设立断点的特性。–断言(assertions):程序中作为单独语句插入的条件表达式。如assert(X0andA=1)or(X=0andAB+10);当断言激活时,编译器会判断条件,如条件不满足,则中断程序进入异常处理。程序调试后,断言可被屏蔽而成为程序中有用的注释。本章小节通过学习本章:我们知道学习程序设计语言可以增强我们设计高效算法的能力,能够提高我们对现存程序语言的运用能力,使我们更容易学习和掌握新的语言。程序设计语言经过了低级语言(机器语言、汇编语言)到高级语言的发展,而且仍在继续不断的发展和变化。各种不同的语言具有不同的特点和在不同应用领域具有各自的优势。影响程序设计语言的主要因素有:计算机性能,应用领域的要求,编程方法,实现方法和标准化。程序设计已经涉及到社会各个领域的应用,经历着应用程序的“简单性”到“复杂性”;编程强调“技巧性”到“可读性”;追求实现的“高效性”到“可维护性”和强调“可移植性”的演变。程序一般计算模型有:命令式语言、应用式语言、基于规则语言和面向对象语言四种,各自具有优点。目前主要使用的仍然是命令式语言和面向对象语言。语言的标准化有专有化标准和共识性标准两个种类,一般强