GNU ProjectがGCC 5.1のリリースを発表した。GCC 5最初のメジャーリリースとなる今回のリリースには,C++11/14サポートの改善,新しいlibstdc++ ABI,マシンコードJIT組込みライブラリなど,数多くの新機能と改良が含まれている。
GCC 5.1で導入された最も重要な変更点は,次のようなものだ。
-
Cコンパイラのデフォルトが,最古のANSI承認C標準である
gnu89
からgnu11
に変更された。 -
C++ランタイムに新しいABIが導入され,デフォルトで有効になった。これによって既存のクラスが,C++11準拠の
std::string
やstd::list
といったクラスに置き換えられた。コード全体を再ビルドする開発者には影響ないが,旧ABIを使用したサードパーティライブラリを利用する開発者は,-D_GLIBXX_USE_XCC11_ABI=0
を指定する必要がある。新しいlibstdc++はデュアルAPIを提供する。これにより,古いバージョンのGCCでビルドされたコードも,最新のlibstdc++
で動作可能になる。ライブラリやプラグインのプロバイダもこれと同じデュアルABIコンセプトを選択可能なため,開発者によるソフトウェア再ビルドを防止することができる。 -
C++11およびC++14サポートの改善:
linstdc++
にC++11の完全なサポートと,C++14の試験的サポートが追加された。さらにG++でも,可変テンプレートや非静的データメンバの初期化子,サイズ指定のアロケーション解放といった,C++14の多くの機能をサポートしている。 -
オプションとして,Go 1.4.2の完全な実装が提供されている。
-
GCC 5は共有ライブラリとしてビルドすることができる。これは
libgccjit
と呼ばれ,マシンコードへのJITコンパイラとして組み込むためのものだ。このオプションは現在は実験段階とされているため,“まだ実務で使用するべきではない”が,カスタム言語用のマシンコードコンパイラをPythonで構築するなど,さまざまな興味深い用途に使えそうだ。GCCランタイムライブラリに適用されるライセンス例外がlibgccjit
にも同じように適用されるのかどうか,GCC 5.1の公式ディストリビューションからは明らかになっていない。ランタイムライブラリ例外は,GCCライブラリとリンクされたプログラムをGCCのライセンスであるGPL 3下でリリースするという必要なく,製造および配布可能にするためのものだ。 -
最後に,GCC 5.1では,同じ内容の関数を新しいIdentical Code Folding(ICF)に統合する,書き込みのみの変数を検出して最適化で削除する,メモリ使用量とリンク時間を短縮するなど,数多くの最適化処理が追加されている。変更点に関するより詳細な情報は,別途定義されている。
GCCの主要な競合相手はLLVMで,現在のバージョンは3.6である。GCC 5のプレリリースバージョンとLLVM 3.5を比較するため,Phoronixが一連のベンチマークを実行した結果,GCCがパフォーマンスで勝っていたC-Rayマルチスレッドレイトレースなど一部の例外を除けば,どちらもほぼ互角であることが分かった。その一方で,コンパイル時間に関しては,LLVMのClangがGCCを上回っていた。2つのコンパイラの最大の相違点は,しかしながら,間違いなくそのライセンスモデルにあるだろう。GCCがGPL3下でライセンスされるのに対して,LLVMにはそれよりもMIT/BSD的なライセンスが適用される。