共通型システム (CTS) とは
共通型システム(Common Type System, CTS)は、
マイクロソフトが開発した
.NET Frameworkに対応する
プログラミング言語で使用される、
データ型の統一規格です。このシステムは、
整数型のような基本的な
データ型だけでなく、クラスやインターフェイスなどのより複雑な型も定義します。例えば、`System.Int32` は32ビットの符号付き
整数型、`System.Int64` は64ビットの符号付き
整数型として、プラットフォームやOSに依存せず一意に定義されています。
.NET Frameworkにおいては、全ての言語が2つの主要な仕様に従う必要があります。それがCTSと共通言語仕様(Common Language Specification, CLS)です。これらの仕様により、
.NET Frameworkに対応する異なる
プログラミング言語間での型の互換性が確保されます。CLSの例としては、クラスの定義やクラス間の継承が挙げられます。つまり、
.NET Frameworkに対応する言語はオブジェクト指向言語である必要があるという規定があります。
共通型システムの必要性
従来のプログラミング環境では、プラットフォームや言語によって、使用できる
データ型とそのサイズが異なっていました。例えば、Visual Basic 6.0では、Integer型が16ビット、Long型が32ビットであり、64ビット
整数型はサポートされていませんでした。しかし、VB
.NETでは、`Short` が `System.Int16`、`Integer` が `System.Int32`、`Long` が `System.Int64` のエイリアスとして定義されています。同様にC#でも、`short`、`int`、`long` がそれぞれ対応する
.NET Frameworkの型へのエイリアスとして定義されており、これにより、異なる言語間で相互に参照が可能になっています。例えば、C#で作成した
ライブラリをVB
.NETから利用したり、その逆も容易に行えます。
各
プログラミング言語は、独自に
データ型を組み込む傾向があります。たとえば、
文字列型を表す場合、Visual Basicでは組み込みの `String` 型(内部的にはCOMのBSTR
構造体)を使用しますが、C/
C++では `char` 型や `wchar_t` 型の
配列を、STLでは `std::string` や `std::wstring` クラス、ATL/MFCでは `ATL::CString` クラスを使用します。さらに、C/
C++ (Visual
C++) の `int` 型は、Win16環境では16ビットですが、Win32/Win64環境では32ビットとなるなど、言語間での互換性の問題がありました。
.NET Frameworkの目標の一つは、アプリケーション開発の容易化です。その前身であるCOMは、言語の壁を超えて
ソフトウェアコンポーネントを共有・再利用できる技術でしたが、
GUIDやHRESULTの定義、早期バインディングと遅延バインディング、
参照カウントの管理、実行環境のスレッディングモデルなど、多くの課題がありました。これらの複雑さを解消するため、Visual BasicやATLといった開発環境やフレームワークが登場しました。例えば、Visual Basicでは、
GUIDの自動生成やCOMオブジェクトの
参照カウントの自動管理が可能になりました。しかし、Visual BasicのCOM実装にも改善の余地がありました。
これらの問題を解決するために、さまざまな言語が共通して利用できる型システムが必要とされ、その結果として
.NET Frameworkの共通型システムが誕生しました。
CTSの型
CTSは、主に2つの型をサポートします。
値型
値型は、データを直接保持します。値型の
インスタンスは、
スタックに確保されるか、
構造体内に直接確保されます。値型には、
整数や
浮動小数点数などの組み込み型、ユーザー定義型、列挙型があります。CTSでは、これらの型は全て
構造体として扱われます。
参照型
参照型は、データのメモリアドレスへの参照を保持します。参照型のデータは
ヒープに確保されます。参照型には、自己記述型、ポインタ型、インターフェース型があります。自己記述型は、さらに
配列型とクラス型に分類され、クラス型にはユーザー定義クラス、
ボックス化された値型、デリゲートが含まれます。また、
文字列型である `System.String` は、イミュータブル(不変)な参照型として実装されています。
まとめ
共通型システムは、
.NET Frameworkにおける開発において、言語の壁を越えた相互運用性を実現するための重要な基盤です。これにより、開発者は異なる言語で書かれたコードを組み合わせる際にも、型の不一致による問題を意識する必要がなくなり、より効率的な開発が可能になります。
関連事項
COM
共通言語ランタイム (CLR)
*
.NET Framework