通信用語の基礎知識 全国のICカードこれひとつ 戻る

GCC
辞書:電算用語の基礎知識 ローカルアプリ一般編 (PNAPLLI)
読み:ジースィースィー
外語: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である。

リンク
関連するリンク
GNU Compiler Collection
用語の所属
GNU
コンパイラー
関連する用語
glibc
g++
Low Level Virtual Machine
clang

[再検索] [戻る]


通信用語の基礎知識検索システム WDIC Explorer Ver 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club
KisoDic