基本的な質問をします新しいForthユーザーが必要とする方法で答えられていないので、私はそれを実行します。
Forthのメモリは非常にターゲットに依存する可能性があるので、コードとデータが一緒に楽しく暮らせるフラットなメモリ空間であるという単純なモデルに限定して説明します。 (セグメンテーションされたメモリモデル、またはデータ用のコードおよびRAM用のFLASHメモリまたは他のより複雑なモデル)
辞書は通常、メモリの一番下から始まり、Forthシステムによって上向きに割り当てられます。単純なシステムの2つのスタックは、高メモリに存在し、通常は2つのCPUレジスタを指します。 (非常にシステムに依存)
最も基本的なレベルでは、メモリは単に辞書ポインタ変数の値を変更することによって割り当てられます。 (時々DPと呼ばれる)
プログラマーは、通常、この変数に直接アクセスするのではなく、いくつかの上位ワードを使用して制御します。
前述のように、 'HERE'は、辞書空間で次に使用可能なアドレスを返します。言及されていなかったことは、ここでは変数DPの値を取得することによって定義されたことでした。フォースで(システム依存、ここではなく説明のために有用)
は 'HERE' のようになります。
:HERE( - ADDR)DP @;
これだけです。
いくつかのメモリを割り当てるには、ここで上に移動する必要があります。これは「ALLOT」という単語で行います。
'ALLOT'のForth定義は、単にパラメータスタックから数値を取り出し、それをDPの値に加算します。だからそれ以上のものではない:
:ALLOT(n - )DP +! ; \ '+!内容変数にnを加えます。
私たちが作成した内容が 'ALLOTED'メモリ内に安全に保存されるように、新しい定義を作成するときにALLOTがFORTHシステムによって使用されます。
すぐには分かりませんが、ALLOTは負の数を取ることができるので、辞書のポインタを上下に動かすことができます。だから、あなたには、いくつかのメモリを割り当てると、このようにそれを返すことができます:それはアップし、このような
HEX 100充てる
とフリー:
HEX -100充てる
このすべてが、これがあると言ってForthシステムにおける最も簡単なメモリ管理の形態です。これがどのように使用されるかの例は、 'BUFFER'という単語の定義に見ることができます:
:バッファ:(n - )CREATE ALLOT;
'BUFFER:'は辞書に新しい名前を作成します(作成すると、名前のためにスペースを作っています)。名前の直後にnバイトのメモリが割り当てられ、Forthシステムの関連するハウスキーピングバイトメモリは今
を終了
MARKERのFOOの\マークHEX 2000 BUFFER:IN_BUFFER
今、私たちは8Kを持っているが、我々はちょうどタイプという名前のメモリのブロックを割り当てるようになりましたので
を使用バイトバッファc alled IN_BUFFER。 Standard Forthでそのスペースを再利用したい場合、FOOと入力すると、FOOの後に辞書に割り当てられたものすべてがForthシステムから削除されます。
ただし、一時的なメモリスペースが必要な場合は、「ここ」の上のすべてを自由に使用できます!
だから、あなたは、単にアドレスを指し、あなたがこれを好きにしたい場合は、それを使用することができます
:MYMEMORYここに200 +を。上記に未割り当てられたメモリへ\ MYMEMORY点
\ MYMEMORY moves with HERE. be aware.
MYMEMORY HEX 1000年ERASE \動的メモリ割り当てが解除を引き起こす可能性がある場合ゼロ
フォースは、典型的には、高性能組み込みアプリケーションのために使用されているの2Kバイトでそれを埋めます信頼できるコードなので、ALLOTを使用する静的割り当てが優先されました。しかし、より大きなシステムでは、ヒープを持っており、ALLOCATE使用し、無料で、我々はC.
BF
これは少し遅れているかもしれません。リンクの目的を説明してもらえますか? –
Sorry - > linkは、ポインターから "コンスセル"(LISPの用語を借用)のアクセッサで、 "次の"ポインタのアドレスになります。この実装では、「次へ」ポインタがコンスセルに格納されている最初のものであるため、NO-OPとして実装されています。 –