操作的层次(例如优先规则)一-P245表6162 结合律一一是同一层次的隐含规则,亦用于定义操作的 顺序 优先级计算术表达式是合用的,因为表达式语义的数学 模型已对大多数程序员熟知的。然而,当语言引入新的, 不是源自传统数学的操作符时,优先规则不再有用,因 此,有不同方法来处理扩展的操作集。 亼C语言:使用扩展的优先规则集合,表6.2大多数使用 从左到右的结合律。大多数C规则是合理的 △APL:操作数为数组和矢量,语言没有优先规则。所 有表达式计值从右到左。这规则对大多数表达式也是合 理的,除了一些典型的表达式,如a-b-c-意为a-(bc) △ Smalltalk:模型类似APL,没有优先规则,表达式计 值从左到右。 亼 Forth:用于实时过程控制。其运行时结构为栈,语 言是纯后缀的,没有优先规则
•操作的层次(例如优先规则)--P245 表6.1 6.2 •结合律--是同一层次的隐含规则,亦用于定义操作的 顺序 优先级计算术表达式是合用的,因为表达式语义的数学 模型已对大多数程序员熟知的。然而,当语言引入新的, 不是源自传统数学的操作符时,优先规则不再有用,因 此,有不同方法来处理扩展的操作集。 △ C语言:使用扩展的优先规则集合,表6.2大多数使用 从左到右的结合律。大多数C规则是合理的。 △ APL:操作数为数组和矢量,语言没有优先规则。所 有表达式计值从右到左。这规则对大多数表达式也是合 理的,除了一些典型的表达式,如a-b-c-意为a-(b-c)。 △ Smalltalk:模型类似APL,没有优先规则,表达式计 值从左到右。 △ Forth:用于实时过程控制。其运行时结构为栈,语 言是纯后缀的,没有优先规则
执行时表示 对中缀形式的表达式的解码是困难的,需要翻译为易于解码 的可执行形式。通常的选择有 1、机器代码序列 表达式被直接翻译成实际的机器代码,而不是先翻译为中间 形式。指令顺序反映了初始表达式的顺序控制结构。 机器代码序列必须使用显式的临时存储位置来保持中间结果, 允许使用硬件解释器,因此,执行速度快。 2、树结构 表达式可以以其自然的树结构直接执行(使用软件解释器)。 执行通过简单的树遍历来完成。 这是LISP中使用的典型技术,整个程序被表示为树结构
执行时表示 对中缀形式的表达式的解码是困难的,需要翻译为易于解码 的可执行形式。通常的选择有: 1、机器代码序列 表达式被直接翻译成实际的机器代码,而不是先翻译为中间 形式。指令顺序反映了初始表达式的顺序控制结构。 机器代码序列必须使用显式的临时存储位置来保持中间结果, 允许使用硬件解释器,因此,执行速度快。 2、树结构 表达式可以以其自然的树结构直接执行(使用软件解释器)。 执行通过简单的树遍历来完成。 这是LISP中使用的典型技术,整个程序被表示为树结构
3、前缀或后缀形式 这两种形式可用前面给出的解释算法来执行 在某些基于堆栈组织的实际计算机中,实际的机器代码表示 为后缀形式 前缀表示是 SNOBOL4程序的执行形式,执行从左到右进行 每个操作递归地调用解释器来计值其操作数。 表达式的树表示的计值 表达式翻成树结构虽有困难,但总体上是直接的。 而树到可执行原语序列的翻译,则涉及计值顺序的一些 微妙问题。在代码生成中出现的计值顺序问题有:
3、前缀或后缀形式 这两种形式可用前面给出的解释算法来执行。 在某些基于堆栈组织的实际计算机中,实际的机器代码表示 为后缀形式。 前缀表示是SNOBOL4程序的执行形式,执行从左到右进行。 每个操作递归地调用解释器来计值其操作数。 •表达式的树表示的计值 表达式翻成树结构虽有困难,但总体上是直接的。 而树到可执行原语序列的翻译,则涉及计值顺序的一些 微妙问题。在代码生成中出现的计值顺序问题有:
问题一:一致的计值规则 对表达式树中的每个操作结点,首先计值其操作数(或 生成相应代码),然而应用操作到计算出的操作数上 (或生成相应代码)—积极计值规则( eager)。 而这些计值发生的顺序并不重要,可以选择以优化存储 和其他机器特性 例,对(a+b)×(c-a),下列顺序均可接受 顺序一:取a的右值 顺序二:取c的右值 取b的右值 取b的右值 a+b→d 取a的右值 取c右值 c-a->e C-a→>e a+b→→d d×e→→俵表达式的右值 d×e→f 但是,一致计值规则并不是总可使用的。 例:Z+(Y=0?X:X/Y),当YAO时,计算XY
问题一:一致的计值规则 对表达式树中的每个操作结点,首先计值其操作数(或 生成相应代码),然而应用操作到计算出的操作数上 (或生成相应代码)——积极计值规则(eager)。 而这些计值发生的顺序并不重要,可以选择以优化存储 和其他机器特性。 例,对(a+b)×(c-a),下列顺序均可接受。 顺序一:取a的右值 顺序二:取c的右值 取b的右值 取b的右值 a+b→d 取a的右值 取c右值 c-a→e c-a→e a+b→d d×e→f表达式的右值 d×e→f 但是,一致计值规则并不是总可使用的。 例:Z+(Y=0?X:X/Y),当Y≠0时,计算X/Y
Z 0 包含条件的表达式
+ Z Y 0 X X Y IF = / 包含条件的表达式