在試圖找出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會發生什麼,根據練習會發生什麼?
還有更多的保留。大多數Forth單詞(包括變量)都有一個完整的標題,包含指向前一個單詞的字段,變量的名稱(通常該名稱也存儲在標題中),變量所在的代碼參考,並與數據單元格。然後是數據單元本身(或多於一個,取決於創建變量時分配的內容)。 Tick(''')返回爲後面的單詞執行的代碼的地址。對於解釋代碼和編譯代碼,這甚至可能不同...... –
...如果引用該單詞,如「DATE」本身,則該變量的代碼將數據地址放入堆棧。所以'DATE'和'DATE'本身有很大的區別。 –
https://forth-standard.org/standard/core/Tick。 –