GCC
読み:ジースィースィー
外語:GCC: GNU Compiler Collection

 GNUコンパイラーコレクション。実行ファイル名は小文字でgccである。
目次

情報

概要
 Cだけでなく早い時期からC++にも対応していたが、次のようなプログラミング言語に対応している。
 もともとGCCは「GNU C Compiler」の略であったが、1999(平成11)年4月、GCCから分岐したプロジェクトEGCSを運営するGCC Steering CommitteeがFSFより正式にGCCのメンテナンスを引き継いだ際、既にC以外の言語のコンパイルが可能ということから、GNU Compiler Collectionの略称に改めた。

特徴

性能
 多機能、高性能なソフトウェアで、多くのUNIXで使用されている。
 様々なアーキテクチャーにも対応している。
 Sun MicrosystemsSolarisなどのように標準でCコンパイラーなどの開発環境が付いてこないオペレーティングシステムでは、コンパイラーを含めた開発環境をGNUシリーズで揃えてしまう人も珍しくない。
 最適化の性能も、clang/LLVMが登場するまではフリーソフトウェアの中では優秀な方だった。

構造
 一般的なコンパイラーと同様、「フロントエンド」と「バックエンド」で構成され、更にバックエンドは「コードジェネレーター(コード生成部)」と「オプティマイザー(最適化部)」に分かれている。
 フロントエンドで、プログラミング言語字句解析や構文解析を行なう。これが、対応言語ごとに用意されることになる。
 バックエンドは全言語共通で、環境(CPUやOSなど)に応じたバイナリを作ることになる。
 そして、フロントエンドとバックエンドとのやりとりに、RTL(Register Transfer Language)と呼ばれる中間言語を使用する。

独自機能
 GCCは、CやC++に限ってみても、言語の標準仕様に対して独自の新機能を多数搭載している。この機能が、後に標準仕様に取り込まれることもある。
 以下は、代表的な独自機能の例(順不同)。

ビルトイン関数
 GCCには様々なビルトイン関数が用意されており、殆どは __builtin_ から始まる関数名となっている。
 これらは、GCCの利便性の向上やC/C++の要求仕様を実装するためのもの、あるいはGCCへの依存性を高めGCCへの囲い込みを強めることを意図したものと考えることができる。なお、これら関数は当然、次世代コンパイラーclang/LLVMでも実装されたため、clang/LLVMへの移行には支障がない。
 関数の一覧は、「Other Built-in Functions Provided by GCC」に記載がある(以下、順不同)。

補足

功績
 フリーの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バージョンが-std=gnu89(C89ベース)から-std=gnu11(C11ベース)に変更された。

GCC 4.9
 2014(平成26)年4月22日にリリースされたバージョン。
 clang/LLVMより遅れたが、C++14に対応した。

GCC 4.8
 2013(平成25)年3月22日にリリースされたバージョン。
 ISO C++11対応強化、ISO C++14の幾つかの機能に対応開始、Go 1.1.2完全対応 (GCC 4.8.2)などを特徴とする。

GCC 4.7
 2012(平成24)年3月22日にリリースされたバージョン。
 このバージョンから、ナショナルセミコンダクターのCR16や、TIのC6Xなどのプロセッサーへの対応が開始された。

GCC 4.6
 2011(平成23)年3月25日にリリースされたバージョン。
 GCC 4.6.0では、次に挙げるようなObjective-C 2.0の新機能に対応した。
 このほか、Go言語への対応や、__float128データ型への対応なども行なわれている。

GCC 4.5
 生成コードのパフォーマンス改善に焦点を当てて開発されたとしているバージョン。
 このリリースからビルドに、従来のGNU GMPライブラリ、GNU MPFRライブラリに加えて、GNU MPCライブラリが必要となった。

GCC 4.4
 graphiteブランチで開発されてきた最適化機構が正式に取り込まれた。for文やwhile文の繰り返し箇所で、ループ順を入れ替えるなどで高速化する。
 GCC 4.2対応したOpenMPは、GCC 4.4でOpenMP 3.0対応となった。

GCC 4.3
 Intel Core 2やAMD Geodeプロセッサーへの対応を強化したバージョン。
 このバージョンからSSE4(SSE4.1、SSE4.2)に対応した。

GCC 4.2
 OpenMP(gomp)への対応を最大の特徴とするバージョン。マルチコア化が進む昨今のプロセッサーへの対応として、pthreadと共に普及する機能とみられる。
 GCC 4.2.1まではGPLv2だが、GCC 4.2.2以降はGPLv3となり、企業での採用が嫌忌された結果、FreeBSDほかでも不採用となった。

GCC 4.1
 Fortran 95の対応強化を最大の特徴とするバージョンであるらしい。

GCC 4.0
 メジャーバージョンアップとなり、バージョン4となった。
 このバージョンから、最適化フレームワークTREE-SSAが導入された。

GCC 3
 バージョンのみ記載

GCC 2
 バージョンのみ記載
 現在GNUのファイルサーバーから入手できる最古のGCCが2.95である。

再検索