利用者:Anonymouse jp/sandbox

 Microsoft C/C++ Optimizing Compiler (まいくろそふと しー/しーぷらすぷらす おぷてぃまいじんぐ こんぱいらー)とは、Microsoft社製のC言語及びC++言語そしてC++/CLI言語用のコンパイラーである。この記事ではMicrosoft C/C++ Optimizing Compilerと一体で配布されるMicrosoft Incremental Linkerについても扱う。

概要[編集]

Microsoft C/C++ Optimizing Compilerは、Microsoft社製品のVisual C++Platform SDKWindows SDKに付属するコンパイラーである[1]。単体では配布されておらず先述のSDKなどにcl.exeという実行ファイルで同梱されている。統合開発環境は有償となるがMicrosoft C/C++ Optimizing Compiler自体は無償で入手する事が出来る。

統語開発環境およびSDKとの関係[編集]

Microsoft C/C++ Optimizing Compilerは統合開発環境と強い関係があるが、統合開発環境とは独立しており異るバージョン体系を持っている。例えば同じバージョンのVisual C++でもバージョンが異る複数のMicrosoft C/C++ Optimizing Compilerを使うことができる。

Microsoft C/C++ Optimizing Compiler 12.00.8168 13.00.9466 13.10.3077 13.10.6030 13.10.6030 13.10.6030 14.00.50727.762 15.00.30729.01 16.00.30319.01 17.00.51106.1
Microsoft C/C++-Standardcompiler 13.00.9466 13.00.9466 13.10.3077
Microsoft Visual C++ 6.0 .NET .NET 2003 .NET 2003 .NET 2003 .NET 2003 2005 2008 2010 2012
Visual C++ Toolkit 2003
Visual C++ Compiler
.NET Framework SDK 1.0 1.1
Windows SDK
Platform SDK
Windows WDK
Windows DDK

使用形態[編集]

Microsoft C/C++ Optimizing Compilerは主にMicrosoft社製の統合開発環境と一体で使用されるが、前述の統合開発環境と独立しているためMicrosoft C/C++ Optimizing Compiler単体でも使用することができる。またEclipseのようにMicrosoft社以外が開発した統合開発環境でも使用できる場合がある[2]

言語[編集]

Microsoft C/C++ Optimizing Compilerは、C, C++, C++/CLIのソースコードを入力に受け付ける。C言語規格に関しては、バージョン15.00.30729.01の時点でANSI C89 (ISO C90, ISO/IEC 9899:1990) 対応[3]であり、C99には対応していない。C++言語規格に関しては、バージョン15.00.30729.01の時点でC++98 (ISO/IEC 14882:1998) 規格に対応している[4]。 バージョン16.00.30319.01では、auto、decltype、ラムダ式rvalue reference(右辺値参照)、static_assert、nullptrなど、C++11規格で追加された機能を一部規格制定に先行して実装した[5]。 バージョン17.00.51106.1では、Strongly typed enums、Forward declared enums、Standard-layout and trivial types、Range-based for-loop などのC++11規格を実装した[6]

主なコンパイラーの拡張[編集]

インラインアセンブラー
_asmや__asmキーワードによる記述。C++の標準規格で定められているasm文には対応していない。x64/IA64では使用できず、別途アセンブラーで記述するか組込関数で代替する。
コンパイラーCOM対応
#importディレクティブ及び追加のクラス・関数など。
属性
マイクロソフトインターフェイス定義言語MIDLの属性を直接C++ソースコードに記述する機能。なお、マネージ拡張C++、C++/CLI、およびC++/CXの属性も同様の構文を使用する。
マネージ拡張
.NET Frameworkを使用するための拡張。マネージ拡張C++を参照。
OpenMP
バージョン14.00.50727.762からOpen MP 2.0に対応している[7]
ネイティブC++でのC++/CLI構文の使用
for each[8]及びoverride, abstract, sealed[9]。このうち、overrideはC++11のoverrideと同様の構文である。また、sealedはC++11のfinalキーワードに相当する(sealed自体はさらにもとを辿ればマイクロソフト製のプログラム言語C#からの由来である)。バージョン17.00.51106.1では、sealed、finalのうちどちらでも使うことができるが、標準C++クラスにはfinalを、C++/CXのrefクラス(Windowsランタイムクラス)にはsealedを使うことが推奨されている[1]
Type Traits対応
__is_podキーワードなど[10]
その他
__declspec、呼出規約の指定、プロパティ構文(__declspec(property))、構造化例外処理、#pragmaディレクティブ、SAL注釈[11]など。

マネージ拡張C++[編集]

マネージ拡張C++ (Managed Extensions for C++マネージドC++Managed C++) は.NET Frameworkに対応したアプリケーションを作成するため、C++を共通言語仕様CLSに準拠させるために独自の拡張を施したものであり、バージョン13.00.9466以降に搭載されている。これに対し従来のC++をマネージドC++と区別する際にはアンマネージドC++あるいはネイティブC++と呼ぶ。1つのアプリケーション内にマネージドC++とアンマネージドC++のコードを混在させることも可能であり、従来のC++で書かれたコードを徐々に.NETへ移行したり、あるいは他の.NET言語からC++で作られたライブラリーを使用したり、C++コードから.NET Frameworkのクラスライブラリーを活用するなどといったことを可能にしている。

C++/CLI[編集]

C++/CLIは(文法に不明瞭な部分のあった)マネージ拡張C++に代わる、CLSを満たすC++を基にしたプログラミング言語であり、バージョン14.00.50727.762から搭載されている。ただしバージョン14.00.50727.762では(非推奨ではあるが)互換性維持のため従来のマネージ拡張C++のソースコードもコンパイルオプション「/clr:oldSyntax」を指定することでコンパイルできる[2]。なおC++/CLI環境では、従来のC++はアンマネージドではなくネイティブと形容される。

C++/CX[編集]

C++/CX (component extensions) は、Windowsストアアプリで使用されるWinRTランタイムライブラリーを利用するために、C++11規格をベースとして拡張されたプログラミング言語であり、バージョン17.00.51106.1に搭載されている。なお、言語構文は前述のC++/CLIとよく似ているが、C++/CXはC++/CLIとは違ってマネージ言語ではなく、ネイティブ拡張であるため、従来のネイティブC/C++用コードやCRTライブラリーはほぼそのまま利用できるが、.NET Frameworkを直接扱うことはできない。また、C++/CLIとは同一ソースコード内に共存できない。

  1. ^ https://docs.microsoft.com/ja-jp/cpp/how-to-report-a-problem-with-the-visual-cpp-toolset
  2. ^ https://www.ibm.com/developerworks/library/os-ecl-vscdt/
  3. ^ ANSI Conformance
  4. ^ 標準 C++ プログラムの作成 (C++)”. MSDN ライブラリー. マイクロソフト (2007年11月). 2009年12月1日閲覧。
  5. ^ Visual C++ 2010 の新機能
  6. ^ C++11 Features in Visual C++ 11
  7. ^ Visual C++ の OpenMP
  8. ^ How to: Iterate Over STL Collection with for each
  9. ^ How to: Declare Override Specifiers in Native Compilations
  10. ^ Compiler Support for Type Traits
  11. ^ SAL注釈