GNUコンパイラコレクション

GNUコンパイラコレクションの最新ニュースをまとめて検索!

GNU Compiler Collection
開発元 Free Software Foundation
最新版 4.4.2 (2009年10月15日(39日前))
最新評価版 4.5.0 (2009年4月23日(214日前))
対応OS 多くのUNIX系OS、Windows
プラットフォーム クロスプラットフォーム
種別 コンパイラ
ライセンス GPL
公式サイト gcc.gnu.org
  

GNU Compiler Collection(グニューコンパイラコレクション)は、GNUコンパイラ群である。略称は「GCC」。GNUツールチェーンの中核コンポーネント。

目次

[編集] 概説

標準パッケージにはCC++Objective-C、Objective-C++、FORTRANJava及び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言語で記述されていたので、OS付属のコンパイラでコンパイルできた)。

複数プログラミング言語・複数アーキテクチャへの対応とクロス開発対応・移植性の高さ、また何よりGPLの下、ソースコードを誰でも参照でき変更できることが、GCCを他のコンパイラと異なるものにしている。

[編集] 構成

GCCは通常のコンパイラと同様にフロントエンド部、最適化部、バックエンド部から構成される。

フロントエンド部は字句解析構文解析などを行い、対応言語ごとに用意されている。たとえばC++フロントエンド、Javaフロントエンドなどがある。

バックエンド部のコード生成部(コードジェネレータ)、および最適化部(オプティマイザ)は全言語で共通である。したがってGCCの対応の言語同士の間では、生成コードの質や対応するCPUの種類は原理的に同じになる。なお、フロントエンドおよびバックエンドの間でやりとりされる中間形式としてRTL (Register Transfer Language) が使用される。

CコンパイラとしてのGCCの開発のために、構文解析部生成系bison、字句解析部生成系flexが開発された。これらを使用してGNU Cコンパイラその他の各種フロントエンドは構築されている。これらは単独のフリーソフトウェアとしても有用なものである。

GCCはバージョン4から中間形式が2つ追加された。まず、各言語は通常フロントエンド言語の木構造を保持した共通中間形式のGENERICに変換されその後GIMPLEという中間形式で木の最適化SSAをおこなってからRTLの最適化がおこなわれる。また、CやC++のコンパイル時にフロントエンドの構文解析、字句解析においてbisonやflexを使用しなくなった。

[編集] GCC の貢献

GCC はそれ自身が有用なフリーソフトウェアだが、OSDOSエクステンダ(DJGPP、EMXなど)を構築するための基盤ツールとしても非常に有用であり、商用・非商用を問わず多くの環境で標準的なCコンパイラとして採用されている。特に LinuxFreeBSD など、フリーソフトウェアとしての OS は、もし GCC が存在しなかったならば大きく違ったものになっていたであろう。

また、多くの組み込み系 OS や、ゲームの開発環境でも 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ではバグ修正、最適化の改善に加え、新機能としてCC++FortranOpenMPに対応し、さらにGCC4.3ではループの自動並列化によるマルチスレッド処理が可能となる等、マルチプロセッサ環境では大幅にアプリケーションの性能を引き上げることが可能になった。その一方で、マルチスレッドやベクトルプロセッサを使用しないことを前提としたシングルスレッドアプリケーションにおける最適化においては3.x系よりも一部のプログラムにおいて劣る場合もある。

PGCCはインテル Pentium専用の最適化を行うGCCの派生であり、通常版と比べてPentium CPU上でより効率良く動作するコードを生成する。

また、登場当初は特にMC680x0系に対して商用コンパイラを凌駕する最適化品質を誇っていたとされる。ただし、これは同時代の68k系商用コンパイラとの相対的な比較・評価であり、絶対的な指標によるものではない(有り体に言えば、当時の68k系用商用コンパイラに生成コードの最適化でgccよりも優れた製品が存在しなかったに過ぎない。同時代のgccは、他のプロセッサ環境においてもその生成コードの品質ではなく、gccをターゲットとすることによる移植性の確保やクロス開発における省力化を求める向きが主流であり、これは68k系プロセッサについても同様であった。またこの原則は現在でも変わらない)。

[編集] EGCS

EGCS (Experimental/Enhanced GNU Compiler System) はCYGNUS社のGCC Steering Committeeによる拡張版GCCであった。現在はGCCの開発主力がGCC Steering Committeeに委ねられており、EGCSが公式バージョンになっている(だから今は別にEGCSと言ったり区別したりする必要がない)。

[編集] サポートするアーキテクチャ

[編集] 関連項目

[編集] 外部リンク

最終更新 2009年11月21日 (土) 15:41 (日時は個人設定で未設定ならばUTC)。
【GNUコンパイラコレクション】変更履歴

ご利用上の注意