共通言語ランタイムの概要
更新 : 2007 年 11 月
コンパイラやツールが共通言語ランタイムの機能を公開することによって、プログラマは、このマネージ実行環境の利点を利用するコードが記述できるようになります。このような共通言語ランタイムに対応した言語コンパイラを使用して作成したコードはマネージ コードと呼ばれます。マネージ コードは、言語間の統合、言語間の例外処理、強化されたセキュリティ、バージョン管理と配置のサポート、コンポーネント間の対話の簡易モデル、デバッグ サービスとプロファイル サービスなど、さまざまな機能を利用できます。
マネージ コードが共通言語ランタイムからサービスを受けられるようにするために、言語コンパイラは、そのコード内の型、メンバ、および参照を記述したメタデータを生成する必要があります。メタデータはコード内に格納されます。つまり、共通言語ランタイムの読み込み可能なすべてのポータブル実行可能 (PE) ファイルには、メタデータが含まれていることになります。共通言語ランタイムは、クラスの検索と読み込み、メモリ内でのインスタンスのレイアウト、メソッドの呼び出しの解決、ネイティブ コードの生成、セキュリティの強化、およびランタイムのコンテキスト境界の設定にメタデータを使用します。
共通言語ランタイムはオブジェクトのレイアウトを自動的に処理し、それらのオブジェクトへの参照を管理し、不要になったオブジェクトを解放します。このような方法で有効期間を管理されるオブジェクトをマネージ データと呼びます。ガベージ コレクションによって、一般的なプログラミング エラーだけでなくメモリ リークもなくなります。コードがマネージ コードの場合、作成する .NET Framework アプリケーションではマネージ データ、アンマネージ データ、またはマネージ データとアンマネージ データの両方を使用できます。プリミティブ型などのデータ型は言語コンパイラが独自に提供しているため、データがマネージ データかどうかが不明な (または把握する必要がない) 場合もあります。
共通言語ランタイムでは、複数の言語間で対話できるオブジェクトを含むコンポーネントやアプリケーションを簡単にデザインできます。異なる言語で記述されたオブジェクトが相互に対話でき、それらのオブジェクトの動作が緊密に統合されます。たとえば、あるクラスを定義してから、そのクラスの派生クラスを別の言語で作成したり、そのクラスに対して別の言語で記述したメソッドを呼び出したりできます。また、あるクラスのインスタンスを別の言語で記述されたクラスのメソッドに渡すこともできます。このような言語間の統合を実現できるのは、共通言語ランタイムに対応した言語コンパイラとツールが、共通言語ランタイムによって定義されている共通型システムを採用し、型の作成、使用、永続化、型へのバインディング、および新しい型の定義に関する共通言語ランタイムの規則に従っているためです。
すべてのマネージ コンポーネントは、関連するコンポーネントとリソースについての情報をメタデータの一部として保持しています。共通言語ランタイムはこの情報を使用して、作成したコンポーネントまたはアプリケーションが必要とする特定バージョンのコンポーネントやリソースがあることを確認します。これにより、不明な依存関係によってコードが中断される確率が低くなります。登録情報や状態データはレジストリ内では設定や保守が難しくなるため、レジストリには格納されなくなりました。代わりに、定義したすべての型およびその依存関係はコードと共にメタデータとして保存されます。これによって、コンポーネントのレプリケーションと削除をより簡単に実行できるようになりました。
言語コンパイラおよびツールは、開発者にとってわかりやすく役に立つ方法で共通言語ランタイムの機能を公開します。つまり、ある環境では重視されている共通言語ランタイムの機能が、別の環境ではそれほど重視されていないという場合もあります。共通言語ランタイムがどのような利点をもたらすかは、使用するコンパイラやツールによって異なります。たとえば、Visual Basic の開発者が共通言語ランタイムを使用した場合は、Visual Basic 言語のオブジェクト指向機能が強化されたと感じるでしょう。ランタイムの利点は次のとおりです。
パフォーマンスの向上。
異なる言語で開発されたコンポーネントを簡単に利用可能。
クラス ライブラリによって提供される拡張性のある型。
継承、インターフェイス、オーバーロードなどのオブジェクト指向プログラミングの新しい言語機能、マルチスレッドでスケーラブルなアプリケーションの作成を実現する明示的なフリー スレッドのサポート、構造化例外処理およびカスタム属性のサポート。
Microsoft® Visual C++® .NET を使用する場合は、Visual C++ を使用してマネージ コードを記述できます。これにより、マネージ実行環境を利用できるだけでなく、使い慣れた強力な機能や幅広いデータ型にもアクセスできます。ランタイムには、次のような機能も含まれています。
言語間の統合、特に言語間の継承。
ガベージ コレクション。オブジェクトの有効期間を管理することにより、参照カウントが不要になります。
自己記述型オブジェクト。これにより、インターフェイス定義言語 (IDL: Interface Definition Language) が不要になります。
コンパイル後は共通言語ランタイムをサポートするすべての CPU およびオペレーティング システムで実行可能。
また、C# 言語を使用してマネージ コードを記述することもできます。その場合には次の利点があります。
完全なオブジェクト指向のデザイン。
非常に強力なタイプ セーフ。
Visual Basic の簡易さと C++ の強力な機能の融合。
ガベージ コレクション。
C および C++ に類似した構文とキーワード。
タイプ セーフとセキュリティを強化するために関数ポインタではなくデリゲートを使用可能。アンマネージ コードとアンマネージ データについては、C# の unsafe キーワード、および C# コンパイラ (Csc.exe) の /unsafe オプションを使用することによって関数ポインタを使用できます。