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

更新封闭范围内变量的SSA表示

  •  0
  • rwallace  · 技术社区  · 8 年前

    当编译器使用SSA形式表示代码时,局部变量的更新将成为新变量。但是,当变量位于封闭范围内时,这并不总是有效的,例如(使用JavaScript语法进行说明,这种情况可能在许多语言中发生):

    function f() {
        var x = 1;
        function g() {
            x++;
        }
        ...
    }
    

    1 回复  |  直到 8 年前
        1
  •  2
  •   rici    8 年前

    闭包中使用的可变自由变量( x 在您的示例中)需要隐式地“装箱”。

    有两个问题需要考虑。首先,生存期:变量可能超过创建它的范围。( f 可能会回来 g ,或将其存储在永久容器中。)第二,共享:变量可以通过以下方式修改: f , g f .

    最简单的解决方案是将变量更改为“box”(一个对象的容器,该对象是变量的值)。框本身是不可变的(也就是说,名称总是指同一个框)。变量值的修改和引用成为容器setter和getter方法。当然,当不再需要时,必须动态分配和回收值的存储(与任何容器一样)。

    首先,如果变量从未被修改,则可能会给每个闭包一个值的副本,而不是装箱值。

    f f 在创建 --变量可以简单地移动到 g

    证明这些优化在特定程序中的有效性需要良好的静态分析。第一种方法很简单,因为修改在语法上很容易检测,但第二种方法需要流分析(至少)。

    在上述内容中,我对可能应用优化的情况进行了保守描述,只需要简单的流量分析;检测其他可能的应用程序更加复杂。

    推荐文章