GNU Compiler Collection(グヌーコンパイラコレクション)は、GNUのコンパイラ群である。略称は「GCC(ジーシーシー)」。GNUツールチェーンの中核となる構成要素(コンポーネント)にもなっている。
概説 最新標準パッケージには C、C++、Objective-C、Objective-C++、Fortran、Ada、Go、Dのコンパイラ並びにこれらのライブラリが含まれている。 バージョン7以前では、Javaもサポートされていた。
当初はCコンパイラとして開発し、GCCは GNU C Compiler を意味していた。しかし、もともと多言語を想定して設計しており、 GNU C Compiler と呼ばれていたときでも多くの言語に対応していた。現在でも GNU C Compiler の意味で「GCC」と呼ぶことも多い。ちなみに GNU C Compiler の実行ファイルの名称もgccである。なお、GNU C++コンパイラをG++、GNU JavaコンパイラをGCJ、GNU AdaコンパイラをGNATと呼ぶ。
CコンパイラとしてのGCCは、ANSI規格 (ANSI X3.159-1989) にほぼ適合するC言語コンパイラ処理系であった。登場当初の時点では、オペレーティングシステム (OS) 標準に付属するCコンパイラがANSI規格に適合していない部分が多いものがあった。そのため、GCCはANSI規格を広める役割を果たした。GCC自身はK&Rの範囲内のC言語で記述していたので、OS付属のコンパイラでコンパイルできた。ただし、GNU拡張という独自の仕様もあり、GCCでコンパイルできるものがANSI適合コンパイラでコンパイルできるとは限らない。
歴史 1985年、当時マサチューセッツ工科大学 (MIT) の研究者であったリチャード・ストールマンによって、既成のコンパイラを拡張する形で開発が始められた。当初コンパイラはというPascalの方言によって書かれていた。その後ストールマンとLeonard H. Tower, Jr.によってC言語で書き直され、GNUプロジェクトの一つとして1987年に公開された。さらに2012年にはLawrence CrowlとDiego NovilloによってC++で書き直された。
EGCS EGCS(エッグズThe initial egcs project announcement - GNU Project - Free Software Foundation (FSF)、Experimental/Enhanced GNU Compiler System)は、1997年に当時開発中のGCC 2.8をベースとしてCygnus社のEGCS Steering Committee(後のGCC Steering Committee)により開発された拡張版GCCである。1999年4月、GCCと再統合されてEGCSがGCCの公式バージョンとなり、GCCの開発主力はGCC Steering Committeeに委ねられた。また、この時点でGCCはGNU Compiler Collectionの意味となったHistory - GCC Wiki。統合後初めてリリースされたバージョンは、1999年7月のGCC 2.95である。 +GCCの主なバージョン 日付 バージョン内容 1999年7月31日2.951999年4月のGCC/EGCS再統合以来のGCCの最初のリリースであり、ほぼ1年分の新しい開発とバグ修正が含まれている。 2001年6月18日3.02002年5月15日3.1ほとんどのELFプラットフォームの既定のデバッグ形式がDWARF2に。2002年8月14日3.22003年5月13日3.32004年4月18日3.4GCCの実装がK&RからC89に変更。新しいプロシージャ間最適化を実装。2005年4月20日4.0.0tree ssaブランチをマージ。既存のRTL表現よりも高レベルの中間表現に基づく完全に新しい最適化フレームワークを採用。2007年5月13日4.2.0OpenMP 2.5サポート2008年3月5日4.3.0Intel Core 2とAMD Geodeプロセッサのサポートを強化2009年4月21日4.4.0大量の新機能を含んだメジャーリリースバージョン。Graphiteブランチが統合され、新しいループ最適化のフレームワークを採用。2010年4月14日4.5.0C++0xの実験的サポート (ラムダ式、型変換演算子、raw string)。新しいリンク時最適化(LTO)のフレームワークを採用。2011年3月25日4.6.0Intel Sandy Bridgeプロセッサに対応 (AVX拡張命令セットも対応)2012年3月22日4.7.0プロシージャ間最適化(IPO)の改善2013年3月22日4.8.0GCCの実装がCからC++98に変更された。アドレスサニタイザ、スレッドサニタイザが追加。新しいローカルレジスタアロケータ(LRA)が実装。DWARF4が既定のデバッグ形式に。2014年4月22日4.9.0C++14の機能追加、OpenMP 4.0対応。未定義動作サニタイザが追加。リンク時最適化の改善。2015年4月22日5.1C11がデフォルトに。未定義動作サニタイザの新しいオプション。ポインタ境界チェッカー。2016年4月27日6.1C++14がデフォルトに。OpenMP 4.5をフルサポート。配列境界チェッカー。2017年5月2日7.1C++17の実験的サポート。アドレスサニタイザの新しいオプション。2018年5月2日8.1C17をサポート。C17がデフォルトに。C++2aの実験的サポート。エラーメッセージを改善。2019年5月3日9.1C++17をサポート。C++2a(C++20)の実験的サポート。D言語をサポート。2020年5月7日10.1C++14とC++17の間のABIの非互換性を修正。C++20をサポート。2021年4月27日11.1GCCの実装がC++11で書き直された。C++17がデフォルトに。DWARF5が既定のデバッグ形式に。2021年5月14日8.52021年6月1日9.42021年6月28日11.22022年4月21日11.32022年5月6日12.1C++20とC++23(実験的)のサポートを改善。シャドーコールスタックサニタイザがAArch64に追加。2022年5月27日9.52022年6月28日10.42022年8月19日12.22023年4月26日13.1C23の実験的サポート。Modula-2プログラミング言語をサポート。2023年5月8日12.3AMD Zen 4プロセッサーのサポート。(-march=znver4)2023年5月29日11.42023年7月7日10.52023年7月27日13.22024年5月7日14.1C23のサポートを改善。C++26の実験的サポート。Rustプログラミング言語を実験的にサポート。2024年5月21日13.32024年6月20日12.42024年7月19日11.52024年8月1日14.22025年4月25日15.1C23がデフォルトに。C++23とC++26のサポートを改善。Rustプログラミング言語のサポートを改善。2025年5月23日14.32025年6月5日13.42025年7月11日12.52025年8月8日15.22026年4月30日16.1C++20がデフォルトに。C++23とC++26のサポートを改善。Algol 68プログラミング言語をサポート。2026年6月12日15.32026年6月26日14.42026年8月7日16.2
構成 GCCは通常のコンパイラと同様にフロントエンド部、最適化部、バックエンド部から構成される。
フロントエンド部は字句解析、構文解析などを行い、対応言語ごとに用意されている。たとえばC++フロントエンド、Javaフロントエンドなどがある。
バックエンド部のコード生成部(コードジェネレータ)、および最適化部(オプティマイザ)は全言語で共通である。したがってGCCの対応の言語同士の間では、生成コードの質や対応するCPUの種類は原理的に同じになる。なお、フロントエンドおよびバックエンドの間でやりとりされる中間形式として (RTL) が使用される。
CコンパイラとしてのGCCの開発のために開発された構文解析部生成系bisonやフリーな字句解析部生成系flexといったプログラムを使用してGNU Cコンパイラその他の各種フロントエンドは構築されている。これらは単独の自由ソフトウェアとしても有用なものである。
GCCはバージョン4から中間形式が2つ追加された。まず、各言語は通常フロントエンド言語の木構造を保持した共通中間形式のGENERICに変換されその後という中間形式で木の最適化SSAをおこなってからRTLの最適化がおこなわれる。また、CやC++のコンパイル時にフロントエンドの構文解析、字句解析においてbisonやflexを使用しなくなった。
GNU Cコンパイラ拡張 GNU C コンパイラの特徴のひとつは、前述のようにANSIあるいはISO等の標準への準拠である。もうひとつの特徴は独自の拡張機能である。このような拡張を「GCC拡張機能」とよぶ。GCC拡張機能は数多いが、多引数マクロ、基本型としての複素数型、式の演算結果としての左辺値、初期化式の拡張、Cでのインライン関数定義、ネストした関数定義、ラベルに対する&演算子の適用などがある。
このような拡張は、C99における標準Cの拡張として逆に取り込まれたものも多い。
言語機能の拡張のほかに、標準外機能としてasm文によるインラインアセンブラの機能はユニークである。ただし、GCCにおいてはこのインラインアセンブラ機能を利用して記述したコードに対しても最適化が行われる(プログラマが意図してアセンブリ言語を用いて書いたとしても、その通りのコードが出力されない可能性がある)点に注意が必要である。
その他、研究論文の発表における実装例のベースとして、あるいは実験的機能実装のベースとしてGCC (G++)が使われることも多い。そのような拡張の最近の例としては、スタックバッファオーバーフローに関する脆弱性の回避のためのGCC拡張ProPoliceなどがある。
最適化 GCCは高度な最適化を行うが、CPUベンダやRISCワークステーションメーカが提供するコンパイラと比べると見劣りする場合もある。マルチアーキテクチャゆえに、機種依存しない最適化が中心となるため、特定の CPU に特化した専用コンパイラと比べてやや不利な立場といえる。
2005年4月にリリースされたGCC4.0はループ最適化の改善や自動ベクトル化など最適化機構が大幅に見直されている反面、GCC3.x で書かれたコードがコンパイルエラーになることがあり、互換性において若干の問題点がある。GCC4.2ではバグ修正、最適化の改善に加え、新機能としてC、C++、FortranでOpenMPに対応し、さらにGCC4.3ではループの自動並列化によるマルチスレッド処理が可能となるなど、マルチプロセッサ環境では大幅にアプリケーションの性能を引き上げることが可能になった。ただし、マルチスレッドやベクトルプロセッサを使用しないことを前提としたシングルスレッドアプリケーションにおける最適化においては3.x系よりも一部のプログラムにおいて劣る場合もある。
2010年4月にリリースされたGCC4.5ではリンク時最適化が導入され、複数のオブジェクトファイルにまたがるプログラムに対してより効果的に最適化ができるようになった。なおリンク時最適化とは単にリンク時に行う最適化を意味し、やプログラム全体最適化を改善する上で求められるようになった。
1990年頃のGCC1.xや2.xは、特にMC680x0系に対して商用コンパイラを凌駕する最適化品質を誇っていたとされる。ただし、これは同時代の68k系商用コンパイラとの相対的な比較・評価であり絶対的な指標によるものではない。
また1990年代後半のはインテル Pentium専用の最適化を行うGCC(正確にはegcs)の派生であり、通常版と比べてPentium CPU上でより効率良く動作するコードを生成する。
ライセンスと開発体制 貢献と評価 GCCはそれ自身が有用な自由ソフトウェアであるだけでなく、オペレーティングシステム (OS) やDOSエクステンダ(DJGPP、など)を構築するための基盤ツールとしても広く利用されてきた。特にLinuxやFreeBSDなどの自由ソフトウェアとしてのOS開発において中核的な役割を果たしており、Linuxの生みの親であるリーナス・トーバルズはGCCをGNUプロジェクトの中で最も重要なものとして挙げているLinuxの強味。また、Linuxカーネルの開発においては、長年にわたりGCC固有の拡張機能(GNU C拡張)が深く活用されてきた歴史がある。
多数のCPUアーキテクチャに対応したクロス開発(クロスコンパイル)が容易であることから、多くの組み込みOSやゲーム開発環境(各種コンソールゲーム機など)でも標準的なツールチェーンとして採用されてきた。
一方で、1990年代の一時期には、特定のプロセッサに特化した最適化を行う商用コンパイラ(インテルコンパイラなど)と比較して、科学技術演算向けのベクトル演算対応やベンチマークスコアにおいて見劣りする面もあった。これは多様な環境へのポータビリティを第一とする設計思想に起因するものであったが、1997年のEGCSプロジェクトの発足と、その後のGCCへの再統合を経て、各アーキテクチャ固有の最適化機能(自動ベクトル化など)の強化が継続的に行われている。また、大規模なソフトウェア開発においては、極度な最適化よりも、既存のコードが正しくコンパイルされ安定して動作するという互換性と堅牢性の高さが、GCCが標準採用され続ける重要な要因として評価されている。
批判とライセンス忌避に伴う他コンパイラへの移行 GCCを巡っては、採用されているGNU General Public License(特に2007年に策定されたバージョン3、GPLv3)の制約が企業や一部のオープンソースプロジェクトから問題視される場合がある。
GPLには強いコピーレフト性があり、リンクやコードの一部の使用によってプログラム全体にGPLが伝播する性質があるが、GCCにはGCC Runtime Library Exception(GCCランタイムライブラリ例外)が存在するため、GCCをコンパイラとして利用してバイナリを作成する限りにおいては、その成果物にGPLを強制することはない。
しかし、GCC自体のソースコードを改変して再頒布する場合や、GCCを組み込み機器等のシステムに組み込んで提供する場合には、GPLv3で義務付けられたソースコードの開示や、デジタル著作権管理 (DRM) による改変制限の禁止(TiVo化の禁止)、特許授与条項などの厳しい条件が課されることになる。このため、商業利用におけるリスクや「GPLフリー」なプラットフォーム構築を目指し、オペレーティングシステム (OS) や開発環境の標準ツールチェーンをGCCから別のコンパイラへ切り替える動きが活発化した。
具体的な一例として、FreeBSDプロジェクトではGPLv3ライセンスの適用を避けるため、ベースシステムに含まれるGCCのバージョンをGPLv2下の最終版である「4.2.1」で長期間凍結した。その後、2012年に標準コンパイラをBSDライセンス準拠のClang/LLVMへと完全に切り替えたFreeBSD takes another step toward GPL escape - TechRepublic・2012年11月7日。また、Appleも同様の理由から、macOSやiOSの開発環境(Xcode)においてGCCの採用を取り止め、LLVM/Clangプロジェクトへ多大な投資を行って自社環境の全面的な移行を完了させている。
AIを使用した開発の禁止 2026年7月29日よりAIを使用した開発を禁止している。AIを使用した約15行以上のプルリクエストは全て拒否する。ただし、テストコードに限り一部にAIを使用していたものが含まれていても許容する。
サポートするアーキテクチャ
脚注
関連項目
外部リンク
公式ウェブサイト 本の虫: OpenBSDのコンパイラー GCC 2.5からEGCSまでの記載もある