VisualWorks:変数の共有
2007/03/30 (Fri) 22:07:46 JST
変数の共有 (copied values)
copying/full copying block ではメソッドや外部ブロックの変数にアクセスする必要があり、ブロックをスタックに積むときに共有する変数のオブジェクトを渡します (ポインタをコピーするので、この共有するオブジェクト群を copied values と呼びます) 。
このときブロックで変数を参照するのみであればオブジェクトをそのまま渡せば済みますが、それだけでは変数を変更できません。そこでVisualWorksでは変数を配列に入れて特別な変数スタックとし、メソッド・ブロック間で共有するようになっています (ここでは共有配列と呼ぶことにします) 。この配列を共有することで、どのコンテキストでも自由に変数を変更・参照できるようになります。
共有する変数を渡す・受け取るタイミング
ブロックの生成時に変数の受け渡しを行います。
レシーバ・インスタンス変数
ブロック内でレシーバやインスタンス変数を参照・代入する場合、メソッドのレシーバをブロックに渡します。
インスタンス変数にアクセスするインストラクションは、 共有配列にアクセスするものと同じです。これはVisualWorks (を含む多くのSmalltalk処理系) の配列のデータ構造がオブジェクトと同じためです(インスタンス変数は配列で管理されていて、これを利用して配列オブジェクトが実装されています) 。
引数・一時変数の参照
ブロック内で引数・一時変数を参照するのみ (代入を行わない) 場合、オブジェクトをそのままブロックに渡します。代入しなければ共有配列に入れる必要はありません。
一時変数に代入する場合
ブロック内で外部コンテキストの一時変数に代入している場合、一時変数を含む配列をブロックと外部コンテキストで共有します。外部コンテキストでもこの配列を通して一時変数の参照と代入を行うので、どのコンテキストでも一時変数を共有できるようになります。
なお、VisualWorksを含むたぶん多くのSmalltalk処理系 (あまり熱心に確認してません) では引数に再代入することはできません。
Inverse Pages: VisualWorks