【发布时间】: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