Next: , Previous: , Up: Forth Tutorial   [Contents][Index]


3.23 Memory

以下使用してグローバル変数 v を作成できます:

variable v ( -- addr )

v は、スタックにメモリ内の、とあるセルのアドレスをプッシュします。 このセルは variable によって予約されています。 !(ストア)を使用してスタックからこのセルに値を保存し、 @(フェッチ)を使用して値をメモリからスタックにロードできます:

v .
5 v ! .s
v @ .

dump を使用すると、 メモリの生のダンプ(メモリー・ダンプ)を確認できます:

v 1 cells .s dump

Cells ( n1 -- n2 ) は、 n1 個のセル が占めるバイト数(より一般的にはアドレス単位(address units)(aus))を与えます。 そして、 あなたは、 さらに多くのメモリを予約することもできます:

create v2 20 cells allot
v2 20 cells dump

変数のようなワード v2 を作成し、 20 個の初期化されていないセルを予約します。 v2 によってプッシュされたアドレスは、 これら 20 個のセルの先頭を指します(see CREATE)。 あなたは、 アドレス演算を使用して、 これらのセルにアクセスできます:

3 v2 5 cells + !
v2 20 cells dump

, を使用してメモリを予約 かつ 初期化できます:

create v3
  5 , 4 , 3 , 2 , 1 ,
v3 @ .
v3 cell+ @ .
v3 2 cells + @ .
v3 5 cells dump

研究課題(assignment): 最初のセルは addr 、 次のセルは addr cell+ などとして、 u 個のセルの値の合計を計算する定義 vsum ( addr u -- n ) を記述してみましょう。

variablecreate の違いは、variable がセルを割り当てる(allots)ことと、 標準 Forth では変数(variable)に追加のメモリを割り当てることができないことです。

新しいワードを作成せずにメモリを予約することもできます:

here 10 cells allot .
here .

最初の here は(最初の here 時点の)ディクショナリ領域の後のアドレスをプッシュし、 メモリ領域の開始アドレスとして使い、 2 番目の here は(2 番目の here 時点の)ディクショナリ領域の後のアドレスをプッシュします。 この開始アドレスはどこかに保存する必要があります。 そうしないと、 あなたはこのメモリ領域を再度見つけるのが困難になります。

Allot はディクショナリ・メモリを管理します。 ディクショナリ・メモリには、 Gforth や他のほとんどの Forth システムの、 ワードなどのシステムのデータ構造が含まれています。 これはスタックのように管理されます。 あなたは以下のようにして割り当て(allot)したメモリを解放できます:

-10 cells allot
here .

注意: その合間に新しいワードを作成した場合、 それを実行できないことに注意してください(allot で作成されたメモリが、 もはやディクショナリ「スタック」の頂上ではなくなるため)。

その代わりに、 allocatefree を使用すると、 任意の順序でメモリを解放できます:

10 cells allocate throw .s
20 cells allocate throw .s
swap
free throw
free throw

throw はエラー(メモリ不足など)を処理します。

また、 ガベージ・コレクター なら、 メモリを明示的に解放(free)する必要がなくなります。

こちらも参照ください: Memory