2009-09-10 36 views
1

我正在開發一種簡單編程語言的解釋器。接近靜態數據的設計問題

  1. 樹形結構的動態數據,其中每個數據節點的具有相關聯的(自有)型對象
  2. 有幾種類型 - ListType,StructType等 - 和一個特殊的 - TypeRef。 TypeRef保存一個引用某個具體類型的名稱(一個字符串)。
  3. 有一個(幾乎)全球地圖(字典) - 我稱之爲環境 - (std::map<string, Type*>),它將類型名稱轉換爲類型對象。

問題是,可能會加載多個程序,並且每個程序都可能具有與相同名稱關聯的不同類型。這種單一的假設使得不可能有一個全球(靜態)環境,否則這將是一個完美的解決方案。因此,似乎我需要(#1)指向每個類型對象或(#2)中的環境的指針來執行環境上下文中的每個操作(例如,通過將它作爲第一個論據)。

我看到的問題:
(#1)信息冗餘,因爲所有連接的數據節點都有相同的環境。環境只會因嚴格分離的數據而有所不同。
(#2)環境的許多微不足道的傳遞給子程序,混淆了代碼。

在我看來,這個問題匹配的一般模式,我會打電話近乎靜態的數據。任何想法什麼是最好的解決方案?

+0

不知道我理解得好。你可以使用2級地圖<字符串,地圖<字符串,類型>>?一個用於programId的字符串,一個用於鍵(選擇哪一個是第一個)。 – KLE 2009-09-10 09:10:18

+0

這與我的($ 1)非常相似。而不是指向每個類型對象中的環境的指針,我會在那裏有一個程序的名稱。 – 2009-09-10 09:15:29

回答

0

使用線程本地存儲的想法很有趣,但我終於結束了另一種解決方案:

我用的類型分爲兩個階段:首先他們都是創造,然後將它們「編譯」。編譯需要一個環境,但只執行一次。它將所有類型名稱翻譯成適當的類型對象。編譯之後,不再需要環境。

儘管如此,我認爲它比一般的解決方案更適合解決問題。

1

什麼分開環境?如果它是執行上下文(上下文中的對象只調用同一上下文中的對象),那麼您可以在每個環境中使用一個線程,並將「local-globals」存儲在線程本地存儲器中(或者只是帶有鍵的全局映射成爲線程ID)。

這有一些缺點。首先,如果存在跨環境調用,則不起作用。當然,它會迫使你進入一個線程模型。

+0

謝謝,這是一個有趣的想法。但不幸的是,不適用於我的應用程序,它必須在個人電腦以及各種嵌入式平臺上運行。 – 2009-09-16 19:10:35

0

您可能希望有兩種類型的存儲 - 一種全局用於具體類型,一種用於TypeRefs本地。應將本地存儲放入當前正在解析的程序的上下文中。