图52(计+i)*的分析树 6
6 E T T * F F ( E ) E + T T F F i i i 图5.2 (i+i)*i的分析树
按照这个句子向文法开始符E的归约次序,且 每当归约时调用该句柄的产生式所对应的语义子程 序,便可得到相应的输出串:64264154632。 这个例子表明:输入源语言的符号串(计i)输出目 标语言的数字串。这自然是一种变幻,而变换的规 则时每当(按句柄)归约时调用相应的语言子程序。 无疑这个例子是翻译的一个十分简单的模型。如果 将数字串这种目标代码定义为所需目标语言的目标 代码,如果每个产生式对应的语言子程序中的一系 列语义动作被描述成实现这种转换的动作的序列, 并最终生成所需目标语言的目标代码,那么作为程 序变换的翻译也就迎刃而解了
7 按照这个句子向文法开始符E的归约次序,且 每当归约时调用该句柄的产生式所对应的语义子程 序,便可得到相应的输出串: 64264154632。 这个例子表明:输入源语言的符号串(i+i)*i,输出目 标语言的数字串。这自然是一种变幻,而变换的规 则时每当(按句柄)归约时调用相应的语言子程序。 无疑这个例子是翻译的一个十分简单的模型。如果 将数字串这种目标代码定义为所需目标语言的目标 代码,如果每个产生式对应的语言子程序中的一系 列语义动作被描述成实现这种转换的动作的序列, 并最终生成所需目标语言的目标代码,那么作为程 序变换的翻译也就迎刃而解了
三、翻译要解决的问题 翻译是将源语言的程序等价变换为目标语言的 程序,于是有三个问题需解决 (一)、翻译成什么样的目标语言的代码? (二)、什么时候实现这种变换,即翻译? (三)、如何实现这种翻译?
8 三、翻译要解决的问题 翻译是将源语言的程序等价变换为目标语言的 程序,于是有三个问题需解决: (一)、翻译成什么样的目标语言的代码? (二)、什么时候实现这种变换,即翻译? (三)、如何实现这种翻译?
(1)如第一章引论中提到的那样,我们将源语言 程序翻译成中间语言的程序,中间语言与机 器无关,而语句颗粒度又与机器语言相当, 于是带来了诸多好处: ①编译逻辑结构简单明确,与机器相关的工 作集中到目标代码生成阶段,难度和工作量 下降。 ②便于移植和维护。 ③利于优化。代码优化将分成与机器无关的 中间代码优化及与机器相关的目标代码优化 两个阶段,是优化更有效。§52将讨论中间 语言
9 (1)如第一章引论中提到的那样,我们将源语言 程序翻译成中间语言的程序,中间语言与机 器无关,而语句颗粒度又与机器语言相当, 于是带来了诸多好处: ①编译逻辑结构简单明确,与机器相关的工 作集中到目标代码生成阶段,难度和工作量 下降。 ②便于移植和维护。 ③利于优化。代码优化将分成与机器无关的 中间代码优化及与机器相关的目标代码优化 两个阶段,是优化更有效。§5.2 将讨论中间 语言
(2)如例子所示,如果作为句柄所对应的产生式, 都配有一个相应的翻译子程序,则每当按句柄归 约时,就调用相应的翻译子程序(语义子程序) 完成局部的翻译,则一个句子,一段代码,按它 们的归约次序,将所有翻译子程序一次执行,就 完成了这个句子,这段代码的翻译。这种翻译与 语法分析紧密相关,称之为语法制导翻译:每当 归约时,调用相应的语义子程序,这就是翻译的 时机。 10
10 (2) 如例子所示,如果作为句柄所对应的产生式, 都配有一个相应的翻译子程序,则每当按句柄归 约时,就调用相应的翻译子程序(语义子程序) 完成局部的翻译,则一个句子,一段代码,按它 们的归约次序,将所有翻译子程序一次执行,就 完成了这个句子,这段代码的翻译。这种翻译与 语法分析紧密相关,称之为语法制导翻译:每当 归约时,调用相应的语义子程序,这就是翻译的 时机