backpatching
是什么意思?请举例说明。
答案 0 :(得分:20)
返回修补通常是指解析已在代码中种植的前向分支的过程,例如,在'if'语句中,当目标的值变得已知时,例如,当遇到右括号或匹配'else'时。
答案 1 :(得分:11)
在编译器的中间代码生成阶段,我们经常需要执行" jump"对代码中尚不存在的位置的说明。为了处理这种类型的情况,为该指令插入目标标签。 生产规则中的标记非终结符导致语义操作被拾取。
答案 2 :(得分:4)
某些陈述,如条件陈述,等等,将表示为一堆" if"和"转到"生成中间代码时的语法。 问题是,这些"转到"说明,开头没有有效参考(当编译器开始逐行读取源代码时 - A.K.A 第1遍)。但是,在第一次阅读完整的源代码后,标签和引用这些" goto" s指向,确定。
问题在于我们是否可以使编译器能够在" goto X"中填充X.一次通过或不通过的声明? 答案是肯定的。
如果我们不使用反向修补,可以通过对源代码进行2遍分析来实现。但是,回调让我们可以创建并保持一个单独的列表,这是专为" goto"而设计的。声明。因为它只在一次传递中完成,所以第一次传递不会填充" goto X"声明,因为comipler乍看之下并不知道 X 的位置。但是,它确实将 X 存储在该独占列表中,在完成整个代码并找到 X 之后, X 被替换为地址或参考。
答案 3 :(得分:3)
回填: 语法定向定义可以在两个或多个过程中实现(我们有合成属性和继承属性)。
首先构建树。
以深度优先的顺序走树。
一次性代码生成的主要困难是,当我们为控制语句流生成代码时,我们可能不知道分支的目标
Backpatching是解决此问题的技巧。 使用空目标生成分支指令 当目标已知时,填写分支指令的标签(反向修补)。
答案 4 :(得分:2)
Backpaching是为goto指令留下空白条目的过程,其中目标地址在第一遍中的前向传输中是未知的,并在第二遍中填充这些未知。
答案 5 :(得分:1)
反向调度是一个过程,其中包含前向引用的指令的操作数字段最初保持空白。当在程序中遇到其定义时,前向引用符号的地址将被放入该字段中。
答案 6 :(得分:0)
返回修补是填充标签的未指定信息的活动 通过在代码生成过程中使用适当的语义表达式。
通过以下方式完成: