[Atelier Blue アトリエブルー]Homeプログラミング IL(CIL,MSIL)>CLRとCTS

CLRとCTS

前回のが、コードの雰囲気です。今回は「CLRとCTS」について説明させていただきます。

CLR(Common Laguage Runtime)

共通言語ランタイム。その名の通り、異なる機能を持った様々な言語から利用可能なランタイムの事を指します。これをターゲットに言語のコンパイラを作れば、CLRの環境全てでその言語が動く事になります。また、CLRを対象にライブラリを実装すれば、CLRを対象としたどの言語からでもそれ利用出来る事になります(ただし、言語によってはCLRの全てに従う事が出来ない場合もあります。詳しくは後で解説します)。

CTS(Common Type System)

共通型システム。型とは「0個以上のメンバを含むもの」です。型には「フィールド」「メソッド」「イベント」「プロパティ」というメンバがあり、それらには可視性(privateやpublic)が設定されます。全ての型はSystem.Object型から派生します。



ILを使う事の利点はCLR/CTSの全ての機能を使える点にあります(C#ですら制限があるのです)。逆に言えば、CLR/CTSを知らなければ、ILを無駄にする事になる訳です。私たちはこれからILについて学んでいきますが、同時にCLR/CTSを学んでいく事にもなります。

スタックマシン

たぶんここで説明しても問題ないと思います。ILのコードはスタックマシンと呼ばれる仮想マシンをターゲットとした作りになっています。分からない方が大半だと思うので説明します。

スタック

スタックというデータ構造は知っていると思います。一番最後に追加されたデータが一番最初に取り出されるLIFO(後入れ、先出し)のデータ構造です。

このスタックについてはpushpopの二つの操作があります。pushはデータの追加、popはデータの取り出しになります。

スタックマシンのデータ操作はこのスタックを中心に動きます。

スタックの図

ロード(load)とストア(store)

機械語ではレジスタとメモリ間の移動についてロードと、ストアという言葉を使います。ロードはメモリからレジスタへ、ストアはレジスタからメモリへの転送です。

ILの命令ではpushとpopよりもloadと、storeの方を目にする機会が多くなると思います。

loadは「ld~」storeは「st~」でという省略形がほとんどです。これらの命令は全て、レジスタではなくスタックを中心に動きます。loadは「~」からスタックへ、storeはスタックから「~」へです。

簡単な演算でのデモ

用語と概念の説明が終わったところで、簡単なデモです。それでは「1+2*3」計算してみましょう。

まずは「1+2*3」を逆ポーランド記法にします。「1 2 3 * +」ですね。命令列にすると次のような感じでしょうか?

.stacksize 3
ldnum 1
ldnum 2
ldnum 3
mul
add

この表現は今作った即席の物です。でも、言いたい事は分かると思います。これを実行すると、次のようになります。

スタックマシンのデモ

スタックマシン まとめ

私たちは、ILがスタックマシンを対象としたコードだった事に感謝するべきなのかもしれません。何せ、私たちでレジスタ割り当てを考えなくて良いのですから。

といっても、実際には実行時に機械語化されてレジスタ割り当てもちゃんとしてもらえるようになっています。ご心配なく。

それと、もうしばらくしたらローカル変数みたいな物がILでも使える事をお教えします。ですが、いっぺんはあまり良くないです。この話はまた今度。

また、レジスタ割り当てと同じように、足し算をしたい場合は「add」と簡単に記述できます。「add eax edx」とする必要はありません。この事で、スタックマシンのコードは命令パターンを減らし完結に記述できます。バイナリエディタでも結構読めます。



最後に次回のために重要な点を二つ。

ILは「int i= 1+2」のような記述の仕方ではなく、アセンブリ言語のように命令羅列で書きます。

ILはスタックマシンです。全ての命令はスタックを中心に回ります。つまり、ロードストアをひたすら繰り返します(addのような命令も内部ではロードストアです)。

では、次回とりあえずコンソール出力をしてみましょう。


ページの一番上へ
前のページへ 一覧に戻る 次のページへ
初版2006-8-8
[Atelier Blue アトリエブルー]Homeプログラミング IL(CIL,MSIL)>CLRとCTS