ポイント
- メモリにはスタックとヒープの2種類の使い方がある
概要
(書きかけ)
「スタックとは」「ヒープとは」の説明を入れる予定。 とりあえず、デモ用のアプリだけ先に公開。
「値型と参照型」の理解の手助け用。
模擬的に視覚化
スタックとヒープの挙動を模擬的にデモするような Silverlight アプリを作ってみました。
以下、使い方の説明。
疑似コード(左半分)
疑似コードで記述されたプログラム。 コードの先頭から選択した行までの実行結果が右側に表示されます。
疑似コードの書き方は、 変数の宣言とインスタンスの生成、参照関係だけを記述する独自言語。
疑似コード | 説明 | 対応する C# の例 |
---|---|---|
x = 100
|
新しい変数 x を用意して、値 100 を格納。 |
int x = 100;
|
a = new[8]
|
サイズ 8 バイトのインスタンスを生成して変数 a に格納。 |
Point a = new Point();
|
c = new[8] { a b }
|
インスタンスを生成して c に格納。 このインスタンスは別のインスタンス a と b から参照されてる。 |
Point c = newPoint();
|
{
|
スコープ内で新しい変数 a を作成。 スコープを抜けると変数 a の持つ参照は無効になる。 |
{
|
左下の編集ボタンを押せば、疑似コードの編集ができます。 エラーチェックとかまるでしてなくて、文法違反なコードを書いたらその部分まるごと無視します。
スタック(真ん中辺りの青いところ)
スタックを模したもの。 変数の中身はここに格納されます。
ちなみに、このアプリ上ではスタックの深さは20。
ヒープ(右側の黄色いところ)
ヒープを模したもの。 new したインスタンスはここに作成されます。
スタックからたどれるインスタンスはカラーで、 誰からも参照されなくなったインスタンスはグレーで表示。
Java や C# などのように、ガベージコレクションを持つ言語では、 誰からの参照されなくなったインスタンスもしばらくヒープ上に残ります。 ヒープの空き領域がなくなった時点でゴミ掃除が行われて、 誰も参照していない場所が解放されます。
このアプリ上ではヒープのサイズは400。
関連物ダウンロード
ちなみに、 疑似コードの構文解析は M を使ってるわけではなくて、 Silverlight 中では正規表現を使って実装しています。 MGrammer はお試しで書いたもの。