程序语言.ppt
《程序语言.ppt》由会员分享,可在线阅读,更多相关《程序语言.ppt(70页珍藏版)》请在三一办公上搜索。
1、第三章 语言翻译,程序结构,语法 程序是什么样的BNF(上下文无关文法)一种非常有用的描述语法的表示法。语义 执行行为静态语义 语义在编译时确定:var A:integer;A 的类型和存储int B10;数组 B 的类型和存储float MyProcC(float x;float y).;函数属性动态语义 语义在执行时确定:X=ABC SNOBOL4语言的例子:X 是一个字符串X=1+2;X 是一个整数:(X)X 是一个地址;转移到标号为 X 的地方,主要内容,程序语言的语法语法的一般准则、次要(或二级)准则语法的基本元素程序-程序的组织结构程序的翻译源程序分析:词法分析(扫描)、语法分析、
2、语义分析目标程序的综合翻译模型BNF、正则文法(有限状态自动机)、下推自动机PERL概述,3.1 语言的语法,语法:单词的组织方式,用来展示单词之间的关系单词作为语句中的元素语法描述了构成有效程序的符号序列。如C中,x=y+z是有效的符号序列,而xy+则不是。语法提供了理解程序的含义所需的信息,也提供了大量的从源程序到目标程序翻译所需的信息。,语言的语法(2),单靠语法并不足以无二义地刻划语句的结构。如:x=2.45+3.67,语法并不能告诉我们x是否被声明过或是否声明为实数。x=5,6或6.12均是可能的。因此,对语言的完整描述单靠语法结构是不够的,还需涉及语义。如:声明的使用、操作、顺序控
3、制和引用环境等影响变量性质的一些属性,并不总是由语法决定。,语言的语法(3),虽然如此,语法仍是语言描述中的重要属性。现在,语法描述已是一个解决了的问题,源程序的语法理解阶段是相当机械的,YACC等工具可自动生成给定程序的语法描述。,返回,语法的一般准则,语法的主要目的是为程序员和语言处理器间通讯提供一套注记方法。而选择特殊的语法结构主要是为了传递特殊的信息项。例如:某特定变量有类型实数,可以用多种方式表达。可以是显式声明或隐含的命名约定,等。语法细节的选择大部分是基于第二准则,如可读性,它和通讯的主要目标无关。有很多二级准则,通常可按其目标分类,分为:易读、易写、易翻译、无二义等目标。这些目
4、标间有时会有冲突。,易读性(Readabitity),程序是易读的:如果程序表示的算法和数据的结构可以很容易从程序文本中了解到。一个易读的程序,通常称为自成文档的(不需其他用于理解的辅助文档)。增加易读性的方式:自然的语句格式、结构化语句、关键字和噪音字的自由使用、嵌入式注释机制、不限长标识符、助记符、自由域格式、完全的数据声明等。不同的语法应反映不同语义,做相似事的程序结构是相似的。做不同事的程序其结构需有明显不同。语言如只提供了少数不同语法结构,通常导致程序易读性差。如APL,SNOBOL4等,只提供一种语句格式,赋值、子程序调用、简单GOTO、子程序返回,多路条件分支、及其它常见程序结构
5、的差异只能通过个别操作算子的不同来反映。,易读性(Readabitity),易读性并不能由语言设计保证,最好的设计也可能由于糟糕的编程而破坏。当然,语法设计也可能使好程序员写出难理解的程序,如APL。COBOL强调易读,但其代价是牺牲了易写和易翻译。,易写性,易写性(使用简明的、规则的语法结构)通常和易读性(冗余结构是有帮助的)相冲突。隐含的语法约定允许声明和操作不需预先刻划,从而使程序更短、更易写,但不易读。有些语法冗余性有用的,因它允许程序易读,并允许翻译时错误检测。缺点是不易写。语法称为冗余的,如果以多种方式传达同样的信息。大多数缺省规则(针对语言结构含义)试图减少冗余,而删去了某些显式
6、的含义陈述,因为这些含义可从语境中导出。例,Fortran中约定,I-N打头的变量为整型,其他为实数,这样不需声明,但缺点是有副作用,如:拼写错误不能被编译器检测到,例如:INDEX被写成INDX则变成新变量。,易写性,对两个目标均有增强的一些特征:如结构化语句、简单自然语句格式、助记符、未限制标记符等通常使程序易写通过允许在程序中直接表示问题的算法和数据的自然结构。,易验证性,和易读、易写相关的概念是程序正确性或程序验证。多年经验表明,理解每条程序语言语句是容易的,创建正确程序的整个过程却是困难的。因此,需有技术,使得能数学地证明程序是正确的。,易翻译性,即易于翻译成可执行形式。易读性和易写
7、性是面向程序员的需要。易翻译性(关键是结构的正则性)是面向翻译器(处理被写成的程序)的需要。如LISP程序,不易读、也不易写、但易于翻译,主要由于其语法简单且正则。当特殊语法结构增加,将导致翻译困难,如COBOL,它允许大量的语句和声明形式。,无歧义性,含混性是语言设计中的一个中心问题。一个语言定义应尽可能地为每个语法结构提供唯一的意义。而含混性结构允许两个或多个不同解释。通常不是由个体程序元素的结构产生,而是由于不同结构的交迭。例如:if Boolean exp then statement1 else statement2.If Boolean exp then statement1当两种
8、形式组合时,有可能出现二义情况。Fortran中,A(I,J)可能是数组元素,也可能是函数调用。事实上,上面提到的含混在语言中均有解决方案。,条件语句的两种不同解释,歧义性的解决方法,例:因组合而形成的悬空else:If Boolean exp1 then if Boolean exp2 then stat1 else stat2Algol解决方案:改变语法,引入分界符beginend。Ada解决方案:每个if语句必须以end if分界符结尾。C和Pascal解决方案:从二义结构中任选一种解释。对本例而言,最后的else总是和最近的then配对。FORTRAN中函数调用和数组引用的二义性由规则
9、解决:A(I,J)被视为函数调用,如果没有数组A的声明。但这个假定只能在程序装载、链接时被检查。Pascal中区分二者的方法是使用不同的括号,如:用于界定数组参数,()用于界定函数调用的参数。,返回,语言的语法元素(1/7),语言的语法风格由各种基本语法元素的选取所决定。字符集字符集的选择是语言设计的第一件事。已有一些标准字符集,如:ASCII码。通常是选择一个标准的字符集。但也有不标准的,如APL。字符集的选择对确定可被用于语言实现的I/O设备的类型是非常重要的。如:C的字符集可用于大多数I/O设备。而APL的字符集则不能直接用于大多数I/O设备。通常用8位来表示字符(60年代早期用6位),
10、这似乎是足够的。但是,随着计算机产业的国际化进程,可能16位表示是必需的(可有65536个字符)。,语言的语法元素(2/7),标识符字和数字串,以字母开头常用的选择。也可能使用特殊字符,如用.或-来改善易读性和长度限制。操作符符号+,-,*,/表示基本算法操作。通常简单操作可完全使用特殊符号。当然,也可以使用标识符来表示简单操作,如LISP中的PLUS、TIMES。大多数语言采用二者的组合。,语言的语法元素(3/7),关键字和保留字关键字用于语句语法中固定部分的标识符。保留字不能被程序员使用的关键字。大多数语言使用保留字以改善翻译器的错误检测能力,使语法分析更为容易。噪声字可选的字,被插入语句
11、中以改善易读性。如:COBOL中Go语句可写为GO TO,语言的语法元素(4/7),注释是文档中的重要部分,几种注释方式:1、分开的注释行,Fortran2、特殊标志界定,/*/,界定字符丢失可能导致大面积出错。3、在行中任意地方开始,但在行末结束,如C+的/空白(空格)语言中常使用空白规则,通常都是作为分隔符。也有的语言中空格有其他用途。,语言的语法元素(5/7),界定符(分界符)和括号用于标记语法单位的开始和结束,如 括号是一对分界符。自由和固定域格式自由域语句可写在任何地方固定域在输入行中通过位置来传递信息。Fortran是典型例子。当前固定域越来越少。,语言的语法元素(6/7),表达式
12、访问程序中数据对象并反回值,是基本的语法建筑块。在命令型语言中,表达式形成基本操作,状态被语句所改变。在作用型语言中,表达式形成了驱动程序执行的基本顺序控制。,语言的语法元素(7/7),语句是命令型语言中最主要的语法部件。语句的语法对语言整体的正则性、易读性和易写性有着关键影响。有的语言采用单一语句格式,强调正则性;而其它语言对不同语句类型使用不同语法,着重于易读性。语句结构中的一个更重要的差异是:结构性(或嵌套)语句和简单语句。,返回,程序结构,分开的子程序定义Fortran中,每个子程序定义被处理为分开的语法单元,每个子程序被分别编译,被编译程序在装载时链接。这种组织方式主要是针对这样一种
13、情况:每个子程序均需含所有数据元素的完整数据声明,即使是对那些在COMMON块中的或与其它子程序共享的数据。需要这些声明主要是由于分开编译的需要。基本的子程序单元用于表示某种能提供相关功能的结构。分开的数据定义把所有操作于给定数据对象之上的操作组合在一起,如C+中类。主要是基于数据抽象的原则。,嵌套的子程序定义,如PASCAL,子程序定义在主程序中作为声明出现,子程序本身又可含有其他子程序定义。其目标是强调结构化的语句,但事实上产生了不同用途。结构化语句的引入主要是为算法结构的常见的层次划分提供一种自然的注记方式,但嵌套子程序定义为编译时定义的子程序提供了非局部的作用环境。从而允许静态类型检查
14、,和有效的可执行代码的生成。嵌套的另一好处是作用域管理。允许子程序名具有较少的作用域。,分开的接口定义,FORTRAN的结构使得编译分开子程序变得非常容易,但缺点是不同子程序共享的数据可能有不同的定义,而这种不同是编译器在编译时无法检测到的。PASCAL允许编译器访问所有这样的定义以帮助发现错误,缺点是全部程序,即使其有上千条语句,必须在每次修改后重新编译。结合上面的技术可以改善编译行为。程序实现由几个相互交互的子程序构成,这些部件称为模块,将被连接在一起以创建可执行程序,但每次只有修改的模块被重编译。而在一个部件中的过程间传送的数据必须具有公共声明,从而允许编译器的高效检查。为了在分开的编译
15、模块间传递数据,引入了规约部件,如C中.h文件。Ada中的Package(接口定义规约+实现体)。,数据描述和可执行语句分离,COBOL包含了早期的部件结构形式。在COBOL中,所有子程序的数据声明和可执行语句被分入不同的程序中,即数据段和过程段,而用环境段包含关于外部操作环境的声明。一个程序的过程段被组织为子单元,以对应子程序体,但所有数据对所有子程序均是全局的,没有东西对应于通常子程序中的局部数据。中心化数据段的优点是:强迫形成数据格式和过程段中算法的逻辑独立性,数据结构的细小修改可只修改数据段而不需修改过程段。同时将数据描述搜集到一个地方,而不是散布在子程序中也是方便的方式。这适合于大量
16、数据的处理。在某种意义是,数据库应用是这种形式的扩展。,未分离的子程序定义,不分开主程序和子程序语句,如SNOBOL4中,程序是一个语句表。子程序间没有语法分隔,函数调用开始新的子程序执行,返回语句结束该子程序。程序的行为是动态的。事实上,任意语句可以同时是主程序的一部分,也可以是子程序的一部分。这体现在该语句可在主程序的执行中某点被执行,而后又在某子程序的执行中某点被执行。这种混沌结构仅仅对允许运行时翻译和相对简单的新语句和子程序执行机制具有价值。,返回,3.2 翻译的阶段,逻辑上,翻译可分为两个主要部分(输入源程序的分析,可执行目标程序的综合),两个阶段又可细分。大多数翻译器的中这些逻辑阶
17、段不是可以明确划分开的,而是混合在一起使得分析和综合交替进行(通常逐条语句进行)。,翻译的阶段,编译器通常对源程序扫描两遍第一遍将程序分解为部件并从程序中导出信息。第二遍根据这些收集的信息生成目标程序。如果编译速度是重要的考虑(如教学用编译器),一遍扫描是常用方式,在程序被分析时,立即被翻译为目标代码。如果执行速度是重要考虑,三遍甚至更多遍扫描也是可能的。第一遍分析源程序。第二遍使用各种定义好的优化算法将源程序重写为更多效的形式。第三遍生成目标代码。,返回,翻译的阶段,源程序的分析(1/3),词法分析将源程序字符流分隔、分组,成为一些基本的构成成分,如:标识符、分界符、操作符、数、关键字、噪音
18、字、空白、注释等。这些称为词法项,Token(语言符号)。,源程序的分析(2/3),语法分析(parsing)标识大的程序结构(语句,声明、表达式等)(基于前面得到的语言符号)。通常语法分析和语义分析交替进行(使用栈作为通讯工具)。语法分析器向栈中输入各种语法单元元素,语义分析器检索并处理。需要高效的语法分析技术,主要基于形式化文法的应用。,源程序的分析(3/3),语义分析翻译的中心阶段处理语法分析器识别的语法结构,并开始形成可执行目标码的结构,语义分析是分析和综合间的桥梁。这阶段的工作包括一些重要工作,如符号表维护、大多数错误检测,宏扩展以及编译时语句的执行。在简单情况下,语义分析器直接生成
19、可执行代码,但大多数情况下,是产生最终可执行程序的某种内部格式,然后被优化处理。语义分析器可分为一些小的语义分析器,各自处理一特殊类型的程序结构。它们之间通过存放在各种数据结构、特别是中心符号表中的信息而进行交互。,常见的语义分析功能(1/4),1、符号表维护符号表(最早由词法分析形成)含有对程序中不同标识符的表项(不仅含标识符,还包含涉及标识符属性的附加数据,如:标识符类型,值类型,引用环境等。)语义分析器在处理声明、子程序头、语句等时,填入相关信息。编译型语言的符号表在翻译结构后通常丢弃。但有的语言在执行时仍保留,如:允许运行时创建新标识符的语言(ML、LISP等,符号表是运行时的中心数据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序语言
链接地址:https://www.31ppt.com/p-2314057.html