2017-07-29 11 views
3

Forthが辞書(そして一般的にはメモリ)をどのように管理しているのか調べようとしているうちに、私はthisページを訪れました。 Cに精通しているので、ポインタのコンセプトには問題ありません。すべてを正しく理解していると思います。しかし、ページの末尾にはseveral exercisesがあり、ここで私は何か変わったことに気づいた。 DATEVARIABLEとして定義されていると仮定Forthは変数ごとに2つのセルを予約するのはなぜですか?

運動9.4は、

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の定義方法に依存する可能性があることに言及しています。

通常の変数に戻って、私の主な質問はこうです:変数ごとに2つのセルが予約されているのはなぜですか?

さらに:

  • だけ1つのセルは実際の値が含まれているので、他のセルの内容が何を意味するのですか?
  • これはWin32Forth固有のものですか?他の実装ではどうなりますか?
  • これは、実行時変数とコンパイル時変数で異なりますか?
  • 上記の質問に対する回答は、ユーザー変数(BASEなど)にどのように適用されますか?

EDIT1:さて、等も各変数のヘッダを格納し、'を使用してあなたにこのヘッダのアドレスを与えます。私のテストでは、ヘッダーに含まれるべきすべての情報に対応していないただ1つのセルをヘッダーが使用すると判断します。第2に、エクササイズによれば、変数のアドレスを検索すると、両方のケースで同じ結果が得られるはずであり、ヘッダーの存在に完全に矛盾するように見える。

これはすべて実装固有のものです。もしそうなら、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または実行トークンが得られます。実装には何かがあるかもしれませんが、多くの場合、コードフィールドのアドレスです。

CREATEまたはVARIABLEで作成した単語を実行すると、パラメータフィールドのアドレスが表示されます。

これはおそらく、Win32Forthでは2つのアドレスが4バイトまたは1つのセルで異なるためです。私は練習の状態への答えが何も違いがなければならない理由を知らない。

BASEがユーザ変数であると仮定すると、おそらく次のように動作します。すべてのタスクには、ユーザ変数が割り当てられる独自のユーザ領域があります。すべてのユーザー変数は、この領域内の特定のオフセットを知っています。 BASEにチェックを入れると、すべてのタスクで同じXTが得られます。 BASEを実行すると、そのオフセットをユーザ領域のベースに加算してアドレスを計算します。

+0

したがって、Forthが変数を処理する特定の方法がありますが、正確な実装方法と実装方法は正確です。解明してくれてありがとう! – Mattenii

関連する問題