このページの本文へ

.NET FrameworkとCommon Language Runtime

インサイドMicrosoft.NET(その2)

2000年10月25日 21時24分更新

文● Tetsuya Hara and Peter Hamilton

  • この記事をはてなブックマークに追加
  • 本文印刷
 

 ここでは、Common Language Runtimeの構造と機能について見ていく。Common Language Runtimeは、Visual BasicやC++、C#、COBOL、Perlなど、それ以外にも多くの開発言語をサポートし、現在以下のようなプログラミング言語が使用可能である。

  • Perl
  • Python
  • COBOL
  • Haskell
  • ML
  • Jscript
  • VBScript
  • Ada
  • APL
  • Eiffel
  • CC++
  • Pascal
  • Visual Basic
  • C#
  • SmallTalk
  • Oberon
  • Scheme
  • Mercyry
  • Oz
  • Objective Caml

 Common Language Runtimeの構造は、Figure 6のように示される。これは、「.NET Framework」の構成要素とサービス(Figure 5)で示したなかの下の部分である。

Figure 6 Common Language Runtimeの構造

Figure 6 Common Language Runtimeの構造

 Common Language Runtimeは、バイナリのコードを「Class loader」がローディングし、アプリケーションの実行メモリ空間のなかに展開してレイアウトを行なう。プログラムの実行に際して、メモリ管理、オブジェクトの使っているリソースの管理およびライフタイム管理、オブジェクトの参照の追跡等が行なわれる。つまり、プログラミング言語が一般的に使うメモリリソースは、基本的にすべてCommon Language Runtimeによって管理され、「ガベージコレクター」がリソースを統合して管理し、再利用することになる。そして、コードに関しては「Code Manager」が管理する。

 中段のレイヤーの3つあるボックスのうち、一番左側には、「IL to native code compilers」がある。「.NET」上で使われる言語は、各プログラミング言語のコンパイラによって、すべて「IL」(Intermediate Language、中間言語)に落とされて実行される。この中間言語を「ILコード」と呼び、仮想的なプロセッサのマシンコードと考えて差し支えない(Javaでいう「バイトコード」)。中間言語に落としたものを、ネイティブコンパイラがそのプラットフォームのマシンコードに変換する。これは初めて実行されるときに変換され、一度変換されたら、それ以降はネイティブコードで実行されることになる。

 中央のボックスは「Execution Support」で、実行管理を行ない実行コードの調整を行なう部分である。また、ILコードが実行される時、セキュリティのパーミッションチェックが細かく行なわれるが、そのために一番右側の「Security」システムが使われる。「Security」は、コードレベルで「stack walk」できる機構も備える。stack walkによってスタックフレーム上の関数呼び出しレベルに応じたきわめて精密なセキュリティの実行権限などもチェックできるようになっている。これらの3つのボックスの上に、前述のBase Frameworksが少し入り込んだ形でCommon Language Runtimeが構成されている。

 では、Common Language Runtimeには、どのようなメリットと特徴があるのだろうか。開発者にとって最も大きなメリットは、業務に適したプログラミング言語を選択できる点にあるだろう。

 プログラミング言語にはおのおの特性があって、業務によっては向き不向きというものがある。たとえば、科学技術計算にはFortran、システム記述にはCが使われることが多い。また、勘定系システムで30桁以上を扱える10進整数演算ライブラリを言語仕様として持っている言語はそれほど多くない。現時点でもCOBOLは、その有力なプログラミング言語の1つである。銀行の基幹システムでの計算などでは、JavaやVisual BasicやPerlでは基本的にはできない。こういった場合には、大きな桁の金額を計算するアプリケーションはCOBOLでクラスを作っておき、それ以外の部分をその他の言語で開発し、それらを組み合わせて1つのソリューションとして提供することができる。Common Language Runtimeの上では、業務に適したプログラミング言語を選択することができるのである。

 そして、多くのプログラマは、自分が最も得意としている第1プログラミング言語を持っている。もちろん複数のプログラム言語を操ることのできるスキルの高いプログラマもいるが、最も得意なプログラミング言語で仕事を進められるというのは最大のメリットだろう。つまり、自分の第1言語でプログラミングが可能であり、それに対する制約はないわけである。

 また、Common Language Runtimeの大きなメリットは、複数のプログラミング言語間で書いたソースコードを再利用できることである。たとえば、C++で書いたクラスがあった場合、それをVisual Basicのなかで継承し、さらに拡張したものを、さらにC#といった別の言語のなかに継承し、そしてCOBOLのなかでインスタンス化するといったことが可能となる。すべてのクラスは、おのおの言語ニュートラルで、すべて使えることになる。

 過去のバージョンのプログラムでも、今までどおりネイティブで動作するプログラムと、Visual Studio.NETの環境でリコンパイルして動作するプログラムの2種類がある。だから、旧来のプログラムをリコンパイルして新しい環境に移行する方法と、旧来のまま実行して、新しいオブジェクトと連携させる方法があるわけだ。

 ここでたとえば、過去のVisual Basicのバージョンのプログラムをネイティブで実行する場合は、「.NET」で追加された新しいサービスを利用することはできない。また、「.NET」のILで動くオブジェクトと、旧来のCOMやCOM+のオブジェクトが、実行時にインターフェイス呼び出しやイベント通知で連携を取ることは可能だ。この場合は、旧バージョンのプログラムとの間で、違いを吸収するプロキシ/スタブが自動的に生成される。

 しかし、これら複数のプログラミング言語をコントロールするためには、安全に実行できる必要がある。Common Language Runtimeでは、コードを実行する際に、その安全性を確保するために「Managed code」という概念が導入され、安全な実行管理がなされている。

その他、タイプ情報の管理をするための共通の型システムとして「Common Type System」が導入されている。

 「ガベージコレクター」(GC)によって効率的なメモリ管理を自動的に行ない、パフォーマンスの面も配慮されているが、インターネットでサービスを提供する場合に重要な要素となる「スケーラビリティ」の面も配慮され設計されている。また、コードの実行は複数の言語をまたいで、再利用される形になるため、堅牢で柔軟な拡張性も備えた新しいセキュリティシステムが導入された。

 そして、「.NET Framework」上で実行制御を司るCommon Language Runtimeは閉じた世界ではなく、「.NET Framework」のなかで動くサービスやアプリケーションのなかから、既存の資産を利用することができるとともに、外部からも利用することができる「相互利用可能」といった特徴も備えている。

 

カテゴリートップへ

アスキー・ビジネスセレクション

ASCII.jp ビジネスヘッドライン

ピックアップ