Mops辞書

Mopsで定義されたワードは辞書に保管されます。これはForth系環境の特色でもあります。実行されるべきコードと処理されるべきデータが、そこに格納され、必要に応じて呼び出されます。辞書の内容は下(アドレスの数値が小さい)から上(同大きい)へと伸びていきます。

PowerMopsおよびiMopsの辞書は一つではありません。データ辞書とコード辞書の二つに分かれています。それぞれがハンドルないしポインターでヒープメモリー上に確保され、必要に応じて拡大します。このような分割は、PPC MacintoshないしIntel-Macでの実行可能コードのフォーマットが、実行コード部分とデータ部分を区分けして保存することによって実行効率の向上を図っていることに対応したものです。PowerMopsに実行ファイル形式はPEF形式と呼ばれ、IntelないしARM上での実行ファイル形式はMach-Oフォーマットと呼ばれますが、どちらも、上のような実行コードとデータ部分を分離する方式が採用されています。

このように、辞書はメモリー上に存在するため、その場所はアドレスによって指定されます。辞書にコードをコンパイルしていくと、次第に辞書は埋まってきます。辞書の空き領域の先頭のアドレスがわかれば、次にどこからコードを記録していけば良いのかがわかります。この値は、変数で保守されています。

辞書の実行コード領域の空き領域の先頭を示す変数は、CDPです(おそらく、CoDe Pointerという意味でしょう。)。これはValue変数ですが、辞書のコード領域を確保するワードでは自動的に動かされます。自分自身でずらすことによって、スペースを確保することもできます。

データ領域の空き領域の先頭を示す変数は、DPです(おそらく、Data Pointerということでしょう)。これもValue変数です。例えば、ALLOTのようなワードは、このDPを必要な幅だけ進めます。"HERE"は、Forth標準ワードで、辞書の空きスペースの先頭を示すもので、ワードとして実行されると、その値がスタックに積まれます。Mopsでは、"HERE"は、DPの方の値を取り出すワードです。HEREの値は自分で変えることはできません。

Mops環境上では、当然のことながら、辞書は読み書き自由です。しかし、いったん辞書が保存され、あるいはアプリケーションがインストールされて、一つの実行ファイルに固められてしまった後は、コード領域にはもはや書き込みはできません(Read Only)。CDPを使って自らコードを辞書に書き込んだりするときには、このことに注意しなければなりません。

もっとも、普通のアプリケーションで、CDPやDPを自分で使う必要がでてくることは、ほとんどないでしょう。むしろ、Mopsシステムの機構の説明と考えてください。


関連項目:






最終更新:2019年11月15日 16:36