代码之家  ›  专栏  ›  技术社区  ›  Pindatjuh

(x86)汇编程序优化

  •  2
  • Pindatjuh  · 技术社区  · 15 年前

    我在Java中构建了一个编译器/汇编程序/链接器,用于针对Windows的X8632(IA32)处理器。

    高级概念(我没有任何“源代码”:没有语法和词汇翻译,所有语言都是常规的)被翻译成操作码,然后打包并输出到一个文件。翻译过程有几个阶段,一个是翻译过程中 有规律的 语言:最高级别的代码被转换成中等级别的代码,然后被转换成最低级别的代码。( 可能 超过3级)。

    我的问题是:如果我有更高级别的代码( X Y )转换为低级代码( x ,请 y , U V ,那么这种翻译的一个例子是,在伪代码中:

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

    (一个简单的例子)在哪里 V 与…相反 U (与堆栈推送 U 和流行音乐一样 V )这需要“优化”为:

    x + y
    

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

    我的想法是使用正则表达式。对于上述情况,它将是如下所示的正则表达式: x:(U(x)+V(x)):null ,代表所有人 X 找到 U(x) 然后 V(x) 替代 null . 想象一下更复杂的正则表达式,以便进行更复杂的优化。这应该适用于所有级别。

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

    2 回复  |  直到 15 年前
        1
  •  5
  •   Norman Ramsey    15 年前

    我很难理解这个问题,但我想你会发现了解一些有关 术语重写系统 这似乎是你的建议。无论机制是树重写(始终有效)还是正则表达式(在某些语言中某些时间有效,而其他语言则始终有效),都是次要的。

    通过术语重写来优化对象代码是绝对可能的。你可能也会从学习一些关于 窥视孔优化 戴维森和弗雷泽的一篇论文是关于 retargetable peephole optimizer . 还有 excellent later work 贝尼特斯和戴维森。

        2
  •  8
  •   Bruno Reis    15 年前

    实际上你应该做的是建立一个 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)
    

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

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

    人们试着,试着,试着用正则表达式解析HTML等语言。这在这里已经被广泛讨论过了,所以您不能用正则表达式解析HTML。总是会有一个例外情况,在这种情况下,您的正则表达式会失败,您必须对它进行调整。

    对于您的语言来说可能是一样的:如果它不是规则的,您应该避免很多麻烦,并且不要试图使用正则表达式解析它(尤其是“转换”它)。