| Visual Basic 中学校 関連用語集 |
|
|
読み方:シーアイエル
正式名称:Common Intermediate Language
| 意味 |
CILとは、CLIで規定されているプログラミング言語。
※「CIL」と「CLI」は別のものです。混同しないでください。
| 詳細 |
.NETアプリケーションを実行するための環境として定義されているCLIには、実行ファイルの形式やOSとのアクセス方法と並んで中間言語の仕様についても定められています。この中間言語がCILです。
CLIは標準化団体であるECMAの認定を受けて標準規格になっていますから、CLIの一部であるCILも標準規格です。
.NET言語で作成されたプログラムはコンパイルするとバイナリファイルになりますが、このバイナリファイルで表現されているプログラムは完全に等価なCILに変換することができます。
つまり、一般的なアセンブリ言語と機械語が等価な関係にあるのと同じです。
| バイナリベース | テキストベース | |
| 一般的な機械語の場合 | 機械語(マシン語) | アセンブリ |
| CILの場合 | 仮想機械語(仮想マシン語) | CIL |
※ただし、ここで言うアセンブリは.NET Frameworkで一般的に言う「アセンブリ」とは全く違う意味なので注意が必要です。
.NET Framework SDKに付属している「MSIL 逆アセンブラ」(ildasm.exe)はexeやdllなどコンパイル済みのファイルをCILに変換して表示します。コンパイル済みのexeファイルやdllファイルのプログラムをアセンブリとして見ることができます。
次の例は単純にたし算を行うプログラムをVisual BasicおよびCIL、仮想機械語の3種類で表現したものです。
| Dim
Value As
Integer Value = 6 Value += 27 MsgBox(Value) |
■Visual Basicのソースコード
| .maxstack 3 .locals init ([0] int32 Value) IL_0000: nop IL_0001: ldc.i4.6 IL_0002: stloc.0 IL_0003: ldloc.0 IL_0004: ldc.i4.s 27 IL_0006: add.ovf IL_0007: stloc.0 IL_0008: ldloc.0 IL_0009: box [mscorlib]System.Int32 IL_000e: ldc.i4.0 IL_000f: ldnull IL_0010: call valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.MsgBoxResult [Microsoft.VisualBasic]Microsoft.VisualBasic.Interaction::MsgBox(object, valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.MsgBoxStyle, object) IL_0015: pop IL_0016: nop IL_0017: ret |
■CILのソースコード(上記Visual Basicのソースコードをコンパイルして得られる)
| 00 1C 0A 06 1F 1B D6 0A 06 8C 36 00 00 01 16 14 28 53 00 00 0A 26 00 2A |
■仮想機械語のソース。実際のexeやdllにはこのように書き込まれている。
この例では、Value += 27は、アセンブリではldc.i4.s 27およびadd.ovfと表現されています。ldc.i4.sはCILでは1Fになり、27は1Bです。add.ovfはD6です。ですからCILでは1F 1B D6と表現されます。
この部分はわかりやすいように上述の例で色をつけておきました。
上述のように.NET言語はビルドするとすべてCILに変換されますので、Visual Basicであれ、C#であれ、Delphi(.NET対応のバージョン)で同じ内容のプログラムであれば論理的に等価なCILに変換されます。この仕組みのため.NETではプログラム言語による違いを従来ほど意識しないで済むようになっています。
・CILはアセンブリをベースとして設計された言語ですので、人間が直接CILを使用してプログラムするのは楽ではありません。
・CILはCPUに依存しない汎用性を持っています。
| Visual Basicとの関連 |
Visual Basicで作成されたすべてのプログラムはビルドするとCILに変換されます。
ただし、Visual Basic 6.0以前の環境ではCILではなくネイティブコードその他の形式に変換されます。