2016-05-18 50 views
0

我有興趣實施我自己的語言翻譯。根據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 

} 

在這個簡單的示例中,當克被調用時,用於克新ARI被創建,並且該ARI的靜態鏈接被饋送以f的ARI,先前在運行時棧現有。

但是,我很難清楚地知道如何在運行時確定ARI的靜態父項。最簡單的方法是在整個運行時堆棧中搜索,直到找到靜態父代的現有ARI,但他們說這不是一個有效的方法。所以我想嘗試更好的選擇,這是「沿呼叫者的靜態祖先導航」。 (本書說我們可以通過跟蹤來自主叫方靜態鏈接的靜態鏈接來實現此目的。)

在上面的例子中,當通過t()從h()調用g()時,我們首先調用h( )的靜態父對象的ARI,並再次轉到該ARI的靜態父對象,等等,直到我們遇到f()的ARI。因此,在這個例子中,我們將遵循h-k-f的ARI鏈。 (我們會按照較長的ARI鏈接進行更深的嵌套。)

所以我的問題是;

  • 是否有任何實際的翻譯和編譯器的常用 語言,嵌套函數,如JavaScript,它是使用靜態鏈接,每個ARI以上(不太簡單)的方式?
  • 如果是這樣,是否有任何方法來檢查解釋器/編譯器的源代碼,看看它是如何工作的?

感謝您的幫助。

+0

我並沒有碰到你提到的那本書,而且自從我編寫了一個解釋器以來已經有一段時間了,但它通常是調用例程 - 在這種情況下是'f',它設置了框架(ARI)打電話給'g'。顯然,'f'知道它自己的框架所在的位置,因此可以很容易地將它的引用粘貼到'g'的框架中,因爲它正在建立。 –

+0

感謝您的及時評論。我同意當從父f()直接調用g()時,你的方法是非常合理的。然而,我的問題是包含更復雜的嵌套情況。我對這個令人困惑的描述感到抱歉。我已經用更多的細節修改了這個問題。 – fcmonoid

回答

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 
> 

請參閱0123o作者:Roberto Ierusalimschy,Luiz Henrique de Figueiredo和Waldemar C特別是第5節功能和閉合。

對於版本5.1.4或canonical source code for Lua 5.3.x,您可以看到Lua annotated source code