特殊な
動的オブジェクトとして、テンポラリオブジェクト(Temporary Object)があります。一つのワードの定義中でのみ有効なオブジェクトです。普通の局所変数のオブジェクト版ということになります。局所でなくテンポラリ(一時的)と呼ぶのは、局所(Local)という語は他で頻繁に使われているから、別の名前にしたということだそうです。
コロン定義を開始して、ワード名と局所変数等の宣言が終わった直後、実質的な定義内容が始まる前に、宣言しなければなりません。その際、宣言を"TEMP{"と"}"で囲みます。ひな形としては、
: MyWord { np1 np2 \ loc1 loc2 -- }
TEMP{
VAR TempVar
String TempStr
Handle TempHndl
}
...... ;
のようになります。このように宣言されたオブジェクトは、MyWordが呼び出されたときに、生成・初期化され、このワードの処理を抜けるときに自動的にRelease:され、廃棄されます。ヒープに領域を取るオブジェクトでも、プログラマがRelease:する必要はありません。もちろん、このワードが実行されている間は、自由にメッセージを送ることができ、状態も維持されます。
テンポラリオブジェクトは、リターンスタック領域に特別に設定されるメモリーフレーム内に生成されます。この点、普通のヒープオブジェクトとは違います。このため、あまりに沢山のオブジェクト、あるいは、あまりに巨大なオブジェクトを直接にテンポラリオブジェクトにすると、クラッシュする可能性があります(経験はありませんが)。どうしても必要なときは、ヒープオブジェクトを扱うオブジェクトを用いればよいでしょう。
ヒープオブジェクトを格納するためのオブジェクトをテンポラリオブジェクトにすることもできます。この場合、ワードの処理を抜けた時点でRelease:メッセージが自動的に送られるので、ヒープ領域も自動的に解放されることになります。途中でEXITしても大丈夫です。普通のプログラミング言語では、オブジェクト型(実体はポインタでしょう)局所変数を宣言して、newによって生成されたヒープ上のオブジェクトを格納しますが、処理を抜けたときに、局所変数の廃棄はしても、ヒープそのものは自動的には解放してくれないのではないかと思います。これが、Garbage collectorが必要になる主要な源泉ではないかと思います。全ての局面でというわけではありませんが、MopsでGarbage Collectorのありがたみをあまり感じないのは、こういった違いが背景にあるのではないかと思います。
関連項目:
最終更新:2018年12月23日 16:09