Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 窥视孔优化模式_Design Patterns_Compiler Construction_Vm Implementation_Control Flow Graph_Peephole Optimization - Fatal编程技术网

Design patterns 窥视孔优化模式

Design patterns 窥视孔优化模式,design-patterns,compiler-construction,vm-implementation,control-flow-graph,peephole-optimization,Design Patterns,Compiler Construction,Vm Implementation,Control Flow Graph,Peephole Optimization,我一直在阅读本地优化编译器技术,但一直不知道它们是如何实现的。其思想是,优化器每次都会查看代码的“窗口”,以某种方式检测模式,并用更优化的版本替换它们 我的问题是,人们如何发现这些模式?(假设您的平台是一个VM,为一台虚构的计算机输出汇编代码,如Schocken's Hack) 人们是否真的手动检查代码(使用控制流图或DAG或其他什么),然后收集所有识别的模式并将它们编码到优化器中?还是有一种自动的方式 例如,您在分析器中输入要优化的代码,它会输出所述模式。如果是这样的话,你怎么开始写呢?经典的

我一直在阅读本地优化编译器技术,但一直不知道它们是如何实现的。其思想是,优化器每次都会查看代码的“窗口”,以某种方式检测模式,并用更优化的版本替换它们

我的问题是,人们如何发现这些模式?(假设您的平台是一个VM,为一台虚构的计算机输出汇编代码,如Schocken's Hack)

人们是否真的手动检查代码(使用控制流图或DAG或其他什么),然后收集所有识别的模式并将它们编码到优化器中?还是有一种自动的方式


例如,您在分析器中输入要优化的代码,它会输出所述模式。如果是这样的话,你怎么开始写呢?

经典的窥视孔优化不是关于强度降低和其他你提到的事情。它们是2-3个指令序列,例如

BRANCH FALSE $1
BRANCH $2
$1:
这可以归结为

BRANCH TRUE $2

像这样的序列可能出现在幼稚的代码生成器中,比如不生成AST的单过程编译器,比如我开发的一些COBOL编译器。

这取决于您是编写自己的分析器还是使用现有的分析器。在任何一种情况下,分析器都会不断检查代码,直到代码不再优化为止。如果以GCC为例,它有特定的优化过程。程序的中间代码被赋予这些过程,这些过程一个接一个地执行并优化代码。任何过程都可以执行多次。

如果您真的想了解如何编写这些优化,只需查看GCC

中的passs.h文件,我认为这通常称为
内联缓存。在运行时,您会发现许多关于最近使用此技术的JavaScript引擎的文献。看,这很有趣,我第一次碰到这个。我通常考虑强度降低、恒定评估、控制流选择等操作。这似乎是针对“运行时”的,是吗?还是用来生成更紧凑的汇编代码?如果您只对静态编译感兴趣(没有运行时增量编译/解释),可以在编译时应用它,但您必须分析所有调用站点。谢谢您的评论!然而,我仍然不明白优化规则是如何生成的。我到处都能看到类似“当你遇到这个模式时,用那个模式替换它”这样的规则优化表,但似乎没有人解释你是如何首先提出这些模式的!我看过一些描述自动窥视孔优化器的文章,所以我猜它们是存在的,但通常的做法是手工操作?我明白了,但是我们怎么能发现这些序列呢?是否有某个地方发布的模式列表?人们是否编译随机代码,然后开始自己搜索它们?另外,这不是一个控制流优化示例吗?=)@GFount肯定是这样,但我所说的编译器不做流分析。窥视孔序列对于任何一个像样的汇编程序员来说都是显而易见的,如果有的话。您只需检查输出并思考“嗯…”。这些都在平常的书中,所以这只是经验?没有任何“正式”的分析方法吗?谢谢你的评论!因此,如果想要优化非x86代码生成(对于玩具平台),唯一的方法就是编写自己的分析器,或者“手工”完成,对吗?问题是关于窥视孔优化,而你还没有回答。