有静态父项(静态链接)的开源解释器实现吗?

时间:2016-05-18 09:42:01

标签: compiler-construction nested interpreter

我对实现自己的语言翻译感兴趣。根据Sebesta的“编程语言概念”第10章,当编程语言允许这样的嵌套函数时,新的ARI(活动记录实例)充满了静态父级;

f(){
   int x;
   g() { int y = x+1; ..}        // definition of g

   k(t)  {                       // definition of k
           h(t) { t();..}        // definition of h... it calls g() via t()
           h(t);                 // this will call g();
   } 

   k(g);                         // this will call h() with g

}

在这个简单的示例中,当调用g时,会创建一个新的ARI for g,并且此ARI的静态链接将使用先前存在于运行时堆栈中的f的ARI。

但是我很难清楚地了解如何“在运行时”确定ARI的静态父级。最简单的方法是在整个运行时堆栈中搜索,直到我们找到静态父级的现有ARI,但他们说这不是一种有效的方法。所以我想尝试更好的选择,即“沿着来电者的静态祖先进行导航”。 (书中说我们可以通过跟随调用者静态链接的静态链接来实现这一点。)

在上面的示例中,当通过t()从h()调用g()时,我们首先转到调用者h()的静态父级ARI,然后再转到该ARI的静态父级,依此类推,直到我们遇到f()的ARI。因此,在这个例子中,我们将遵循h-k-f的ARI链。 (我们会遵循更长的ARI链接链进行更深层的嵌套。)

所以我的问题是;

  • 是否有常用的实际解释器和编译器 具有嵌套函数的语言,如JavaScript,它使用上面(不太简单)方式的每个ARI的静态链接?
  • 如果有,有没有办法检查解释器/编译器的源代码,看它是如何工作的?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

以下是您的代码到Lua的翻译:

function f()
    local x = 0
    local function g () 
        local y = x+1
        -- etc
    end
    local function k (t)  
        local function h (t) 
            t()
            -- etc.
        end
        h(t)
    end
    k(g)
end

这是另一个返回值的版本,因此我们可以证明它运行:

function f()
    local x = 0
    local function g () 
        local y = x+1
        return y
    end
    local function k (t)  
        local function h (t) 
            return t()
        end
        return h(t)
    end
    return k(g)
end

和测试:

> =f()
1
> 

见Roberto Ierusalimschy的The Implementation of Lua 5.0,Luiz Henrique de Figueiredo和Waldemar Celes,特别是第5部分,函数和闭包。

您可以看到版本5.1.4的Lua annotated source codecanonical source code for Lua 5.3.x