代码之家  ›  专栏  ›  技术社区  ›  George S.

是否存在基于元组的控制流语句内部表示?

  •  0
  • George S.  · 技术社区  · 6 年前

    内部表示可以通过多种方式完成。例如,我知道一个数学表达式可能会转换为前缀或后缀符号,然后存储在堆栈中,这样当您弹出一些操作数时,它们会弹出到相应的运算符旁边,程序就可以进行计算。现在,另一种形式的内部表示是元组,通常是(?)由三个或四个元素组成:

    例如
    (4+5)/(2+x)
    可以表示为元组集
    (1)(+,4,5)
    (2)(+,2,x)
    (3)(/,(1),(2))
    内部以这种方式。我相信这就是所谓的二/三地址码,或者至少与之相关。

    这很好,但我的问题是如何以这种方式表示控制流语句?我知道还有其他方法可以在内部表示这些内容,比如抽象语法树和类似的东西,但是这种特定的方法呢?控制流语句是否可以在内部表示为一组n元组,或者这种表示法专门用于数学运算?为了澄清,我不是在谈论任何一个特定编译器中的实现;我只是想问这个“符号”是否可行。

    编辑:更正错误的数学。

    1 回复  |  直到 6 年前
        1
  •  1
  •   sepp2k    6 年前

    这种类型的中间表示(通常使用语法编写,例如 %1 = 4+5 %1 = add 4, 5 )也称为三地址码。三地址代码可以表示任意控制流,而不仅仅是表达式。请注意,汇编语言和机器语言也有一个由具有固定操作数的指令组成的平面结构,因此它与三个地址码没有太大区别。显然,程序集可以包含任意的控制流。

    实现这一点的方法是使用分支指令。最简单的是,您可以有两个条件:一个条件是无条件分支的目标地址,另一个条件是目标和布尔参数。所有类型的循环和条件语句都可以编译为跳转。例如,循环 while (condition) { body } ...restOfTheCode 可以编译成这样(其中 T 应将给定表达式转换为IR):

      %cond = T(condition)
    checkCond:
      brif %cond, loop
      br endLoop
    loop:
      T(body)
      br checkCond
    endLoop:
      T(...restOfTheCode)