.NETのILの仕様(1)

それでは、CIL(Common Intermediate Language:(.NETで使用する)共通中間言語)について見ていこう。CILの言語仕様は、CLI(Common Language Infrastructure:共通言語基盤)に含まれる。そこで、CLIの仕様を参照するとヨロシイ。


ECMA-335:
http://www.ecma-international.org/publications/standards/Ecma-335.htm


この第3章である。何のことはない。ただのスタックマシンで、レジスタという概念は無い。強いていうならローカル変数(local variable)がレジスタに相当するのか。このローカル変数は、16bit indexで表せるぶんだけ使える。まあ、配列は配列で別の方法で確保できるので、ローカル変数としては65535個も使えれば十分である。ここで使っているローカル変数はJITerによって適宜レジスタ割付されると考えて良いだろう。スタックも仮想スタックなので、レジスタ割付で済む場合は使用されない。(と思う)


ところで、この16bit indexというのは0〜65535(全部で65536個)までなのだが、65535は使ってはならないとある。だもんで、0〜65534(全部で65535個)である。論拠は、以下のものだ。

Rationale: The reason for excluding 65535 is pragmatic:
likely implementations will use a 2-byte integer to
track both a local's index, as well as the total number of
locals for a given method. If an index of 65535 had
been made legal, it would require a wider integer to track
the number of locals in such a method.


早い話が、メソッド内で使われているローカル変数の数を渡したりするときに、65535まで使っていた場合、ローカル変数の個数は65536個で、これは2byte整数で表せないかららしい。まあ、言われてみればそんな気もする。


やや余談になるが、VM(仮想マシン)が「スタック+ローカル変数」という組み合わせは、いまのトレンドのようだ。JavaVMもこの形式になっている。JavaVMの場合、ローカル変数を16bit indexで表すためには、indexが2バイトであることを表すためにwide命令(0xc4)を先頭に入れる必要があるのだが、実質的にはCILと同じだと見て良いだろう。(つづく)