2017-07-29 31 views
3

在試圖找出Forth如何管理字典(和一般的內存)時,我遇到了this頁面。熟悉C語言,我對指針的概念沒有任何問題,並且我假設我正確地理解了一切。但是,在頁面末尾是several exercises,在這裏我注意到一些奇怪的東西。爲什麼Forth每個變量保留兩個單元格?

練習9.4,假設DATE已經被定義爲VARIABLE,問有什麼區別使用用戶

DATE . 

' DATE . 

運動之間 9.5不相同變量BASE

根據提供的答案,這兩個短語會給出相同的結果(也與BASE)。然而,使用Win32Forth嘗試此操作會給出4個字節(1個單元格)的差異結果。下面是我做的:

here . 4494668 ok 
variable x ok 
x . 4494672 ok 
' x . 4494668 ok 

創建另一個變量給出了類似的結果:

variable y ok 
y . 4494680 ok 
' y . 4494676 ok 

因此,它看起來像每個變量得到的不只是一個細胞(該值),而是兩個細胞。變量本身指向存儲實際值的位置,並且檢索執行令牌處的內容(使用' x ?)可爲這兩個變量提供0040101F

對於練習9.5,我的結果是:

base . 195F90 ok 
' base . 40B418 ok 

這些甚至還沒有接近對方。然而,本練習的答案提到結果可能取決於BASE的定義方式。

回到正常變量,我的主要問題是:爲什麼兩個單元格爲每個變量保留?

此外:

  • 由於只有一個單元格中包含的實際價值,什麼其他單元格的內容是什麼意思?
  • 這是Win32Forth特有的嗎?在其他實現中會發生什麼?
  • 這是不同的運行時和編譯時變量?
  • 上述問題的答案如何適用於用戶變量(例如BASE)?

EDIT1:好了,等還存儲了每個變量的標頭,並使用'給你這頭的地址。從我的測試中,我會得出結論標題只使用一個單元格,這不對應於標題應包含的所有信息。其次,根據這個練習,檢索一個變量的地址應該對兩種情況給出相同的結果,這看起來與頭部的存在完全矛盾。

我的直覺是,這是所有非常具體的實現。如果是這樣,Win32Forth會發生什麼,根據練習會發生什麼?

+2

還有更多的保留。大多數Forth單詞(包括變量)都有一個完整的標題,包含指向前一個單詞的字段,變量的名稱(通常該名稱也存儲在標題中),變量所在的代碼參考,並與數據單元格。然後是數據單元本身(或多於一個,取決於創建變量時分配的內容)。 Tick(''')返回爲後面的單詞執行的代碼的地址。對於解釋代碼和編譯代碼,這甚至可能不同...... –

+1

...如果引用該單詞,如「DATE」本身,則該變量的代碼將數據地址放入堆棧。所以'DATE'和'DATE'本身有很大的區別。 –

+0

https://forth-standard.org/standard/core/Tick。 –

回答

3

這大致上是如何使用傳統內存佈局的字典中的定義。請注意,實現可能與此背道而馳,有時甚至很多。特別是,這些字段的順序可能不同。

Link to previous word (one cell) 
Flags (a few bits) 
Name length (one byte, less a few bits) 
Name string (variable) 
Code field (one cell) 
Parameter field (variable) 

除代碼和參數字段以外的所有內容都被視爲標題。代碼字段通常在參數字段之前。

'給你一個單詞給你一個XT或執行令牌。這可以是任何實現幻想,但在許多情況下,它是代碼字段的地址。

執行使用CREATEVARIABLE創建的單詞可爲您提供參數字段的地址。

這可能是爲什麼在Win32Forth中,兩個地址相差4個字節或一個單元格。我不知道爲什麼練習的答案在那裏沒有差別。

假設BASE是一個用戶變量,它可能是這樣工作的:每個任務都有其自己的用戶區,其中分配了用戶變量。所有用戶變量都知道它們在該區域內的具體偏移量滴答BASE爲您提供其XT,這是所有任務相同。執行BASE通過將其偏移量添加到用戶區的底部來計算地址。

+0

因此,Forth應該處理一些變量的具體方式,但確切的具體實現方式和具體位置在哪裏。感謝您的澄清! – Mattenii

相關問題