GCC
読み:ジースィースィー
外語:GCC: GNU Compiler Collection
GNU
の
コンパイラー
コレクション。実行ファイル名は小文字でgccである。
目次
情報
概要
特徴
性能
構造
独自機能
ビルトイン関数
補足
功績
沿革
GCC離れ
GPL
GCC排除
そしてオワコン化
GPLv3化前後
clang/LLVM
劣勢なGCC
版の特徴
GCC 5
GCC 4.9
GCC 4.8
GCC 4.7
GCC 4.6
GCC 4.5
GCC 4.4
GCC 4.3
GCC 4.2
GCC 4.1
GCC 4.0
GCC 3
GCC 2
情報
使用途 ‐ コンパイラー
初出年 ‐ 1999(平成11)年4月(公式)、1987(昭和62)年3月22日(ベータリリース)
設計者 ‐ ?
開発者 ‐
フリーソフトウェア財団
(FSF)
最新版 ‐ GCC 5.2 (2015(平成27)年7月16日)
影響関係
被影響 ‐ cc、Microsoft C/C++
加影響 ‐
DJGPP
、Microsoft C/C++、
clang/LLVM
主要動作環境 ‐ クロスプラットフォーム
ライセンス
‐
GPLv3
(4.2.2以降)
概要
C
だけでなく早い時期から
C++
にも対応していたが、次のような
プログラミング言語
に対応している。
C
C++
Objective-C
Objective-C++
Java
Go
FORTRAN
Ada
もともとGCCは「GNU C Compiler」の略であったが、1999(平成11)年4月、GCCから分岐したプロジェクトEGCSを運営するGCC Steering CommitteeがFSFより正式にGCCのメンテナンスを引き継いだ際、既にC以外の言語のコンパイルが可能ということから、GNU Compiler Collectionの略称に改めた。
特徴
性能
多機能、高性能なソフトウェアで、多くの
UNIX
で使用されている。
様々なアーキテクチャーにも対応している。
Sun Microsystems
の
Solaris
などのように標準で
Cコンパイラー
などの開発環境が付いてこない
オペレーティングシステム
では、コンパイラーを含めた開発環境をGNUシリーズで揃えてしまう人も珍しくない。
最適化の性能も、
clang/LLVM
が登場するまではフリーソフトウェアの中では優秀な方だった。
構造
一般的なコンパイラーと同様、「フロントエンド」と「バックエンド」で構成され、更にバックエンドは「コードジェネレーター(コード生成部)」と「オプティマイザー(最適化部)」に分かれている。
フロントエンドで、
プログラミング言語
の
字句解析
や構文解析を行なう。これが、対応言語ごとに用意されることになる。
バックエンドは全言語共通で、環境(CPUやOSなど)に応じたバイナリを作ることになる。
そして、フロントエンドとバックエンドとのやりとりに、RTL(Register Transfer Language)と呼ばれる
中間言語
を使用する。
独自機能
GCCは、CやC++に限ってみても、言語の標準仕様に対して独自の新機能を多数搭載している。この機能が、後に標準仕様に取り込まれることもある。
以下は、代表的な独自機能の例(順不同)。
__alignof__
__attribute__
関数属性構文/変数属性構文
transparent_union
境界整列
代替キーワード
asm
キーワードがCでも利用可能
アセンブラーラベル
C++のコメントがCでも利用可能 (→
C99
で採用)
case
の範囲
共用体
のキャスト
文字エスケープシーケンス
複合リテラル
オペランドを省略した条件付きステートメント
指定済みのイニシャライザー
識別子内のドル記号
関数名が得られる事前定義済みマクロ
__FUNCTION__
/
__PRETTY_FUNCTION__
旧スタイル関数のプロトタイプ宣言
16進浮動小数点数 (→C99で採用)
不完全なenum型とforward宣言
自動変数の集合イニシャライザー要素
組み込み関数 (__builtin_*)
インライン関数
と
inline
関数修飾子
値としてのラベル、ローカルラベルと__label__
long long
(→C99で採用)
拡張左辺値
voidポインター
と
関数ポインター
に対するポインター算術演算
復帰アドレスとフレームアドレス __builtin_frame_address/__builtin_return_address
ステートメント式
構造体への添字の付加
型属性 aligned/packed/transparent_union
typeof演算子
匿名構造体と匿名共用体がCでも利用可能
変数属性 aligned/deprecated/packed/section/zero_init/transparent_union/unused/weak
可変個引数マクロ
長さがゼロの
配列
ビルトイン関数
GCCには様々なビルトイン関数が用意されており、殆どは __builtin_ から始まる関数名となっている。
これらは、GCCの利便性の向上やC/C++の要求仕様を実装するためのもの、あるいはGCCへの依存性を高めGCCへの囲い込みを強めることを意図したものと考えることができる。なお、これら関数は当然、次世代コンパイラー
clang/LLVM
でも実装されたため、clang/LLVMへの移行には支障がない。
関数の一覧は、「
Other Built-in Functions Provided by GCC
」に記載がある(以下、順不同)。
汎用または内部用
int __builtin_types_compatible_p (type1, type2)
type __builtin_call_with_static_chain (call_exp, pointer_exp)
type __builtin_choose_expr (const_exp, exp1, exp2) 三項演算子と同等の機能をもつ関数
type __builtin_complex (real, imag) ISO C11のマクロ、CMPLXF、CMPLX、CMPLXLの実装用
int __builtin_constant_p (exp)
long __builtin_expect (long exp, long c)
void __builtin_trap (void)
void __builtin_unreachable (void)
void *__builtin_assume_aligned (const void *exp, size_t align, ...)
プリプロセッサー相当機能
int __builtin_LINE () プリプロセッサーの
__LINE__
マクロに相当
const char * __builtin_FUNCTION () プリプロセッサーの
__FUNCTION__
マクロに相当
const char * __builtin_FILE () プリプロセッサーの
__FILE__
マクロに相当
キャッシュ制御等
void __builtin___clear_cache (char *begin, char *end)
void __builtin_prefetch (const void *addr, ...)
数学関数
double __builtin_huge_val (void) ISO Cマクロ HUGE_VAL 実装用
float __builtin_huge_valf (void)
long double __builtin_huge_vall (void)
int __builtin_fpclassify (int, int, int, int, int, ...) C99 fpclassify機能実装用
double __builtin_inf (void)
_Decimal32 __builtin_infd32 (void)
_Decimal64 __builtin_infd64 (void)
_Decimal128 __builtin_infd128 (void)
float __builtin_inff (void)
long double __builtin_infl (void)
int __builtin_isinf_sign (...)
double __builtin_nan (const char *str) C99 nan機能実装用
_Decimal32 __builtin_nand32 (const char *str)
_Decimal64 __builtin_nand64 (const char *str)
_Decimal128 __builtin_nand128 (const char *str)
float __builtin_nanf (const char *str)
long double __builtin_nanl (const char *str)
double __builtin_nans (const char *str)
float __builtin_nansf (const char *str)
long double __builtin_nansl (const char *str)
ビット演算(int用)
int __builtin_ffs (int x) xを2進数にしたとき最初に1となるビット位置を返す。つまり、__builtin_ffs(x) = 1 + __builtin_ctz(x) が成り立つ
int __builtin_clz (unsigned int x) xを2進数にしたときの頭の0の数を返す
int __builtin_ctz (unsigned int x) xを2進数にしたときの末尾の0の数を返す
int __builtin_clrsb (int x) xを2進数にしたときの頭の最上位ビットと同じビットの数を返す
int __builtin_popcount (unsigned int x) xを2進数にしたとき、ビットが1となるビットの数を返す
int __builtin_parity (unsigned int x) xのパリティを返す。つまり、__builtin_parity(x) = __builtin_popcount(x) % 2 が成り立つ
ビット演算(long用)
int __builtin_ffsl (long)
int __builtin_clzl (unsigned long)
int __builtin_ctzl (unsigned long)
int __builtin_clrsbl (long)
int __builtin_popcountl (unsigned long)
int __builtin_parityl (unsigned long)
ビット演算(long long用)
int __builtin_ffsll (long long)
int __builtin_clzll (unsigned long long)
int __builtin_ctzll (unsigned long long)
int __builtin_clrsbll (long long)
int __builtin_popcountll (unsigned long long)
int __builtin_parityll (unsigned long long)
累乗
double __builtin_powi (double, int) 累乗を得る。pow関数とは異なり、精度と丸めについての保証がない
float __builtin_powif (float, int)
long double __builtin_powil (long double, int)
バイト順の変更
uint16_t __builtin_bswap16 (uint16_t x)
uint32_t __builtin_bswap32 (uint32_t x)
uint64_t __builtin_bswap64 (uint64_t x)
補足
功績
フリーの
PC UNIX
が現存するのも、GCCあってこそである。
FreeBSD
などのBSDや、
Linux
などは、古くからGCCに依存して成長してきた。
また、様々な環境用のバイナリが出力できるため、
クロス開発
で使われることも多い。
沿革
Richard StallmanがGCC開発に着手したのは1985(昭和60)年である。当初はPastelと呼ばれるPascalの拡張言語で書かれ、これが後にCで書き直された。GNUのコンパイラーとして始めて公開されたのは1987(昭和62)年である。
GCC 2.xから
バザール形式
での開発が始まり改良と拡張が続き、1994(平成6)年にリリースされた
4.4BSD
でも標準のコンパイラーとして採用された(
4.3BSD
まではPortable C Compiler)。
1999(平成11)年4月に、正式にGCC Steering CommitteeにGCCのメンテナンスが引き継がれた。これ以降、この委員会が開発していた拡張版GCCのEGCSがGCCと呼ばれるようになっている。
現在GCCは、GCC Steering Committeeの指導の下で、様々なプログラマーグループによって維持されている。
そんなGCCも、大規模化しCで記述されたもののメンテナンスも大変になったらしく、遂にC++で書き換えるcxx-conversionブランチができ、2012(平成24)年に無事にC++への書き換えに成功したという。いずれ正式バージョンもC++化されたものとなるのだろう。
GCC離れ
GPL
GCCは
GPL
で
ライセンス
されているが、これが唯一にして最大の問題点である。商用開発で触れるには危険なライセンスだからである。
GCC 4.2.2以降は、
GPLv3
にライセンスが変更されたため、更に問題は悪化した。
GPLv3以降、特に企業を中心に、GPL系フリーソフトウェアへの協力者が大幅に減ることになる。
GCC排除
BSDではGPL排除に熱心な活動が続けられており、
GPL汚染
を避けるための
防疫処置
も行なわれている。
特にGPL排除に熱心な
OpenBSD
では、
4.3BSD
時代にも使われた
BSDライセンス
のPortable C Compiler(PCC)の改良版に関心を寄せている。
FreeBSD
はGPLv2でライセンスされた最終版GCC 4.2.1を長く使用している。
アプライアンス
用途への採用も多いFreeBSDはGPLv3ツールの同梱に難色を示しており、デフォルトコンパイラーをGCCからBSDライセンスとほぼ同じ
clang/LLVM
へ置き換える作業を進めた。
LLVM
では、GCC4から作られたフロントエンドllvm-gccも使うことができたが、あまり人気はなく、今ではサポートされていない。
そしてオワコン化
GPLv3化前後
長くGCCの敵はなかった。GCCは必要十分かつ強力なコンパイラーだったためである。
そんなGCC開発者は
C/C++
に飽きたらしく、
Java
がオワコンというのは世界の共通認識と一致するものの、次の力の入れ先がなぜか「
Go
」だった。
さて、Appleは
Objective-C
を愛用しているが、GCCはこれに力を余り注がず、その上あろう事か
GPLv3
にライセンスを変更したためAppleは激怒、遂に本気を出して新しいC/C++コンパイラーを作り出してしまった。
clang/LLVM
本気のAppleが実用化させた、GCCにとっての最強の敵は
clang/LLVM
だった。しかもこれはGPLではなく、
BSDライセンス
相当のソフトウェアである。
本気になったAppleからの資金や技術者の投入は生半可ではなく、登場から10年以上の歴史を持つGCCを僅か数年で凌駕し、あっという間に性能で追い抜いてしまった。Appleは「GCCは
オワコン
」と述べており、Appleの
統合開発環境
(IDE)であるXcodeも、4以降はllvmがデフォルトになり、gccはllvm-gccのシンボリックリンクに置き換わり、後のバージョンではgccは綺麗に削除された。
GCCは、ある日突然出てきたコンパイラーに、あっけなく負けたのである。
劣勢なGCC
GCCは、毎年3月から5月頃に新バージョンを公開している。
2014(平成26)年4月22日にGCC 4.9が公開され、
C++14
のドラフト(n3797)に対応した。
しかしAppleによる
clang
はGCCに先んじ、2013(平成25)年12月に公開(
clang/LLVM
としては2014(平成26)年1月に公開)されたclang 3.4で
C++14
のドラフト(n3797)完全対応を達成している。clang/LLVMの開発力はGCCを上回っており、GCCを過去の遺物だとするAppleの言い分は決して驕りや荒唐無稽な主張でないことが分かる。
このようにしてclangも完成度が高まったことから、
FreeBSD
は、FreeBSD 10.0からはGCCを削除して
clang/LLVM
に移行、
脱GPL
を達成した。FreeBSD派生の
DragonFly BSD
もDragonFly BSD 3.8からclang/LLVMに移行した。また、OpenBSDも近い将来にclang/LLVMに移行する計画である。
NetBSDはまだ定かではないが、clang/LLVMでのビルドは可能なようになっている。
版の特徴
ここ近年は、ほぼ1年おき、3月から5月頃に新しいバージョンを公開している。
GCC 5
メジャーバージョンアップ。5系最初の版は5.1である。この頃にはclang/LLVMとの性能差は歴然となっている。
C++14に完全対応
MIPS Release 6 アーキテクチャ対応
OpenMP 4.0 オフローディング対応
Intel Skylake Server AVX-512 拡張対応
VISIUMcore対応
このバージョンから、デフォルトのCバージョンが-std=gnu89(C89ベース)から-std=gnu11(C11ベース)に変更された。
5.2 (2015(平成27)年7月16日)
5.1 (2015(平成27)年4月22日)
GCC 4.9
2014(平成26)年4月22日にリリースされたバージョン。
C/C++で、色付きのエラー表示に対応
ISO C11対応強化
アトミック変数
(_Atomic と <stdatomic.h> ヘッダー) 対応
型ジェネリック式 (_Generic キーワード) 対応
スレッドローカルストレージ (
_Thread_local
キーワード) 対応
__auto_type 対応
ISO C++14対応
decltype(auto)
ラムダキャプチャ初期化子に対応
可変長配列に対応
deprecated アトリビュート
数値のセパレーター ' に対応
ポリモーフィックラムダ式
Go 1.2.1対応
clang/LLVMより遅れたが、C++14に対応した。
4.9.3 (2015(平成27)年6月26日)
4.9.2 (2014(平成26)年10月30日)
4.9.1 (2014(平成26)年7月16日)
4.9.0 (2014(平成26)年4月22日)
GCC 4.8
2013(平成25)年3月22日にリリースされたバージョン。
ISO C++11対応強化、ISO C++14の幾つかの機能に対応開始、Go 1.1.2完全対応 (GCC 4.8.2)などを特徴とする。
4.8.5 (2015(平成27)年6月23日)
4.8.4 (2014(平成26)年12月19日)
4.8.3 (2014(平成26)年5月22日)
4.8.2 (2013(平成25)年10月16日)
4.8.1 (2013(平成25)年5月31日)
4.8.0 (2013(平成25)年3月22日)
GCC 4.7
2012(平成24)年3月22日にリリースされたバージョン。
リンク時の最適化(Link-time optimization、LTO)の改善
C++11の対応強化
std::atomicクラスを完全実装
委譲コンストラクター
エイリアス宣言
ユーザー定義直定数
このバージョンから、ナショナルセミコンダクターのCR16や、TIのC6Xなどのプロセッサーへの対応が開始された。
4.7.4 (2014(平成26)年6月12日)
4.7.3 (2013(平成25)年4月11日)
4.7.2 (2012(平成24)年9月20日)
4.7.1 (2012(平成24)年6月14日)
4.7.0 (2012(平成24)年3月22日)
GCC 4.6
2011(平成23)年3月25日にリリースされたバージョン。
GCC 4.6.0では、次に挙げるようなObjective-C 2.0の新機能に対応した。
プロパティの宣言と合成
ドット構文
高速列挙
オプションのプロトコルメソッド
メソッド/プロトコル/クラスの属性
クラスの拡張
新たなGNU Objective-CランタイムAPI
このほか、Go言語への対応や、__float128データ型への対応なども行なわれている。
4.6.4 (2013(平成25)年4月12日)
4.6.3 (2012(平成24)年3月1日)
4.6.2 (2011(平成23)年10月26日)
4.6.1 (2011(平成23)年6月27日)
4.6.0 (2011(平成23)年3月25日)
GCC 4.5
生成コードのパフォーマンス改善に焦点を当てて開発されたとしているバージョン。
このリリースからビルドに、従来のGNU GMPライブラリ、GNU MPFRライブラリに加えて、GNU MPCライブラリが必要となった。
4.5.4 (2012(平成24)年7月2日)
4.5.3 (2011(平成23)年4月28日)
4.5.2 (2010(平成22)年12月16日)
4.5.1 (2010(平成22)年7月31日)
4.5.0 (2010(平成22)年4月14日)
GCC 4.4
graphiteブランチで開発されてきた最適化機構が正式に取り込まれた。for文やwhile文の繰り返し箇所で、ループ順を入れ替えるなどで高速化する。
GCC 4.2対応したOpenMPは、GCC 4.4でOpenMP 3.0対応となった。
4.4.7 (2012(平成24)年3月13日)
4.4.6 (2011(平成23)年4月16日)
4.4.5 (2010(平成22)年10月1日)
4.4.4 (2010(平成22)年4月29日)
4.4.3 (2010(平成22)年1月21日)
4.4.2 (2009(平成21)年10月15日)
4.4.1 (2009(平成21)年7月22日)
4.4.0 (2009(平成21)年4月21日)
GCC 4.3
Intel Core 2やAMD Geodeプロセッサーへの対応を強化したバージョン。
このバージョンから
SSE4
(SSE4.1、SSE4.2)に対応した。
4.3.5 (2011(平成23)年6月27日)
4.3.5 (2010(平成22)年5月22日)
4.3.4 (2009(平成21)年8月4日)
4.3.3 (2009(平成21)年1月24日)
4.3.2 (2008(平成20)年8月27日)
4.3.1 (2008(平成20)年6月6日)
4.3.0 (2008(平成20)年3月5日)
GCC 4.2
OpenMP(gomp)への対応を最大の特徴とするバージョン。
マルチコア
化が進む昨今のプロセッサーへの対応として、
pthread
と共に普及する機能とみられる。
GCC 4.2.1まではGPLv2だが、GCC 4.2.2以降は
GPLv3
となり、企業での採用が嫌忌された結果、FreeBSDほかでも不採用となった。
4.2.4 (2008(平成20)年5月19日)
4.2.3 (2008(平成20)年2月1日)
4.2.2 (2007(平成19)年10月7日) ↑ここからがGPLv3
4.2.1 (2007(平成19)年7月18日) ↓ここまでがGPLv2
4.2.0 (2007(平成19)年5月13日)
GCC 4.1
Fortran 95の対応強化を最大の特徴とするバージョンであるらしい。
4.1.2 (2007(平成19)年2月13日)
4.1.1 (2006(平成18)年5月24日)
4.1.0 (2006(平成18)年2月28日)
GCC 4.0
メジャーバージョンアップとなり、バージョン4となった。
このバージョンから、最適化フレームワークTREE-SSAが導入された。
4.0.4 (2007(平成19)年1月31日)
4.0.3 (2006(平成18)年3月10日)
4.0.2 (2005(平成17)年9月28日)
4.0.1 (2005(平成17)年7月7日)
4.0.0 (2005(平成17)年4月20日)
GCC 3
バージョンのみ記載
3.4
3.4.6
3.4.5
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3
3.3.6
3.3.5
3.3.4
3.3.3
3.3.2
3.3.1
3.3
3.2
3.2.3
3.2.2
3.2.1
3.2
3.1
3.1.1
3.1
3.0
3.0.4
3.0.3
3.0.2
3.0.1
3.0
GCC 2
バージョンのみ記載
2.95
2.95.3
2.95.2
2.95.1
2.95
現在GNUのファイルサーバーから入手できる最古のGCCが2.95である。
再検索