是否可以优化编译的二进制文件?

时间:2014-03-23 19:29:06

标签: optimization assembly compiler-construction

我想这更像是一种好奇心,但我想知道是否有可能在编译后应用编译器优化。大多数优化技术是否高度依赖于IR,或者装配是否可以相当容易地来回转换?

3 个答案:

答案 0 :(得分:4)

这已经完成,但我不知道有很多标准工具可以做到这一点。

This paper describes an optimizer用于Compaq Alpha处理器,它们在链接之后已经完成,并且在编写它时遇到了一些挑战。

如果稍微过分定义,可以使用配置文件引导优化来检测二进制文件,然后根据其关于缓存未命中,页面错误等的可观察行为重写它。

还有一些动态翻译工作,在翻译中运行现有的二进制文件,并使用标准的动态编译技术来加快速度。 Here's one paper详细说明了这一点。

希望这有帮助!

答案 1 :(得分:2)

最近有一些研究兴趣在这个领域。 Alex Aiken的STOKE项目正在以一些非常令人印象深刻的结果完成这项工作。在一个示例中,他们的优化器发现一个函数的速度是OpenSSL RSA库中蒙哥马利乘法步骤的gcc -O3的两倍。它将这些优化应用于已编译的ELF二进制文件。

Here is a link to the paper.

答案 2 :(得分:1)

一些编译器后端有一个窥视优化器,基本上就是这样,在它提交代表IR的程序集之前,它有一点机会进行优化。

基本上你会想要做同样的事情,从二进制,机器代码到机器代码。不是相同的工具,而是相同类型的过程,检查一些大小的代码块并进行优化。

现在你最终会遇到的问题是,例如你可能有一些在C中标记为volatile的变量,因此它们在二进制文件中的效率非常低,优化器不会知道程序员在那里想要的并且可能最终优化它。

你当然可以把它带回IR并再次前进,没有什么可以阻止你。