主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

.NET Framework、もしくはMono: IL(中間言語)ってなにさ

                
 WindowsでC#を使ったアプリケーションを動かすために必要な.NET Framework(以下.NET)や、Windowsを超えてLinuxやMac、iOSやAndroidでもC#でアプリを作れるようにしたMono。この,NETやMonoの環境で動くプログラミング言語は、IL(中間言語)と呼ばれるものにコンパイルされる。このコンパイルされた中間言語コードをJITコンパイル(実行時にコンパイルがされるということ)することでプログラムが動作する。

 C#から直接マシン語にならずに中間言語で止めておき、実行時にコンパイルがされるのはなぜか。これはCPUの違いを.NETで吸収するためだ。CPUごとにマシン語での命令コードは違ってくる。だからプログラムをマシン語にコンパイルしてしまうということはそこで動作環境を固定してしまうことになる。これを中間言語にとどめておけば、.NETが実行時にCPUに対応したマシン語を生成する。だから.NETを動作させられるCPUならどれにでも中間言語コードを移して動かせるということだ。

 でも実行時にコンパイルするならパフォーマンスが落ちるんじゃないかという問題が出てくる。本当に高速処理を求められるプログラムを書きたいなら.NETを介さずにC++でも書けということになるが、昨今のデバイスはそういう意味では処理能力の高いCPUを積んでいるので.NETを使ってもそうそう問題にならない。
 さすがに.NETの上で動的言語など動かしたら使いものにならないパフォーマンスになるだろう、との予想で.NET上でPythonを動かすという取り組みで論文を書こうとした人がいて、実際にそれをやってみた。思いのほかパフォーマンスが良かったのでそれがIronPythonとして開発されることになり、.NETの上にRubyやLISPなどほかの動的言語も入ってくることになった。

 C#をはじめとしてさまざまな言語がクロスプラットフォームで動く基盤となっている.NET、もしくはMonoであるけど、それらの言語はどれもいったん中間言語にコンパイルされる。中間言語ってどんなだろう? ちょっと触れてみる。

http://codezine.jp/article/detail/2624?p=1

http://www.codeproject.com/Articles/3778/Introduction-to-IL-Assembly-Language

 上記のリンク先に中間言語で書かれたコードがある。主に参照の宣言と関数からコードは成っており、一見するとC言語と似ている部分はある。だけど計算がやたらめんどそうだ。使用メモリスタックの指定から数値の代入、加算命令の発行と順を追わなければならない。Cなどの高級言語では一行で書けるようなことも、複数行にまたがって書かねばならない。このへんはアセンブラみたいだ。
    .maxstack 2
ldc.i4 1
ldc.i4 2
add

1+2+3などと式に出てくる数値を増やすなら、このスタックへの代入と四則演算命令を繰り返し、基本的に2つずつ値を処理していかねばならない。すっごい手間。ためしにそれをやってみる。比較のためにC#コードも載せておく。
C#
var a = 10;
var b = 20;
var c = 30;
var result = a + b + c;
Console.WriteLine(result);


IL
	.entrypoint
.maxstack 2

ldc.i4.s 10 // loads value on the stack
ldc.i4.s 20
add

ldc.i4.s 30
add

call void [mscorlib]System.Console::WriteLine(int32)
ret


 中間言語でまともなアプリケーションを作ろうとすれば、その手間は途方もないものになる。でも.NET互換のMonoやUnityの開発者が作った.NET上で動くプログラミング言語BooやUnityScriptは中間言語をおさえているということになる。畏敬の念が沸いてくるところ。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。