初めましての方は「はじめまして」、どこかで出会った事が方は「お久しぶりです」。私は利都と申します。この連載「IL入門」は、今までちまちま集めてきた.Netの中間言語についてある程度の目処が立ったために書かれはじめたモノです。これの元として、「ILについての予備知識」や「CIL(MSIL)解析」を書いてきました。この連載ではそれを元にして.Netの中間言語について説明していきます。
色々といたらないところも多くあると思います。何かございましたら、ページの下に書いてあるメールアドレス、又は掲示板に書いていただけるとありがたいです。
それでは、どちら様も「よろしくお願いします」。
読者の方々は、アセンブリ言語でプログラムを組んだ事があるでしょうか?中には、機械語でプログラムを組んだ事がある方もいるでしょう。
「IL」とは「Intermediate Language」つまり中間言語のことです。.Netでは、全ての言語がコンパイルされると中間言語になります(C++/CLIなど特殊な例を除く)。そして、実行時にネイティブコードへのコンパイルを行います。これには様々な利点や問題点がありますがここでは割愛します。
ILには現在二つのILがあります。CIL(Common Intermediate Language)とMSIL(Microsoft Intermediate Language)です。MSILはCILを準拠しています。
つまり、これから私たちがILを書いて行くに当たってはCIL(もしくはMSIL)を使っていく事になります。
要するに、中間言語して「共通中間言語」と「マイクロソフト中間言語」があるという事です。
重要なのはここからです。この中間言語とはバイナリ…つまり機械語に近い状態になったもの、コード…つまり人間が読むアセンブリ言語に近い状態になったものも同じ「IL」という呼ばれ方をされるようです。
「C#をILにコンパイルした」これは、バイナリとなっている状態も、コードとなっている状態もどちらも指せる曖昧な表現です。ただし、文脈からはバイナリになっていると考えるのが妥当でしょう。
もちろん私たちが書くのはコードのILです。それを実行する時にはバイナリのILです。これらは完全な対応になっています(表現上情報の欠落がある程度起こるが、問題になる程度ではない)。
というわけでこの連載も紛らわしくない限りILと表現させていただきます。
※「コード」という表現は「符号」を表すためあまり適切でないかもしれませんが、「バイナリ」との対比です。
とりあえず、用語を説明したところでILの特徴です。
と、私も知らない可能性を秘めた、オブジェクト指向の機械語なのです。
「CIL」は「Common Intermediate Language」あえて日本語に訳すと「共通中間言語」になる。ILの1つ。汎用フォーマットです。
「MSIL」とは「Microsoft Intermediate Language」の事です。MSILもILの1つで拡張フォーマットです。MSILはCILに準拠しています。マイクロソフトの.NetのコンパイラではMSILのコードを作り出すそうです。
とりあえず用語説明です。他の用語についてはまとめて説明すると頭がパンクするのでその都度説明していきます。次は、ILコードをexeにする方法と、その他です。