目次

ポイント

  • メモリにはスタックとヒープの2種類の使い方がある

概要

(書きかけ)

「スタックとは」「ヒープとは」の説明を入れる予定。 とりあえず、デモ用のアプリだけ先に公開。

値型と参照型」の理解の手助け用。

模擬的に視覚化

スタックとヒープの挙動を模擬的にデモするような Silverlight アプリを作ってみました。

Microsoft 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();

Line a = newLine();

a.Origin = c;

Circle b = newCircle();

b.Center = c;
{

  a = new[8]

}
スコープ内で新しい変数 a を作成。

スコープを抜けると変数 a の持つ参照は無効になる。
{

  Point a = new Point();

}

左下の編集ボタンを押せば、疑似コードの編集ができます。 エラーチェックとかまるでしてなくて、文法違反なコードを書いたらその部分まるごと無視します。

スタック(真ん中辺りの青いところ)

スタックを模したもの。 変数の中身はここに格納されます。

ちなみに、このアプリ上ではスタックの深さは20。

ヒープ(右側の黄色いところ)

ヒープを模したもの。 new したインスタンスはここに作成されます。

スタックからたどれるインスタンスはカラーで、 誰からも参照されなくなったインスタンスはグレーで表示。

Java や C# などのように、ガベージコレクションを持つ言語では、 誰からの参照されなくなったインスタンスもしばらくヒープ上に残ります。 ヒープの空き領域がなくなった時点でゴミ掃除が行われて、 誰も参照していない場所が解放されます。

このアプリ上ではヒープのサイズは400。

関連物ダウンロード

ちなみに、 疑似コードの構文解析は M を使ってるわけではなくて、 Silverlight 中では正規表現を使って実装しています。 MGrammer はお試しで書いたもの。

更新履歴

ブログ