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

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

GNUコンパイラコレクション
GNUコンパイラコレクションlogo.svg
GCC 10.2GNUコンパイラコレクションself-compilation.png
独自のソースコードをコンパイルするGCC10.2のスクリーンショット
原作者リチャード・ストールマン
開発者GNUプロジェクト
初回リリース1987年3月22日; 34年前[1] (1987-03-22)
安定リリース
11.2 [2] ウィキデータでこれを編集する / 2021年7月28日
リポジトリ
で書かれているCC ++ [3]
オペレーティング・システムクロスプラットフォーム
プラットホームGNUと他の多く
サイズ〜1500万LOC [4]
で利用可能英語
タイプコンパイラ
ライセンスGCCランタイムライブラリ例外のあるGPLv3 + [5]
Webサイトgcc .gnu .org

GNUコンパイラコレクションGCC)は、さまざまなプログラミング言語ハードウェアアーキテクチャ、およびオペレーティングシステムをサポートするGNUプロジェクトによって生成された最適化コンパイラです。Free Software Foundation (FSF)は、 GNU General Public License(GNU GPL)の下でGCCを自由ソフトウェアとして配布しています。GCCは、GNUツールチェーンの主要コンポーネントであり、 GNUおよびLinuxカーネルに関連するほとんどのプロジェクトの標準コンパイラです。2019年には約1500万行のコードがあり、GCCは存在する最大の無料プログラムの1つです。[4]ツールとしても例としても、 自由ソフトウェアの成長に重要な役割を果たしてきました。

1987年にRichardStallmanによって最初にリリースされたとき GCC 1.0はCプログラミング言語しか処理しなかったため、GNUCコンパイラと呼ばれていました。[1]その年の12月にC ++をコンパイルするように拡張されました。フロントエンドは、 Objective-CObjective-C ++FortranAdaDGoなどのために後で開発されました。[6] OpenMPおよびOpenACC仕様は、CおよびC ++コンパイラーでもサポートされています。[7] [8]

GCCは、他のどのコンパイラよりも多くのプラットフォームと命令セットアーキテクチャに移植されており、無料ソフトウェアとプロプライエタリソフトウェアの両方の開発におけるツールとして広く展開されています。GCCは、 ARMベースのチップやPowerISAベースのチップを含む多くの組み込みシステムでも利用できます。

GCCは、 GNUオペレーティングシステムの公式コンパイラであるだけでなく、ほとんどのLinuxディストリビューションを含む他の多くの最新のUnixライクなコンピュータオペレーティングシステムによって標準コンパイラとして採用されています。ほとんどのBSDファミリのオペレーティングシステムもリリース直後にGCCに切り替わりましたが、それ以降、FreeBSDOpenBSD、およびApple macOSは主にライセンス上の理由からClangコンパイラに移行しました[9] 。[10] [11] [12] GCCは、 WindowsAndroidのコードをコンパイルすることもできます。iOSSolarisHP-UXAIXおよびDOS。[13]

歴史

1983年後半GNUオペレーティングシステムをブートストラップするために、リチャードストールマンは、アムステルダムコンパイラキット(フリーユニバーシティコンパイラキットとも呼ばれます)の作成者であるアンドリューS.タネンバウムに、そのソフトウェアをGNUに使用する許可を求めました。タネンバウムがコンパイラーは無料ではなく、大学だけが無料であると彼にアドバイスしたとき、ストールマンは別のコンパイラーで作業することに決めました。[14]彼の当初の計画は、レンタワーなどの助けを借りて、ローレンスリバモア国立研究所の既存のコンパイラをパステルからCに書き直すことでした。[15] [16]ストールマンは、リバモアコンパイラ用に新しいCフロントエンドを作成しましたが、メガバイトのスタックスペースが必要であり、64KBしかない68000Unixシステムでは不可能であることに気付き、新しいコンパイラを最初から作成する必要があると結論付けまし[15]ストールマンは自分が書いたCフロントエンドを使用したが、パステルコンパイラコードはいずれもGCCに含まれていなかった。[15] [17]

GCCは1987年3月22日に最初にリリースされ、 MITからFTPで入手できました。[18]ストールマンは著者としてリストされたが、 RTLを中間言語として使用するというアイデアについてはジャック・デビッドソンとクリストファー・フレイザー、プリプロセッサの大部分を書くためにはポール・ルービン、「パーサー、RTLジェネレーター、RTL定義、およびVaxマシンの説明。」[19] Peter H. Salusによって「最初のフリーソフトウェアヒット」と説明されたGNUコンパイラは、 SunMicrosystemsがオペレーティングシステムから開発ツールをアンバンドルしたちょうどその時に到着しました。、以前のバンドルよりも高い合計価格でそれらを個別に販売したため、Sunのユーザーの多くはベンダーのツールの代わりにGCCを購入またはダウンロードしました。[20]ストールマンはGNUEmacsを彼のメインプロジェクトと見なしていましたが、1990年までに、GCCは13のコンピューターアーキテクチャをサポートし、いくつかのベンダーコンパイラを上回り、いくつかの企業によって商業的に使用されました。[21]

EGCSフォーク

GCCはGPLの下でライセンスされているため、他の方向で作業したいプログラマー、特にC以外の言語用の書き込みインターフェイスは、ソースを配布するための要件を含むGPLの条件を満たしていれば、コンパイラーの独自のフォークを自由に開発できました。コードただし、複数のフォークは非効率的で扱いにくいことが判明し、プロジェクトが新機能よりも安定性を優先するため、公式のGCCプロジェクトで作業を受け入れることの難しさは多くの人にとって非常に苛立たしいものでした。[22] FSFは、GCC 2.xの公式バージョン(1992年以降に開発)に追加されたものを厳密に制御していたため、GCCはエリックS.レイモンドのエッセイの「大聖堂」開発モデルの一例として使用されました。大聖堂とバザール

1997年、開発者のグループが実験的/拡張GNUコンパイラシステム(EGCS)を結成し、いくつかの実験的フォークを1つのプロジェクトに統合しました。[22] [17]合併の基礎は、GCCの開発スナップショットでした(2.7.2前後で取得され、その後2.8.1リリースまで続きました)。合併には、g77(Fortran)、PGCC(P5 Pentium最適化GCC)、[17]多くのC ++の改善、および多くの新しいアーキテクチャーとオペレーティングシステムのバリエーションが含まれていました。[23]

両方のプロジェクトが互いの変更に厳密に従っている間、EGCS開発はかなり活発であることが証明されたため、FSFはGCC 2.xコンパイラの開発を公式に停止し、EGCSをGCCの公式バージョンとして祝福し、EGCSプロジェクトをGCCとして任命しました。 1999年4月のメンテナ。1999年7月のGCC2.95のリリースにより、2つのプロジェクトは再び統合されました。[24] [17] GCCはそれ以来、運営委員会の指揮の下、世界中のさまざまなプログラマーのグループによって維持されてきました。[25]

GCC 3(2002)は、メンテナンスが不足しているため、 CHILLのフロントエンドを削除しました。[26]

バージョン4.0より前のFortranフロントエンドはFORTRAN77g77のみをサポートしていましたが、後に廃止され、 Fortran95とFortran2003およびFortran2008の大部分もサポートする新しいGNUFortranフロントエンドが採用されました。[27] [28]

バージョン4.8以降、GCCはC ++で実装されています。[29]

CilkPlusのサポートはGCC5からGCC7まで存在していました。[30] [31]

GCCは、さまざまな命令セットアーキテクチャに移植されており、無料ソフトウェアとプロプライエタリソフトウェアの両方の開発におけるツールとして広く展開されていますGCCは、 Symbiangcceと呼ばれる)、[32] ARMベース、およびPowerISAベースのチップを含む多くの組み込みシステムでも利用できます。[33]コンパイラは、 PlayStation 2[34] PlayStation3のCellSPE、[35]Dreamcastなどのビデオゲームコンソールを含む、さまざまなプラットフォームをターゲットにできます[36] 他のどのコンパイラよりも多くの種類のプロセッサとオペレーティングシステムに移植されています。[37] [自費出版の情報源?] [より良い情報源が必要]

サポートされている言語

2021年5月の時点で、GCCの最近の11.1リリースには、 C)、C ++)、Objective-CFortran)、AdaGNAT)、Go)、およびD、9.1以降)[38]プログラミングのフロントエンドが含まれています。言語[39] GCC5.1以降でサポートされているOpenMPおよびOpenACC並列言語拡張。[8] [40] GCC 7より前のバージョンはJava)もサポートしており、Javaをネイティブマシンコードにコンパイルできます。gccg++gfortrangccgogdcgcj[41]

C ++およびCの言語バージョンのサポートに関しては、GCC 11.1以降、デフォルトのターゲットはC ++ 17のスーパーセットであるgnu ++ 17と、 C11のスーパーセットであるgnu11であり、厳密な標準サポートも利用できます。GCCは、 C ++ 20および今後のC ++ 23の実験的サポートも提供します[42]

サードパーティのフロントエンドは、Pascalgpc)、Modula-2Modula-3VHDLGHDL)などの多くの言語に対応しています。[39] Unified Parallel C [43]またはRust用のGCCUPCコンパイラなど、追加の言語をサポートするための実験的なブランチがいくつか存在します。[44]

デザイン

プリプロセッサアセンブラリンカなどの特殊なプログラムを含む、GCCの拡張コンパイルパイプラインの概要
GCCは、多言語およびマルチCPUコンパイラに典型的な3ステージアーキテクチャに従います。すべてのプログラムツリーは「ミドルエンド」で共通の抽象表現に変換され、コード最適化バイナリコード生成機能をすべての言語で共有できるようになります。

GCCの外部インターフェースはUnixの規則に従います。ユーザーは言語固有のドライバープログラム(gccC、g++C ++など)を呼び出します。このプログラムは、コマンド引数を解釈し、実際のコンパイラーを呼び出し、出力でアセンブラーを実行し、オプションでリンカーを実行して完全な実行可能バイナリを生成します。

各言語コンパイラは、ソースコードを読み取り、マシンコードを出力する個別のプログラムです。すべて共通の内部構造を持っています。言語ごとのフロントエンドは、その言語のソースコードを解析し、抽象構文ツリー(略して「ツリー」)を生成します。

これらは、必要に応じて、GENERIC形式と呼ばれるミドルエンドの入力表現に変換されます。その後、ミドルエンドはプログラムを徐々に最終的な形に変換します。コンパイラの最適化静的コード分析手法(FORTIFY_SOURCE、[45]バッファオーバーフローを検出しようとするコンパイラ指令など)がコードに適用されます。これらは複数の表現、主にアーキテクチャに依存しないGIMPLE表現とアーキテクチャに依存するRTL表現で機能します。最後に、マシンコードはアーキテクチャ固有のパターンマッチングを使用して生成されます元々はJackDavidsonとChrisFraserのアルゴリズムに基づいていました。

GCCは、 Adaフロントエンドの一部を除いて、主にCで記述されています。ディストリビューションには、コードがほとんどこれらの言語で記述されているAdaおよびC ++の標準ライブラリが含まれています。[46]一部のプラットフォームでは、ディストリビューションには、マシンに依存しないCとプロセッサ固有のマシンコードの組み合わせで記述された低レベルのランタイムライブラリlibgccも含まれ、主にターゲットプロセッサが直接実行できない算術演算を処理するように設計されています。[47]

GCCは、ビルドで多くの追加ツールを使用します。これらのツールの多くは、Perl[詳細な説明が必要] FlexBison、およびなど、多くのUnixおよびLinuxディストリビューションによってデフォルトでインストールされます(ただし、通常、Windowsインストールには存在しません)。その他の一般的なツール。さらに、現在、ビルドするには、 GMPMPC、およびMPFRの3つの追加ライブラリが必要です。[48]

2010年5月、GCC運営委員会は、C ++コンパイラを使用してGCCをコンパイルすることを許可することを決定しました。[49]コンパイラは、主にCで記述され、さらにC ++の機能のサブセットで記述されることを目的としていました。特に、これは、GCCの開発者がC ++のデストラクタジェネリック機能を使用できるようにするために決定されました。[50]

2012年8月、GCC運営委員会は、GCCが実装言語としてC ++を使用するようになったと発表しました。[51]これは、ソースからGCCをビルドするには、ISO / IEC C ++ 03標準を理解するC ++コンパイラが必要であることを意味します。

2020年5月18日、GCCはISO / IEC C ++ 03標準からISO / IEC C ++ 11標準に移行しました(つまり、コンパイラ自体をコンパイル、ブートストラップする必要がありました。ただし、デフォルトでは、C ++の新しいバージョンをコンパイルします)。[52]

フロントエンド

フロントエンドは、前処理字句解析構文解析(構文解析)、および意味解析で構成されています。コンパイラフロントエンドの目標は、言語の文法とセマンティクスに従って候補プログラムを受け入れるか拒否し、エラーを識別し、後のコンパイラステージで有効なプログラム表現を処理することです。この例は、 Cで記述された単純なプログラムに対して実行されるレクサーとパーサーのステップを示しています

フロントエンドはパーサーを使用して、特定のソースファイルの抽象構文ツリーを生成します。構文ツリーの抽象化により、サポートされているさまざまな言語のソースファイルを同じバックエンドで処理できます。GCCは、 Bisonで生成されたLALRパーサーの使用を開始しましたが、2004年にC ++ [53]、2006年にCおよびObjective-C用に手書きの再帰下降パーサーに徐々に切り替えました。 [54] 2021年以降、すべてのフロントエンドは手を使用します。 -再帰下降パーサーを作成しました。

GCC 4.0までは、プログラムのツリー表現は、対象となるプロセッサから完全に独立していませんでした。ツリーの意味は、言語のフロントエンドごとに多少異なり、フロントエンドは独自のツリーコードを提供できます。これは、GCC4.0の登場で導入された言語に依存しないツリーの2つの新しい形式であるGENERICとGIMPLEの導入によって簡素化されました。GENERICは、GCC 3.xJavaフロントエンドの中間表現に基づいてより複雑になっています。GIMPLEは単純化されたGENERICであり、さまざまな構成が複数のGIMPLE命令に下げられています。CC ++およびJavaフロントエンドは、フロントエンドで直接GENERICを生成します。他のフロントエンドは、代わりに、これらを解析してGENERICに変換した後、異なる中間表現を持ちます。

いずれの場合も、いわゆる「gimplifier」は、このより複雑な形式を、言語およびアーキテクチャに依存しない多数のグローバル(関数スコープ)最適化の共通言語である 、より単純なSSAベースのGIMPLE形式に変換します。

GENERICとGIMPLE

GENERICは、ソースコードを実行可能バイナリにコンパイルする際の「ミドルエンド」として使用される中間表現言語です。GIMPLEと呼ばれるサブセットは、GCCのすべてのフロントエンドのターゲットになっています。

GCCの中間段階では、コードの分析と最適化がすべて行われ、コンパイルされた言語とターゲットアーキテクチャの両方から独立して動作し、GENERIC [55]表現から始まり、レジスタ転送言語(RTL)に拡張されます。GENERIC表現には、ミドルエンドによって最適化された 命令型プログラミング構造のサブセットのみが含まれます。

ソースコードをGIMPLEに変換する際、[56]複雑な式は、一時変数を使用して3アドレスコードに分割されますこの表現は、命令型プログラムの分析と最適化を簡素化するために、 Laurie J. Hendren [58]によってMcCATコンパイラ[57]で提案されたSIMPLE表現に触発されました

最適化

最適化は、コンパイルのどの段階でも発生する可能性があります。ただし、最適化の大部分は、フロントエンドの構文およびセマンティック分析の後、バックエンドのコード生成の前に実行されます。したがって、コンパイラのこの部分の一般的な名前は、多少矛盾しますが、「ミドルエンド」です。

GCC最適化の正確なセットは、開発時にリリースごとに異なりますが、ループ最適化ジャンプスレッド共通部分式除去命令スケジューリングなどの標準アルゴリズムが含まれています。RTL最適化はスコープがはるかに限定されており、高レベルの情報が少ないため、 GIMPLEツリーにグローバルSSAベースの最適化が追加されているため、RTL最適化の重要性は低くなります[59] 。

このレベルで実行されるこれらの最適化には、デッドコードの除去部分冗長性の除去グローバル値の番号付けスパース条件定数伝播、および集計のスカラー置換が含まれます。自動ベクトル化自動並列化などの配列依存性に基づく最適化も実行されます。プロファイルに基づく最適化も可能です。[60]

バックエンド

GCCのバックエンドは、ターゲットアーキテクチャに固有のプリプロセッサマクロと関数によって部分的に指定されます。たとえば、エンディアンワードサイズ呼び出し規約を定義します。バックエンドのフロント部分はこれらを使用してRTL生成を決定するのに役立ちます。したがって、GCCのRTLは名目上プロセッサに依存しませんが、抽象命令の初期シーケンスはすでにターゲットに適合しています。いつでも、プログラム表現を形成する実際のRTL命令は、ターゲットアーキテクチャ のマシン記述に準拠する必要があります。

マシン記述ファイルには、RTLパターン、オペランド制約、および最終アセンブリを出力するためのコードスニペットが含まれています。制約は、特定のRTLパターンが(たとえば)特定のハードウェアレジスタにのみ適用されるか、(たとえば)限られたサイズ(たとえば、12、16、24、...ビットオフセットなど)の即時オペランドオフセットのみを許可する可能性があることを示します。 )。RTLの生成中に、指定されたターゲットアーキテクチャの制約がチェックされます。RTLの特定のスニペットを発行するには、マシン記述ファイル内の1つ(または複数)のRTLパターンと一致し、そのパターンの制約を満たす必要があります。そうしないと、最終的なRTLをマシンコードに変換できなくなります。

コンパイルの終わりに向かって、有効なRTLは、各命令が実際のマシンレジスタとターゲットのマシン記述ファイルからのパターンを参照する厳密な形式に縮小されます。厳密なRTLの形成は複雑な作業です。重要なステップはレジスタ割り当てです。ここでは、最初に割り当てられた疑似レジスタを置き換えるために実際のハードウェアレジスタが選択されます。この後に「リロード」フェーズが続きます。実際のハードウェアレジスタが割り当てられていない疑似レジスタはスタックに「スピル」され、このスピルを実行するためのRTLが生成されます。同様に、実際の命令に収まらないほど大きいオフセットは、分割して、オフセット制約に従うRTLシーケンスに置き換える必要があります。

最終フェーズでは、各パターンに関連付けられたコードの小さなスニペットを呼び出してマシンコードを構築し、リロードフェーズで選択された最終レジスタ、オフセット、およびアドレスを使用して、ターゲットの命令セットから実際の命令を生成します。アセンブリ生成スニペットは単なる文字列である場合があります。その場合、文字列へのレジスタ、オフセット、および/またはアドレスの単純な文字列置換が実行されます。アセンブリ生成スニペットは、Cコードの短いブロックである場合もあり、追加の作業を実行しますが、最終的には有効なアセンブリコードを含む文字列を返します。

C ++標準ライブラリ(libstdc ++)

GCCプロジェクトには、libstdc ++と呼ばれるC ++標準ライブラリの実装が含まれています[61]。ソースがGCCでビルドされている場合、クローズドソースアプリケーションをリンクすることを除いて、GPLv3ライセンスの下でライセンスされています。[62] 現在のバージョンは11です。

その他の機能

GCCのいくつかの機能は次のとおりです。

リンク時の最適化
リンク時の最適化は、オブジェクトファイルの境界を越えて最適化し、リンクされたバイナリを直接改善します。リンク時の最適化は、オブジェクトファイルに含まれているGimple表現のシリアル化を含む中間ファイルに依存しています。[要出典]ファイルは、ソースのコンパイル中にオブジェクトファイルと一緒に生成されます。ソースをコンパイルするたびに、個別のオブジェクトファイルとリンクタイムヘルパーファイルが生成されます。オブジェクトファイルがリンクされると、コンパイラが再度実行され、ヘルパーファイルを使用して、個別にコンパイルされたオブジェクトファイル全体でコードが最適化されます。
プラグイン
プラグインはGCCコンパイラを直接拡張します。[63]プラグインを使用すると、プラグインとしてロードされた外部コードによって、ストックコンパイラを特定のニーズに合わせて調整できます。たとえば、プラグインは、Gimple表現で動作するミドルエンドパスを追加、置換、または削除することもできます。[64]いくつかのGCCプラグインがすでに公開されています。特に次のとおりです。
  • libpythonに対してリンクし、コンパイラ内から任意のPythonスクリプトを呼び出すことができるPythonプラグイン。目的は、GCCプラグインをPythonで記述できるようにすることです。
  • MELTプラグインは、 GCCを拡張するための高レベルのLispのような言語を提供します。[65]
プラグインのサポートは、2007年にかつて論争の的となった問題でした。[66]
C ++トランザクションメモリ
C ++言語には、トランザクションメモリに関する積極的な提案があります。でコンパイルすると、GCC6以降で有効にできます-fgnu-tm[7] [67]
Unicode識別子
C ++言語では、識別子で非ASCII Unicode文字をサポートする必要がありますが、この機能はGCC 10以降でのみサポートされています。既存の文字列リテラルの処理と同様に、ソースファイルはUTF-8でエンコードされていると見なされます。この機能はCではオプションですが、この変更以降も利用できるようになりました。[68] [69]
C拡張機能
GNU Cは、ネストされた関数[70]や式など、いくつかの非標準機能でCプログラミング言語を拡張しますtypeof[71]

アーキテクチャ

WindowsでHelloWorldコンパイルするGCC

バージョン11.1以降のGCCターゲットプロセッサフ​​ァミリには、次のものが含まれます。[72]

標準リリースでサポートされているあまり知られていないターゲットプロセッサには、次のものがあります。

追加のプロセッサは、FSFバージョンとは別に保守されているGCCバージョンでサポートされています。

GCJ Javaコンパイラは、ネイティブマシン言語アーキテクチャまたはJava仮想マシンJavaバイトコードのいずれかをターゲットにできます[75] GCCを新しいプラットフォームにリターゲットする場合、ブートストラップがよく使用されます。Motorola 68000、Zilog Z80、およびその他のプロセッサは、さまざまなTexas Instruments、Hewlett Packard、Sharp、およびCasioのプログラム可能なグラフ電卓用に開発されたGCCバージョンも対象としています。[76]

ライセンス

GCCは、GNU General Public Licenseバージョン3でライセンスされています。 [77] GCCランタイム例外により、 GCCを使用した独自のプログラム(無料ソフトウェアに加えて)のコンパイルが許可されます。これは、GCCソースコードのライセンス条項には影響しません。[78]

も参照してください

参考文献

  1. ^ a b "GCCリリース"GNUプロジェクト2020年7月24日取得
  2. ^ 「GCC11.2がリリースされました」2021年7月28日。
  3. ^ 「GCCコーディング規約-GNUプロジェクト」gcc.gnu.org 2022年2月7日取得
  4. ^ abVíctorRodríguez 2019年10月1日)。「最先端のツールチェーン(GCC / GLIBCの最新機能)」youtube.comLinuxFoundation。2021年11月7日にオリジナルからアーカイブされました2021年1月19日取得
  5. ^ 「GCCランタイムライブラリの例外」2020年7月24日取得
  6. ^ 「GCCでサポートされているプログラミング言語」GNUプロジェクト2014年6月23日取得
  7. ^ a b "GCC 6リリースシリーズ—変更、新機能、および修正-GNUプロジェクト"gcc.gnu.org
  8. ^ a b "OpenACC-GCCWiki"gcc.gnu.org
  9. ^ 「LLVMコンパイラインフラストラクチャプロジェクト」llvm.org
  10. ^ 「AppleのGPLv3パージ」meta.ath0.com 2021年1月12日取得
  11. ^ Linnemann、Reid(2012年6月20日)。「なぜClang」2021年1月12日取得
  12. ^ 「2007年8月29日:FreeBSD Foundationニュースレター、2007年8月29日」2007年10月11日。2007年10月11日のオリジナルからアーカイブ2021年1月12日取得
  13. ^ 「GCCのインストール:バイナリ-GNUプロジェクト-フリーソフトウェアファウンデーション(FSF)」gcc.gnu.org 2021年1月12日取得
  14. ^ von Hagen、William(2006)。GCCの決定的なガイド決定的なガイド(第2版)。押してください。p。XXVII。ISBN 978-1-4302-0219-6そこで彼はVUCKの作者に手紙を書き、GNUがそれを使用できるかどうか尋ねました。明らかに、VUCKの開発者は協力的ではなく、大学は無料でしたが、コンパイラーは無料ではなかったと答えました。
  15. ^ a b c ストールマン、リチャード(2011年9月20日)。「GNUプロジェクトについて」GNUプロジェクト2011年10月9日取得
  16. ^ Puzo、Jerome E.、ed。(1986年2月)。「Gnuの動物園」Gnu'sBulletinフリーソフトウェアファウンデーション。1(1)2007年8月11日取得
  17. ^ a b c d von Hagen、William(2006)。GCCの決定的なガイド決定的なガイド(第2版)。押してください。p。XXVII。ISBN 978-1-4302-0219-6
  18. ^ リチャードM.ストールマン(レオナルドH.タワージュニアによって転送)(1987年3月22日)。「GNUCコンパイラベータテストリリース」ニュースグループ:  comp.lang.c 2011年10月9日取得
  19. ^ Stallman、Richard M.(2001年6月22日)[1988年に初版]、「GNU CCへの貢献者」GNUコンパイラコレクション(GCC)の使用と移植、Free Software Foundation、Inc.、p。7 、 2015年6月18日取得
  20. ^ Salus、Peter H.(2005)。「第10章SUNとgcc」デーモン、Gnu、ペンギンGroklaw
  21. ^ ガーフィンケル、シムソンL.(1990年8月6日)。「GNUソフトウェアの準備をしなさい」Computerworldp。102。
  22. ^ a b Henkel-Wallace、David(1997年8月15日)、既存のGCCフォークをマージする新しいコンパイラプロジェクト、 2012年5月25日取得
  23. ^ 「GCC開発の短い歴史」www.softpanorama.org 2021年1月24日取得
  24. ^ 「歴史-GCCWiki」gcc.gnu.org 2020年9月28日取得
  25. ^ 「GCC運営委員会-GNUプロジェクト」gcc.gnu.org
  26. ^ 「パッチ]冷気を取り除く」gcc.gnu.org 2010年7月29日取得
  27. ^ 「GNUFortranでサポートされているFortran2003の機能のチャート」GNU 2009年6月25日取得
  28. ^ 「GNUFortranでサポートされているFortran2008の機能のチャート」GNU 2009年6月25日取得
  29. ^ 「GCC4.8リリースシリーズ—変更、新機能、および修正-GNUプロジェクト」gcc.gnu.org
  30. ^ 「GCC5リリースシリーズ—変更、新機能、および修正」gcc.gnu.org
  31. ^ 「GCC8リリースシリーズ—変更、新機能、および修正」gcc.gnu.org
  32. ^ 「SymbianGCC改善プロジェクト」2007年11月8日取得
  33. ^ 「Linuxボードサポートパッケージ」2011年6月7日にオリジナルからアーカイブされました2021年1月24日取得
  34. ^ 「gccをクロスコンパイラとして設定する」ps2stuff2002年6月8日。2008年12月11日のオリジナルからアーカイブ2008年12月12日取得
  35. ^ 「CompileFarm-GCCWiki」gcc.gnu.org
  36. ^ 「sh4g ++ガイド」2002年12月20日にオリジナルからアーカイブされました2008年12月12日取得
  37. ^ 「Linux情報プロジェクト」LINFO 2010年4月27日取得GCCは、60を超えるプラットフォームに移植されています(つまり、実行するように変更されています)。これは、他のどのコンパイラよりも多くなっています。
  38. ^ 「D言語のフロントエンドがついにGCC9にマージされました-Phoronix」phoronix.com 2021年1月19日取得
  39. ^ a b "GCCフロントエンド"gnu.org 2011年11月25日取得
  40. ^ 「GCC5リリースシリーズ—変更、新機能、および修正-GNUプロジェクト」gcc.gnu.org
  41. ^ 「GCC7リリースシリーズ」gnu.org 2018年3月20日取得
  42. ^ 「GCCでのC ++標準のサポート」2021年5月17日取得
  43. ^ 「GCCUPC(GCC Unified Parallel C)」Intrepid Technology、Inc. 2006年2月20日2009年3月11日取得
  44. ^ スペングラー、ブラッド(2021年1月12日)。「OpenSourceSecurity、Inc。がRust用のGCCフロントエンドへの資金提供を発表」
  45. ^ 「セキュリティ機能:コンパイル時バッファチェック(FORTIFY_SOURCE)」fedoraproject.org 2009年3月11日取得
  46. ^ 「GCCを作成するために使用される言語」
  47. ^ 「GCC内部」GCC.org 2010年3月1日取得
  48. ^ 「GCCの前提条件-GNUプロジェクト」gcc.gnu.org 2021年9月5日取得
  49. ^ 「GCCはC ++をある程度許可します–ある程度」H。 _ 2010年6月1日。
  50. ^ 「Re:より多くのユーザーを引き付けるための努力?」lists.gnu.org
  51. ^ 「GCC4.8リリースシリーズ:変更、新機能、および修正」2013年10月4日取得
  52. ^ "ブートストラップ:要件をC ++ 11に更新" 2020年5月18日取得
  53. ^ 「GCC3.4リリースシリーズ—変更、新機能、および修正-GNUプロジェクト」gcc.gnu.org
  54. ^ 「GCC4.1リリースシリーズ—変更、新機能、および修正-GNUプロジェクト」gcc.gnu.org
  55. ^ 「GENERIC(GNUコンパイラコレクション(GCC)内部)」gcc.gnu.org
  56. ^ 「GIMPLE(GNUコンパイラコレクション(GCC)内部)」gcc.gnu.org
  57. ^ 「McCAT」2004年8月12日にオリジナルからアーカイブされました2017年9月14日取得{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  58. ^ 「ローリーヘンドレンのホームページ」www.sable.mcgill.ca
  59. ^ Novillo、Diego(2004年12月)。「ソースからバイナリへ:GCCの内部動作」Red HatMagazine2009年4月1日にオリジナルからアーカイブされました。
  60. ^ 「GCCのインストール:ビルド-GNUプロジェクト」gcc.gnu.org
  61. ^ 「GNUC ++ライブラリ」GNUプロジェクト2021年2月21日取得
  62. ^ 「ライセンス」GNUプロジェクト2021年2月21日取得
  63. ^ 「プラグイン」GCCオンラインドキュメント2013年7月8日取得
  64. ^ Starynkevitch、Basile。「MELTの例によるGCCプラグイン」(PDF)2014年4月10日取得
  65. ^ 「GCCMELTについて」2013年7月4日にオリジナルからアーカイブされました2013年7月8日取得
  66. ^ 「GCCがプラグを抜かれました[LWN.net]」lwn.net
  67. ^ 「TransactionalMemory-GCCWiki」gcc.gnu.org
  68. ^ 「ルイスハイアット-[PATCH] wwwdocs:GCCに追加された拡張識別子のドキュメントサポート」gcc.gnu.org 2020年3月27日取得
  69. ^ 「CおよびC ++の拡張識別子文字の推奨事項」www.open-std.org 2020年3月27日取得
  70. ^ 「C拡張機能(GNUコンパイラコレクション(GCC)を使用)」gcc.gnu.org 2022年1月12日取得
  71. ^ 「Typeof-GNUコンパイラコレクション(GCC)の使用」gcc.gnu.org 2022年1月12日取得
  72. ^ 「オプションの概要(GNUコンパイラコレクション(GCC)を使用)」gcc.gnu.org 2020年8月21日取得
  73. ^ 「六角形プロジェクトWiki」
  74. ^ 「GoogleCodeArchive-Google Code ProjectHostingの長期ストレージ」code.google.com
  75. ^ 「Javaプログラミング言語用のGNUコンパイラ」2007年5月9日にオリジナルからアーカイブされました2010年4月22日取得
  76. ^ グラフ電卓#プログラミング
  77. ^ 「GNUコンパイラコレクションの使用」gnu.org 2019年11月5日取得
  78. ^ 「GCCランタイム例外」FSF 2014年4月10日取得

さらに読む

外部リンク

公式

その他