- 1、本文档共63页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章 顺序控制 顺序控制提供了操作和数据被组合成程序和程序集合的框架。 涉及两个方面的问题: 操作执行顺序的控制(顺序控制) 数据在子程序间的传递(数据控制) 执行顺序控制 控制的层次和形式 语句内(即表达式)的顺序控制 算术表达的顺序控制 非算术表达式的顺序控制 语句间的顺序控制 8.1 隐式和显式顺序控制 顺序控制结构可分为四组: 1、用于表达式中的结构(也针对语句,表达式是语句的基本建筑块)。如:优先级规则和括号。 2、用于语句或语句组间的结构。如:条件和迭代。 3、用于申明式程序设计语言的程序结构。如逻辑程序设计语言 4、用于子程序间的结构,如:子程序调用和协同例程。 这种分法并不是精确的,如LISP和APL中只有表达式而无语句。 顺序控制结构可以是隐含的(缺省的)(由语言定义,除非程序员显式修改)或显式的(程序员可用来修改隐含顺序)。 8.2 算术表达的顺序控制 考虑方程求根: 该公式至少涉及15个分开的操作,用汇编或机器语言至少需要15条指令甚至更多。而写成Fortran程序则为: ROOT=(-B+SQRT(B**2-4*A*C))/(2*A) 这是自然的表达方法,由翻译器而不是程序员来考虑各种优化问题。 然而,翻译器如何控制正确的操作顺序? 算术表达的顺序控制 算术表达式的表示 语法:直观表示和形式化表示 语义:决定计值方式和过程 运算符的优先级 算术表达式在执行时的表示 树结构表示 目前,我们将表达式考虑为单个实体,忽略了其计值必需的实际语法和语义。 表达式中的基本顺序控制机制是“函数复合”:刻划操作及其操作数。 函数复合使表达式呈树结构特征,根为主操作,中间节点为中间层次操作,叶为操作数。 树结构表示 求方程根的表达式的树。 树表示阐明了表达式的控制结构,低层的数据引用和操作作为高层操作的操作数,必须先计值,但树表示也留下一些计值顺序没有指定。 如:-B和B**2谁先计值?B是否可组合为同一引用? 通常语言定义只在树表示级定义表达式计值顺序,允许实现者决定计值细节。 表达式的语法 表达式(a+b)×(c-a)的树结构 表达式的语法 表达式可表示为树结构,但为了在程序中表示,线性化是需要的。 前缀(波兰前缀)记法。 这是波兰数学家发明的无括号记号法。如:f(x,y,z),×+ab-ca LISP使用了该记号法的变种,称为剑桥波兰,用括号将操作符及其操作数括起来,如:(X(+ab)(-ca))。 后缀(逆波兰)记号法 类似于前缀,但操作符数在后面,如:ab+ca-× 中缀记号法 最适合二元操作,也是我们最常用的方式。 表达式的语义 (1/3) 上三种记号法对语言的设计都有一些有用的属性,在如何计算表达式值方面也有不同。 前缀计值 可以通过一遍扫描计值每个表达式,然而需要知道每个操作的操作数量。除了可省去括号外,前缀表达式在语言设计中有如下价值: 1、一般的函数调用均采用前缀方式。 2、可表示有任意数量操作数的操作,写表达式只需一个语法规则。 3、解码可以机械地很容易地进行,将其翻译成简单代码序是容易的。 表达式的语义 (1/3) 前缀计值 下面算法用一个执行栈计值表达式:对表达式P, 1、如P中下一项是操作子,压入栈项,设置所需参数数目。 2、如P中下一项是操作数,压入栈项。 3、如栈项n项是操作数(对栈中第一个n元操作),则可以进行计值,用计值结果替代该操作符和操作数。 表达式的语义 (2/3) 后缀计值 后缀计值时,操作符紧跟其操作数后而且操作数已被计值。 1、如P中下一项是操作数,压入栈顶 2、如P中下一项是n元操作符,n个参数必须是栈顶部的n个元素,计算结果并替换这n个元素。 这种计值策略直接、简单,是很多翻译器中生成表达式代码的基础。 表达式的语义 (3/3) 中缀计值 中缀是常见的,但用于程序语言中会导致一些问题: 1、只适合于二元操作。语言单用中缀是不够的,还需使用前缀,这二者的混合使翻译更为复杂。 2、表达式中涉及多个中缀操作时,如不使用括号,则存在固有二义性。为解决这个问题,通常引入隐含的规则。 操作子计值顺序 操作的层次 即操作的优先规则 结合律 然而,当语言引入新的,不是源自传统数学的操作符时,优先规则可能不再有用,因此,需要有不同方法来处理扩展的操作集。 C语言:使用扩展的优先规则集合,大多数使用从左到右的结合律。大多数C规则是合理的。 APL:操作数为数组和矢量,语言没有优先规则。所有表达式计值从右到左。这规则对大多数表达式也是合理的,除了一些典型的表达式,如a-b-c-意为a-(b-c)。 Smalltalk:模型类似APL,没有优先规则,表达式计值从左到右。 Forth:用于实时过程控制。其运行时结构为栈,语言是纯后缀的,没有优先规则。 执行时表示 对中缀形式的表达式
文档评论(0)