GNUコンパイラコレクション
出典: フリー百科事典『ウィキペディア(Wikipedia)』
開発元: | Free Software Foundation |
---|---|
最新版: | 4.1.1 / 2006年5月24日 |
対応OS: | 全てのUNIX系OS、Windows |
プラットフォーム: | クロスプラットフォーム |
種別: | コンパイラ |
ライセンス: | GPL |
公式サイト: | gcc.gnu.org |
GNU Compiler Collection(グニューコンパイラコレクション)は、GNUのコンパイラ群である。略称は「GCC」。
目次 |
[編集] 概説
標準パッケージにはC、C++、Objective-C、FORTRAN、Java及びAdaのコンパイラ並びにこれらのライブラリが含まれている。
当初は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言語で記述されている)。
また、登場当初は特にCISC系CPU(特にMC680x0系)に対して商用コンパイラを凌駕する最適化品質を誇っていたとする、一部ユーザーの声も存在した。ただしこれは、同時代の(特にパーソナル)ユーザーが使用(購入)可能な68k系の商用コンパイラには碌なものが存在せず、単に消去法でGCCが生き残っただけ、というのが真相であり、つまるところ、このような話は特に68k系を採用した一部のコンピュータの熱狂的な信者たちが作り上げた「捏造された伝説」に過ぎない。現に、同時代のx86系やRISC系プロセッサに対しては、GCCは商用コンパイラと比較した際の生成コードの最適化の甘さや、実績・信頼性の低さなどが指摘されており、現在に至ってもGCCの生成コードは特定のプロセッサに特化した商用コンパイラには遠く及ばないというのが真相である。
[編集] 構成
GCCは通常のコンパイラと同様にフロントエンド部、最適化部、バックエンド部から構成される。
フロントエンド部は字句解析、構文解析などを行い、対応言語ごとに用意されている。たとえばC++フロントエンド、Javaフロントエンドなどがある。
バックエンド部のコード生成部(コードジェネレータ)、および最適化部(オプティマイザ)は全言語で共通である。したがってGCCの対応の言語同士の間では、生成コードの質や対応するCPUの種類は原理的に同じになる。なお、フロントエンドおよびバックエンドの間でやりとりされる中間形式としてRTL (Register Transfer Language) が使用される。
CコンパイラとしてのGCCの開発のために、構文解析部生成系bison、字句解析部生成系flexが開発された。これらを使用してGNU Cコンパイラその他の各種フロントエンドは構築されている。これらは単独のフリーソフトウェアとしても有用なものである。
GCC はversion 4から中間形式が2つ追加された。まず、各言語は通常フロントエンド言語の木構造を保持した共通中間形式のGENERICに変換されその後GIMPLEという中間形式で木の最適化SSAをおこなってからRTLの最適化がおこなわれる。また、CやC++のコンパイル時にフロントエンドの構文解析、字句解析においてbisonやflexを使用しなくなった。
[編集] GCC の貢献
GCC はそれ自身が有用なフリーソフトウェアだが、OS や Dos Extender(DJGPP、EMXなど)を構築するための基盤ツールとしても非常に有用であり、商用・非商用を問わず多くの環境で標準的なCコンパイラとして採用されている。特に Linux や FreeBSD など、フリーソフトウェアとしての OS は、もし GCC が存在しなかったならば大きく違ったものになっていたであろう。
商用 OS として GCC を標準採用した OS に、古くはNEXTSTEP があった。また多くの組み込み系 OS や、広義の組み込みシステムといえなくもないゲームコンソール向けの開発環境でも GCC を採用している例がある。これは、クロス開発を容易なものとするGCCの広範なプロセッサへの対応と、一定水準の生成コード品質が評価されていることによる。
その一方で、x86系やRISC系では相変わらず生成コード品質において商用コンパイラに水をあけられているのが実情であり、対象プロセッサに最適化した専用(商用)コンパイラの存在しない環境や、それらを使用(購入)できない用途・ユーザーに限ってGCCが扱われている、逆に言えば、それらのより良い環境を選択可能な状況ではGCCはそのコード品質において第一選択とはならないコンパイラであるという側面は理解しておく必要がある(とはいえ、近年のコンピュータ全般の演算性能の長足の進歩によって、多少無駄なコードであってもとりあえず十分に動くものはできてしまう事などから、最適化や生産性を特別に指向するような用途でもない限りは、「GCCでももはや十分」といった側面があるのも事実ではある)。
このように、GCC自体も年々進歩し続けてはいるものの、絶対的なコード品質において評価される例は無く、むしろ最低水準を年々底上げし続けている(生成コード品質においてフリーソフトウェアとして入手可能なGCCにも劣るコンパイラには、商用・非商用を問わずもはや存在意義がないということ)という意味で評価されるべき存在といえる。
[編集] GNU Cコンパイラ拡張
GNU C コンパイラの特徴のひとつは、前述のようにANSIあるいはISO等の標準への準拠である。もうひとつの特徴は独自の拡張機能である。このような拡張を「GCC拡張機能」とよぶ。GCC拡張機能は数多いが、多引数マクロ、基本型としての複素数型、式の演算結果としての左辺値、初期化式の拡張、Cでのインライン関数定義、ネストした関数定義、ラベルに対する&演算子の適用などがある。
このような拡張は、C99における標準Cの拡張として逆に取り込まれたものも多い。
言語機能の拡張のほかに、標準外機能としてasm文によるインラインアセンブラの機能はユニークである。ただし、GCCにおいてはこのインラインアセンブラ機能を利用して記述したコードに対しても最適化が行われる(プログラマが意図してアセンブリ言語を用いて書いたとしても、その通りのコードが出力されない可能性がある)点に注意が必要である。
その他、研究論文の発表における実装例のベースとして、あるいは実験的機能実装のベースとしてGCC(G++)が使われることも多い。そのような拡張の最近の例としては、スタックバッファオーバーフローに関する脆弱性の回避のためのGCC拡張ProPoliceなどがある。[1]
[編集] 最適化
GCCは高度な最適化を行うが、CPUベンダやRISCワークステーションメーカが提供するコンパイラと比べると見劣りする場合もある。基本的にマルチアーキテクチャで機種依存しない最適化が中心となるため、CPUの決め打ちを行うコンパイラと比べてやや不利な立場といえる。 2005年4月にリリースされたGCC4.0はループ最適化の改善や自動ベクトル化など最適化機構が大幅に見直されている反面、GCC3.x前提で書かれたコードが通らない場合がある等、互換性において若干の問題点がある。GCC4.2ではバグ修正、最適化の改善に加え、新機能としてC、C++、FortranでOpenMPに対応する予定である.
PGCCはIntel Pentium専用の最適化を行うGCCの派生であり、通常版と比べてPentium CPU上でより効率良く動作するコードを生成する。
[編集] EGCS
EGCS (Experimental/Enhanced GNU Compiler System) はCYGNUS社のGCC Steering Committeによる拡張版GCCであった。現在はGCCの開発主力がGCC Steering Committeにゆだねられており、EGCSが公式バージョンになっている(だから今は別にEGCSと言ったり区別したりする必要がない)。
[編集] サポートするアーキテクチャ
- i386
- AMD64
- Itanium
- SPARC
- PA-RISC
- PowerPC
- ARM
- Blackfin
- H8
- M32R
- MIPS
- 680x0
- SuperH
- V850
- VAX
- PDP
- M16C/M32C
- その他
[編集] 関連項目
[編集] 外部リンク
- GCC Home Page (英語)