WisdomSoft - for your serial experiences.

C++/CLIとは?

C++/CLI の概要です。C++/CLI と .NET Framework 及び国際標準規格との関係について説明します。

Visual C++ と .NET Framework

本稿は、Visual C++ を対象とし、Visual C++ に特化した技術解説を行います。Visual C++ 6.0 以前では、標準の C++ 言語を使ってネイティブアプリケーションを開発するために使われていましたが、Visual Studio .NET の登場以来、.NET Framework アプリケーションの開発言語としても C++ を使えるようになりました。

.NET Framework は Microsoft が設計した共通中間言語 (Common Intermediate Language/CIL) と呼ばれる中間言語を実行する仮想マシン環境(ランタイム)のことで、ネイティブシステムを抽象化するシステムとして動作します。Microsoft は .NET Framework を Windows などの自社システム向けにしか提供していませんが、オープンソースで .NET Framework 互換環境を開発する動きもあり、中でも Mono と呼ばれるプロジェクトが大きな成果を出しています。

.NET Framework アプリケーションを開発するためには、中間言語を保持する .NET Framework 専用の実行ファイルを生成しなければなりません。これには、従来の C++ コンパイラは使えず、Microsoft .NET Framework SDK でコンパイルしなければなりません。

.NET Framework はネイティブ環境とは異なり、使われなくなったメモリを自動的に解放するガベージコレクションを採用しています。これに伴って、.NET Framework アプリケーション専用に C++ 言語も独自の拡張が行われました。この .NET Framework に特化した C++ 拡張を Managed C++ または C++ マネージ拡張と呼びます。

Managed C++ は、Microsoft Visual Studio .NET で実装され、.NET 用の開発言語として使われましたが、従来の C++ に Microsoft 固有のキーワードを付け足した形のプログラミング言語だったため、非標準言語という雰囲気が強く、オープンな標準言語を好む多くのプログラマは敬遠していました。また、.NET Framework のために追加された Microsoft 固有の構文で使われるキーワードは、2 つのアンダーライン __ から始まる冗長なキーワードが使われているのも大きな問題です。C# 言語のような .NET Framework のために最適化されて作られた言語に比べて、記述するコード量が多く、可読性も低くなります。

そこで、Visual Studio 2005 から Managed C++ に代わって、標準 C++ 言語を発展させた C++/CLI が登場しました。CLI とは、Common Language Infrastructure のことで、C++/CLI を用いて開発したアプリケーションを実行するための基礎的な環境を意味します。C++/CLI は Microsoft .NET Framework とは分離され、国際規格 ISO/IEC 23271 で動作するものと定められています。よって、CLI が実装されている環境であれば、Windows 以外の環境でも C++/CLI 言語を使ってプログラムすることが可能とされています。筆者の知る限り本稿執筆時点では、事実上は Microsoft .NET Framework 以外は存在していません。

C++/CLI の視点で考えた場合、Microsoft .NET Framework は CLI の実装となります。.NET Framework は Microsoft .NET の実装でもあり、CLI の実装でもあるのです。.NET Framework の開発者にとっては C++/CLI は .NET Framework 開発のための言語の 1 つという認識でも間違いなく、CLI を意識する必要はありませんが、正確な認識としては C++/CLI がターゲットとする実行環境は .NET Framework ではなく CLI なのです。

C++/CLI を使えば、Windows アプリケーション開発で主流である .NET Framework に、C++ 言語で記述された過去の資産を再利用しながら対応することができます。当然、C++ 言語の知識も再利用することができるので、C++ プログラマにとっては最初から新しいプログラミング言語を再学習する必要がなくなります。