【问题标题】:(x86) Assembler Optimization(x86) 汇编器优化
【发布时间】:2010-03-24 08:00:22
【问题描述】:

我正在用 Java 为面向 Windows 的 x86-32 (IA32) 处理器构建编译器/汇编器/链接器。

高级概念(我没有任何“源代码”:没有语法或词法翻译,所有语言都是常规的)被翻译成操作码,然后被包装并输出到文件中。翻译过程有几个阶段,一个是常规语言之间的翻译:最高层代码被翻译成中层代码,然后再被翻译成最低层代码(大概 超过 3 个级别)。

我的问题如下;如果我将高级代码(XY)翻译成低级代码(xyUV),那么这种翻译的一个例子是伪代码:

x + U(f) // generated by X
+
V(f) + y // generated by Y

(一个简单的示例)其中VU 相反(与U 的堆栈推送和V 的弹出相比)。这需要“优化”为:

x + y

(基本上删除“无用”代码)

我的想法是使用正则表达式。对于上述情况,它将是一个如下所示的正则表达式:x:(U(x)+V(x)):null,表示所有x 查找U(x),后跟V(x),并替换为null。想象更复杂的正则表达式,用于更复杂的优化。这应该适用于所有级别。

你有什么建议?什么是优化和生成快速 x86 程序集的好方法?

【问题讨论】:

  • 为了防止对我的问题的误解,我已经相应地更新了它。我不是在创建一个“源代码”编译器,而是创建一个“目标代码”编译器(在 Java 中)。对象是规则的(也是因为 Java 类型系统),用于所有级别的“语言”也是规则的。提供的示例只是这些对象的文本表示,以澄清我的问题。

标签: optimization assembly code-generation


【解决方案1】:

您实际上应该做的是构建一个 Abstract Syntax Tree (AST)

它是以树的形式表示源代码,更容易使用,尤其是进行转换和优化。

该代码表示​​为一棵树,类似于:

(+
    (+
        x
        (U f))
    (+
        (V f)
        y))

然后您可以尝试进行一些转换:总和是所有项的总和:

(+
    x
    (U f)
    (V f)
    y)

然后你可以扫描树,你可以有以下规则:

  • (+ (U x) (V x)) = 0,对于所有 x
  • (+ 0 x1 x2 ...) = x, 对于所有 x1, x2, ...

然后你会得到你正在寻找的东西:

(+ x y)

任何关于编译器编写的好书都会讨论很多关于 AST 的内容。函数式编程语言特别适合这项任务,因为通常很容易表示树并进行模式匹配以解析和转换树。

通常,对于此任务,您应该避免使用正则表达式。正则表达式定义了数学家所说的常规语言。任何正则语言都可以被一组正则表达式解析。但是,我认为您的语言不规则,因此无法通过正则表达式正确解析。

人们尝试,尝试,并尝试使用正则表达式解析诸如 HTML 之类的语言。这已在 SO 中广泛讨论,您无法使用正则表达式解析 HTML。总会有例外情况,您的正则表达式会失败,您必须对其进行调整。

这可能与您的语言相同:如果它不是正则,您应该避免很多麻烦,并且不要尝试使用正则表达式对其进行解析(尤其是“转换”它)。

【讨论】:

  • 是的,我隐约使用了抽象语法树的概念(但我不这么称呼它,因为我没有任何语法)。你说“然后你可以扫描树,你可以有以下规则”:所以你认为使用正则表达式很好,就像我的想法一样?
  • 不,正则表达式可能不是一个好主意。我会在我的回答中对此发表评论。
  • 谢谢。所有级别的语言都是常规的。
  • 如果它们都是正则的,你可以尝试一下hard、err、regular-expression的方式。但是,我很确定构建词法分析器和解析器会容易得多,它将源代码转换为 AST,然后对其进行优化。我很确定有些人会建议你为 Java 移植 Lex 和 Yacc,如果你有可能的话!无论如何,祝你的编译器好运。
  • 它不完全是 Java,但有一本 Robert Pickering 的书,名为“Beginning F#”。在他的书中,第 12 章(第 11 章?不记得了)专门用于构建编译器。只有一章教你如何做到这一点,利用函数式语言(在本例中为 F#)的模式匹配能力。
【解决方案2】:

我在理解这个问题时遇到了很多麻烦,但我认为您会发现了解一些关于 术语重写系统 的知识很有用,这似乎就是您所提议的。该机制是树重写(始终有效)还是正则表达式(有时适用于某些语言,而其他语言始终有效)是次要的。

绝对可以通过术语重写来优化目标代码。您可能还会从了解窥视孔优化的知识中受益; Davidson 和 Fraser 在retargetable peephole optimizer 上发表的一篇论文是一个很好的起点,因为它的基础非常强大。还有贝尼特斯和戴维森的excellent later work

【讨论】:

  • 谢谢!我将进行窥视孔优化,我想我可以使用正则表达式来实现它。 “通过术语重写来优化目标代码肯定是可能的”;这就是我一直在寻找的答案。
猜你喜欢
  • 2013-08-11
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2011-12-28
相关资源
最近更新 更多