共通型システム(きょうつうかたしすてむ、英語: Common Type System、略称 : CTS)は、マイクロソフトが開発した.NET Framework対応のプログラミング言語で使われるデータ型の統一、もしくは統一された型のこと。整数型などの基本的なデータ型以外に、クラスやインターフェイスについても定義されている。例えば、System.Int32
は32ビット符号付き整数型、System.Int64
は64ビット符号付き整数型などと定められている。これはプラットフォーム、オペレーティングシステム (OS) によらず一意に決まっている。
.NET Frameworkに属する全ての言語は、2種類の言語仕様に則っていなければならない。1つがCTSであり、もう一つが共通言語仕様 (CLS) である。CTSとCLSによって、.NET Framework対応のプログラミング言語間で型の互換性が維持できる。CLSの一例を挙げると、クラスを定義できること、さらにクラス間の継承ができること、つまり、オブジェクト指向言語でなければならないことを定めている。
具体例
従来のプログラミング言語では、プラットフォームや言語によって、扱える型の種類や長さが異なっていた。例えば、Visual Basic 6.0の組み込み整数型であるInteger
型やLong
型のサイズはそれぞれ16ビットと32ビットであり、64ビット整数型はサポートされていなかった。VB.NETでは、Short
をSystem.Int16への組み込みエイリアス型、Integer
をSystem.Int32への組み込みエイリアス型、そしてLong
をSystem.Int64への組み込みエイリアス型として実装している。同様にC#では、short
をSystem.Int16への組み込みエイリアス型、int
をSystem.Int32への組み込みエイリアス型、そしてlong
をSystem.Int64への組み込みエイリアス型として実装している。これにより、各言語は相互参照が可能になり、例えばC#で書いたライブラリをVB.NETで参照する、あるいはその逆も可能になっている。
なぜ共通型システムが必要か
各プログラミング言語はそれぞれ独自のデータ型を組み込む傾向がある。たとえば文字列を表す型として、Visual Basicは組み込みのString
型を用意しているが、内部的にCOMのBSTR
構造体を使っている。C/C++ではchar
型の配列もしくはwchar_t
型の配列を文字列とみなす[1]。STLではstd::string
およびstd::wstring
クラスを、ATL/MFCではATL::CString
(ATL::CStringA
/ATL::CStringW
) クラスを提供する。また、C/C++ (Visual C++) のint
型はWin16環境では16ビット、Win32/Win64環境では32ビットだが、Visual BasicのInteger
型は16ビットである。これらのデータ型は、言語間での互換性がない。
.NET Frameworkの目標の1つはアプリケーション開発を容易にすることである。.NET Frameworkの前身であるCOMは、プログラミング言語の壁を超えてソフトウェアコンポーネントをバイナリレベルで共有・再利用することを可能にする技術だが、開発者にとって多くの頭痛の種をもたらした。GUIDやHRESULTの定義、早期バインディング (early binding) と遅延バインディング (late binding)、参照カウントの管理、実行環境のスレッディングモデル、そして上述の型の互換性などである。幸い、その状況から開発者を救うためにVisual BasicやATLといった開発環境やフレームワークが登場し、この複雑さを解消した。例えばVisual Basicでは、適切なGUIDを自動的に生成したり、アプリケーション内で使用されるCOMオブジェクトの参照カウントを自動的に管理したりすることができた。しかし、Visual BasicのCOMの実装には依然として不満な点が多かった[要説明]。
これを解決するために、さまざまな言語が共通して持つ型のシステムが考え出された。これが.NET Frameworkの共通型システムである。
型の種類
共通型システムは大別して2つの型をサポートする。
- 値型
- 値型はデータを直接的に保持する。値型のインスタンスはスタックに確保されるか、あるいは構造体の中に直接確保される。値型には整数や浮動小数点数といった組み込みのもの(ランタイム内で実装されているもの)、ユーザー定義のもの、そして列挙型がある。いずれもCTSでは構造体の一種として扱われる。
- 参照型
- 参照型はデータのメモリアドレスへの参照を保持する。参照型のデータはヒープに確保される。参照型には自己記述型 (self-describing types)、ポインタ型、インターフェイス型があり、自己記述型はさらに配列型、クラス型に分けられる。さらにクラス型にはユーザー定義クラス、ボックス化された値型、デリゲートがある。文字列型
System.String
はimmutableな参照型として実装されている。
脚注
- ^ C11およびC++11ではさらにchar16_tとchar32_tが定義されるが、本記事では簡単のため言及しない。
関連項目