2013-10-28

主要なC++コンパイラーのC++14サポート状況

ふと、C++14のコア言語の、主要なC++コンパイラーによるサポート具合はどうだろうかということに思い立った。主要なC++コンパイラーは、現在のところ、二つしかない。GCCとClangだ。最近、私は以前ほど頻繁にコンパイラーを自前ビルドしていない。C++11の実装は、だいぶこなれてきたからだ。では、C++14はどうか。

まずGCCからみてみよう。以下のページで、対応状況をまとめている。

C++1y/C++14 Support in GCC - GNU Project - Free Software Foundation (FSF)

もちろん、まだ規格がドラフト段階というのもあるし、実装が完全ではないというのもあるが、GCCのC++14機能は、-std=c++1yというオプションを指定することで、有効にできる。

わかりやすい新機能で言うと、二進数リテラル、戻り値の型推定、実行時サイズ配列、汎用ラムダキャプチャーが、4.9で、現在提案されている論文の文面通りに実装しているそうだ。もちろん、まだ正式な規格ではないので、規格の方が変わる可能性がある。

また、ジェネリックラムダ式と、変数テンプレートについては、もっか実装中だそうだ。その他については、まだ実装も始まっていないようだ。

Clangはどうか。以下のページで、対応状況をまとめている。

Clang - C++98, C++11, and C++14 Status

なんと、ほとんどの機能は、レポジトリ入りしているという。まだ完全に実装し終えていないコア言語は、ジェネリックラムダ式とsized deallocation(解放関数にストレージのサイズを渡す引数のついたオーバーロードを追加するもの)だけだそうだ。

Clangの方も、この、ドラフトに基づいた実験的な実装の新機能を使うには、-std=c++1yを指定する必要がある。

それにしても、最近、GCCはClangの後追いをしている印象がある。C++14の機能のサポートもClangに後れを取っているし、その他の有用な機能、例えば、未定義動作を実行時に検出する、Undefined Behavior Sanitizerも、Clangの実装を受けて、ClangでUBSを実装した人間がGCCでも再実装した。

Clangも自由なソフトウェアではあるのだが、やはり独裁は好ましくないし、思想の違いからも、GCCには頑張って欲しい。

以上、コンパイラー実装の知識が一切ない者の感想だ。

No comments: