【问题标题】:Dynamic Basic Block vs Static Basic Blocks and Branching动态基本块与静态基本块和分支
【发布时间】:2018-02-23 10:26:44
【问题描述】:

在 Smith & Nair 的“虚拟机”一书(第 57 页)中,描述了here(在解释和动态二进制翻译的上下文中),动态基本块在它们中间有分支目标,而静态基本块没有。静态基本块只有一个入口和一个出口点,如图:static vs dynamic basic blocks

现在,在那本书的第 58 页上,据说当分支转到已翻译的块的中间时,翻译过程会变得复杂。仿真管理器无法获取目标地址,因为它只有特定翻译块的起始地址,而不是翻译块某处内部的分支目标。这样源代码就会被再次翻译,即使它已经被翻译了。解决方案是使用额外的数据结构来跟踪每个翻译块的地址范围。但是使用动态基本块时不会出现这种明显的复杂情况。

但是,正如我们从上面链接的图和书籍中看到的,动态基本块可能在它们的中间有分支目标,而静态块没有这样的多个条目。那么,动态基本块如何代替静态块解决这个问题呢?

提前谢谢你...

编辑:在上图中,在动态基本块中,有多个同名标签,即循环和跳过。那么,解释器如何确定哪个标签是实际目标?同一个汇编代码部分是否可以有多个同名标签?

【问题讨论】:

  • 我没有也没有读过这本书,但在我看来“动态基本块”是一个非常糟糕的术语,因为正如该部分所示,它不是一个基本块全部。它可能是动态的,但不是基本的。这就像说“纯巧克力冰淇淋”实际上是巧克力和草莓的混合物。它可能是纯的,但它不是巧克力。
  • @torek 我没听懂你。 “动态块根本不是基本块”是什么意思。你能解释一下吗?
  • 基本块是一个入口和一个出口的块。 That's the definition of a basic block.他们似乎在说“我们翻译了一个块,并它是一个基本块,然后我们发现它不是基本块,所以现在我们在前面加上另一个词而不是删除形容词basic就像我们应该的那样。”
  • @torek 谢谢。当由实际控制流确定时,书籍作者将其称为动态块。动态块在分支或跳转指令之后立即开始,并在下一个分支或跳转指令处结束,无论在该块中是否遇到跳转/分支目标。

标签: compiler-construction virtual-machine interpreter


【解决方案1】:

据我所知,他们想用动态块结构解决的问题是,当你进行翻译时,无法确定一条指令是否是分支目标,是否应该位于基本块的开头.标签通常在翻译后的指令流中不可见。

这个想法是,在执行期间,当您陷入或跳转到尚未翻译的地址时,您会将所有内容翻译到控制流中的下一个预期变化,即下一个分支。如果您遇到跳转到已翻译块的中间,最简单的方法是将其视为一个新的动态块。这将导致生成额外的代码,但通常这不是问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2021-05-15
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多