WisdomSoft - for your serial experiences.

C#とは?

C# 言語の概要と .NET Framework との関係について解説します。

.NET Framework と C#

C# は、Microsoft が提唱するアプリケーション実行基盤である .NET Framework で動作するアプリケーションを開発するためのプログラミング言語です。.NET Framework は OS やプラットフォームを抽象化したアプリケーション開発を提供する新しい動作環境であり、コンパイラやクラスライブラリを提供するサービスとも言えます。

C# は C/C++ の文法をベースに完成度の高い現代的なプログラミングをサポートします。C# は C++ のような自由で高パフォーマンスな威力を持ちながら、安全性と生産性を高めることを実現しています。.NET Framework は多くの環境でサポートされているため、C# を学習することで、組み込み、Web、ゲーム、データベース、Office 開発など、多様なアプリケーション開発に対応できます。

.NET 対応アプリケーションは .NET の仮想マシン上で動作します。この仮想マシンを共通言語ランタイム(Common Language Runtime/CLR) と呼びます。共通言語ランタイムが実装されている環境であれば、物理コンピュータやシステムの種類とは無関係にアプリケーションを実行できます。

CIL

Java 言語は、コンパイルするとバイトコードを生成し、Java 仮想マシンはこのバイトコードを受けとって実行する中間言語を用いた実行環境です。Microsoft .NET も仮想マシンという形態を取っていますが、コンパイラは何を吐き出すのでしょう?

.NET も Java のように、仮想マシン仕様の中間言語を持ちます。これが共通中間言語(Common Intermediate Language/CIL) と呼ばれる言語です。アセンブリ言語に類似した言語で、CIL だけで開発することも可能です。.NET Framework が標準化される前は、マイクロソフト中間言語(Microsoft Intermediate Language/MSIL)と呼ばれていた時期もあります。

Microsoft は共通言語仕様 (Common Language Specification/CLS) を定めていて、CLR で動作するアプリケーション開発用のコンパイラが守るべき規則を定義しています。あなたが、CLS 互換のコンパイラを作成し CIL にコンパイルする独自の環境を作ることもできるのです。

.NET 全体で見れば C# は .NET アプリケーション開発の手段の 1 つでしかありません。CIL を生成できる言語ならば、.NET アプリケーションは何から作られていても同じです。.NET アプリケーションは C# の他に VB .NET(Visual Basic を CLS に対応させた言語)や C++ など、多くの言語を選択できます。

ところで、Microsoft の C# コンパイラはバイトコードのようなものは出力しません。実際にやってみると.EXE 実行ファイルを生成します。.EXE 実行ファイルはネイティブな機械語であり、中間言語ではありません。なぜ、ネイティブな実行ファイルが生成されるのでしょうか?

Java はコンパイルするとバイトコードを出力し、実行するにはコンピュータにインストールされている VM で実行する必要があります。ところが Microsoft の開発環境は .EXE ファイルの内部にリソースとしてこれを書き込むのです。

ネイティブプラットフォームは通常 MSIL を解釈することはできないので、実行ファイルを実行すると CLR が JIT コンパイラで CIL をコンパイルします。JIT は中間言語をネイティブな機械語に翻訳し、これをメモリにキャッシュします。これは大きな利点があり、インタプリタのように、実行する度に変換するのではなく、実行前に一度の処理で中間言語がコンパイルされるということを意味します。

関連文書