是什么backpatching
意思?请用一个简单的例子来说明。
7 回答
反向修补通常是指解决已植入代码中的正向分支的过程,例如在“if”语句中,当目标的值变得已知时,例如当遇到右大括号或匹配的“else”时。
在编译器的中间代码生成阶段,我们经常需要执行“跳转”指令到代码中尚不存在的位置。为了处理这种类型的情况,为该指令插入了一个目标标签。产生式规则中的标记非终结符会导致语义动作被拾起。
一些语句,如条件语句、while 等,在生成中间代码时将表示为一堆“if”和“goto”语法。问题是,这些“goto”指令在开始时没有有效的引用(当编译器开始逐行读取源代码时 - AKA 1st pass)。但是,在第一次阅读整个源代码后,这些“goto”指向的标签和引用是确定的。
问题是我们能否使编译器能够一次性填充“goto X”语句中的 X?答案是肯定的。
如果我们不使用 backpatching,这可以通过对源代码进行 2 pass 分析来实现。但是,backpatching 让我们可以创建并保存一个单独的列表,该列表专门为“goto”语句设计。因为它只在一次传递中完成,所以第一遍不会填充“goto X”语句中的 X,因为编译器乍一看并不知道X在哪里。但是,它确实将X存储在该排他列表中,并且在遍历整个代码并找到X之后,X被该地址或引用替换。
Backpaching 是为 goto 指令留下空白条目的过程,其中目标地址在第一遍的正向传输中是未知的,并在第二遍中填充这些未知的条目。
Backpatching:语法导向的定义可以在两个或多个通道中实现(我们既有合成属性也有继承属性)。
先建树。
以深度优先顺序遍历树。
一次生成代码的主要困难是,当我们为控制语句流生成代码时,我们可能不知道分支的目标
Backpatching 是解决这个问题的技术。生成带有空目标的分支指令 当目标已知时,填写分支指令的标签(回补)。
回补是一个过程,其中包含前向引用的指令的操作数字段最初留空。当程序中遇到前向引用符号的定义时,将其地址放入该字段。
回补是在代码生成过程中通过使用适当的语义表达来填充标签的未指定信息的活动。
它是通过以下方式完成的:
- 布尔表达式。
- 控制语句流。