GCC

読み:ジースィースィー
外語:GCC: GNU Compiler Collection 英語
品詞:固有名詞

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

目次

  • 使用途 ‐ コンパイラー
  • 初出年 ‐ 1999(平成11)年4月(公式)、1987(昭和62)年3月22日(ベータリリース)
  • 設計者 ‐ ?
  • 開発者 ‐ フリーソフトウェア財団(FSF)
  • 最新版 ‐ GCC 5.2 (2015(平成27)年7月16日)
  • 影響関係
    • 被影響 ‐ cc、Microsoft C/C++
    • 加影響 ‐ DJGPP、Microsoft C/C++、clang/LLVM
  • 主要動作環境 ‐ クロスプラットフォーム
  • ライセンスGPLv3 (4.2.2以降)

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++に限ってみても、言語の標準仕様に対して独自の新機能を多数搭載している。この機能が、後に標準仕様に取り込まれることもある。

以下は、代表的な独自機能の例(順不同)。

  • __alignof__
  • __attribute__ 関数属性構文/変数属性構文
  • transparent_union
  • 境界整列
  • 代替キーワード
  • asmキーワードがCでも利用可能
  • アセンブラーラベル
  • C++のコメントがCでも利用可能 (→C99で採用)
  • caseの範囲
  • 共用体のキャスト
  • 文字エスケープシーケンス
  • 複合リテラル
  • オペランドを省略した条件付きステートメント
  • 指定済みのイニシャライザー
  • 識別子内のドル記号
  • 関数名が得られる事前定義済みマクロ __FUNCTION__/__PRETTY_FUNCTION__
  • 旧スタイル関数のプロトタイプ宣言
  • 16進浮動小数点数 (→C99で採用)
  • 不完全なenum型とforward宣言
  • 自動変数の集合イニシャライザー要素
  • 組み込み関数 (__builtin_*)
  • インライン関数inline関数修飾子
  • 値としてのラベル、ローカルラベルと__label__
  • long long (→C99で採用)
  • 拡張左辺値
  • voidポインター関数ポインターに対するポインター算術演算
  • 復帰アドレスとフレームアドレス __builtin_frame_address/__builtin_return_address
  • ステートメント式
  • 構造体への添字の付加
  • 型属性 aligned/packed/transparent_union
  • typeof演算子
  • 匿名構造体と匿名共用体がCでも利用可能
  • 変数属性 aligned/deprecated/packed/section/zero_init/transparent_union/unused/weak
  • 可変個引数マクロ
  • 長さがゼロの配列

ビルトイン関数

GCCには様々なビルトイン関数が用意されており、殆どは __builtin_ から始まる関数名となっている。

これらは、GCCの利便性の向上やC/C++の要求仕様を実装するためのもの、あるいはGCCへの依存性を高めGCCへの囲い込みを強めることを意図したものと考えることができる。なお、これら関数は当然、次世代コンパイラーclang/LLVMでも実装されたため、clang/LLVMへの移行には支障がない。

関数の一覧は、「Other Built-in Functions Provided by GCC」に記載がある(以下、順不同)。

  • 汎用または内部用
    • int __builtin_types_compatible_p (type1, type2)
    • type __builtin_call_with_static_chain (call_exp, pointer_exp)
    • type __builtin_choose_expr (const_exp, exp1, exp2)

      三項演算子と同等の機能をもつ関数

    • type __builtin_complex (real, imag)

      ISO C11のマクロ、CMPLXF、CMPLX、CMPLXLの実装用

    • int __builtin_constant_p (exp)
    • long __builtin_expect (long exp, long c)
    • void __builtin_trap (void)
    • void __builtin_unreachable (void)
    • void *__builtin_assume_aligned (const void *exp, size_t align, ...)
  • プリプロセッサー相当機能
    • int __builtin_LINE ()

      プリプロセッサーの __LINE__ マクロに相当

    • const char * __builtin_FUNCTION ()

      プリプロセッサーの __FUNCTION__ マクロに相当

    • const char * __builtin_FILE ()

      プリプロセッサーの __FILE__ マクロに相当

  • キャッシュ制御等
    • void __builtin___clear_cache (char *begin, char *end)
    • void __builtin_prefetch (const void *addr, ...)
  • 数学関数
    • double __builtin_huge_val (void)

      ISO Cマクロ HUGE_VAL 実装用

    • float __builtin_huge_valf (void)
    • long double __builtin_huge_vall (void)
    • int __builtin_fpclassify (int, int, int, int, int, ...)

      C99 fpclassify機能実装用

    • double __builtin_inf (void)
    • _Decimal32 __builtin_infd32 (void)
    • _Decimal64 __builtin_infd64 (void)
    • _Decimal128 __builtin_infd128 (void)
    • float __builtin_inff (void)
    • long double __builtin_infl (void)
    • int __builtin_isinf_sign (...)
    • double __builtin_nan (const char *str)

      C99 nan機能実装用

    • _Decimal32 __builtin_nand32 (const char *str)
    • _Decimal64 __builtin_nand64 (const char *str)
    • _Decimal128 __builtin_nand128 (const char *str)
    • float __builtin_nanf (const char *str)
    • long double __builtin_nanl (const char *str)
    • double __builtin_nans (const char *str)
    • float __builtin_nansf (const char *str)
    • long double __builtin_nansl (const char *str)
  • ビット演算(int用)
    • int __builtin_ffs (int x)

      xを2進数にしたとき最初に1となるビット位置を返す。つまり、__builtin_ffs(x) = 1 + __builtin_ctz(x) が成り立つ

    • int __builtin_clz (unsigned int x)

      xを2進数にしたときの頭の0の数を返す

    • int __builtin_ctz (unsigned int x)

      xを2進数にしたときの末尾の0の数を返す

    • int __builtin_clrsb (int x)

      xを2進数にしたときの頭の最上位ビットと同じビットの数を返す

    • int __builtin_popcount (unsigned int x)

      xを2進数にしたとき、ビットが1となるビットの数を返す

    • int __builtin_parity (unsigned int x)

      xのパリティを返す。つまり、__builtin_parity(x) = __builtin_popcount(x) % 2 が成り立つ

  • ビット演算(long用)
    • int __builtin_ffsl (long)
    • int __builtin_clzl (unsigned long)
    • int __builtin_ctzl (unsigned long)
    • int __builtin_clrsbl (long)
    • int __builtin_popcountl (unsigned long)
    • int __builtin_parityl (unsigned long)
  • ビット演算(long long用)
    • int __builtin_ffsll (long long)
    • int __builtin_clzll (unsigned long long)
    • int __builtin_ctzll (unsigned long long)
    • int __builtin_clrsbll (long long)
    • int __builtin_popcountll (unsigned long long)
    • int __builtin_parityll (unsigned long long)
  • 累乗
    • double __builtin_powi (double, int)

      累乗を得る。pow関数とは異なり、精度と丸めについての保証がない

    • float __builtin_powif (float, int)
    • long double __builtin_powil (long double, int)
  • バイト順の変更
    • uint16_t __builtin_bswap16 (uint16_t x)
    • uint32_t __builtin_bswap32 (uint32_t x)
    • uint64_t __builtin_bswap64 (uint64_t x)

功績

フリーの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++14に完全対応
  • MIPS Release 6 アーキテクチャ対応
  • OpenMP 4.0 オフローディング対応
  • Intel Skylake Server AVX-512 拡張対応
  • VISIUMcore対応

このバージョンから、デフォルトのCバージョンが-std=gnu89(C89ベース)から-std=gnu11(C11ベース)に変更された。

GCC 4.9

2014(平成26)年4月22日にリリースされたバージョン。

  • C/C++で、色付きのエラー表示に対応
  • ISO C11対応強化
    • アトミック変数 (_Atomic と <stdatomic.h> ヘッダー) 対応
    • 型ジェネリック式 (_Generic キーワード) 対応
    • スレッドローカルストレージ (_Thread_local キーワード) 対応
    • __auto_type 対応
  • ISO C++14対応
    • decltype(auto)
    • ラムダキャプチャ初期化子に対応
    • 可変長配列に対応
    • deprecated アトリビュート
    • 数値のセパレーター ' に対応
    • ポリモーフィックラムダ式
  • Go 1.2.1対応

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日にリリースされたバージョン。

  • リンク時の最適化(Link-time optimization、LTO)の改善
  • C++11の対応強化

このバージョンから、ナショナルセミコンダクターのCR16や、TIのC6Xなどのプロセッサーへの対応が開始された。

GCC 4.6

2011(平成23)年3月25日にリリースされたバージョン。

GCC 4.6.0では、次に挙げるようなObjective-C 2.0の新機能に対応した。

  • プロパティの宣言と合成
  • ドット構文
  • 高速列挙
  • オプションのプロトコルメソッド
  • メソッド/プロトコル/クラスの属性
  • クラスの拡張
  • 新たなGNU Objective-CランタイムAPI

このほか、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ほかでも不採用となった。

  • 4.2.4 (2008(平成20)年5月19日)
  • 4.2.3 (2008(平成20)年2月1日)
  • 4.2.2 (2007(平成19)年10月7日) ↑ここからがGPLv3
  • 4.2.1 (2007(平成19)年7月18日) ↓ここまでがGPLv2
  • 4.2.0 (2007(平成19)年5月13日)

GCC 4.1

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

GCC 4.0

メジャーバージョンアップとなり、バージョン4となった。

このバージョンから、最適化フレームワークTREE-SSAが導入された。

GCC 3

バージョンのみ記載

  • 3.4
    • 3.4.6
    • 3.4.5
    • 3.4.4
    • 3.4.3
    • 3.4.2
    • 3.4.1
    • 3.4.0
  • 3.3
    • 3.3.6
    • 3.3.5
    • 3.3.4
    • 3.3.3
    • 3.3.2
    • 3.3.1
    • 3.3
  • 3.2
    • 3.2.3
    • 3.2.2
    • 3.2.1
    • 3.2
  • 3.1
    • 3.1.1
    • 3.1
  • 3.0
    • 3.0.4
    • 3.0.3
    • 3.0.2
    • 3.0.1
    • 3.0

GCC 2

バージョンのみ記載

  • 2.95
    • 2.95.3
    • 2.95.2
    • 2.95.1
    • 2.95

現在GNUのファイルサーバーから入手できる最古のGCCが2.95である。

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

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


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