GNUコンパイラコレクション – ウィキペディア

before-content-x4

GNUコンパイラコレクション
Logo von GNU Compiler Collection
基本データになります
メンテナー リチャード・ビーアー [初め] 、Jakub Jelinek [2]
デベロッパー Gno-Project
公開年 23. 1987年5月 [3]
現行版 12.2 [4]
19. 2022年8月 ))
オペレーティング·システム クロス – プラットフォーム
プログラミング言語 C ++
カテゴリー コンパイラ
ライセンス GNU General Public License、バージョン3、GNU Lesser General Public License、バージョン2.1
gcc.gnu.org

GCC GNUプロジェクトのコンパイラスイートの名前です。 GCC もともとは立っていました GNU Cコンパイラ 。ただし、GCCはC以外のいくつかのプログラミング言語を翻訳できるため、GCCには意味があります。 GNUコンパイラコレクション 保存された(英語 GNUコンパイラコレクション )。コマンド GCC (小さな文字で)Cコンパイラのために続きます。

after-content-x4

このコレクションには、プログラミング言語C、C ++、Objective-C、D、Fortran、ADA、およびGO用のコンパイラが含まれています。 GNU一般公開ライセンスの条件の対象となります。

GCCは、多くのLinux分布、BSDバリアント、NextStep、BEOS、ZETAなど、多くのシステムで標準コンパイラとして使用されています。彼はまた、ランニングタイム環境Cygwinと開発者ツールMingwのサポートを提供しています。 [5] 他のどのコンパイラよりも多くのシステムとコンピューターアーキテクチャに移植されており、特にさまざまなハードウェアプラットフォームで実行されるはずのオペレーティングシステムに適しています。 GCCは、クロスコンパイラとしてインストールすることもできます。 [6]

2014年、彼はACM Sigplanからプログラミング言語ソフトウェア賞を受賞しました。

GCCの最初の公開バージョン(0.9)は、1987年3月22日にリチャードストールマンによるものでした [7] [8] GNUプロジェクトのためにリリースされ(バージョン1.0は同じ年の5月23日にリリースされました)、現在世界中のプログラマーによって開発されています。コンパイラコレクションへのCコンパイラパッケージは、GCCと並行してしばらく存在し、最終的に公式のGCCになりました。

EGCS [ 編集 | ソーステキストを編集します ]

1997年にプロジェクトが分裂しました 実験/強化されたGNUコンパイラシステム EGCS 、Engl。ために 実験/改良されたGNUコンパイラシステム )GCCから、1999年に再会しました。 [9]

GCC 1.xは1991年に特定の安定性を達成しましたが、建築関連の制限により多くの改善が妨げられたため、Free Software Foundation(FSF)がGCC 2.xを開発し始めました。しかし、1990年代半ばには、FSFはGCC 2.xに追加できるものとそうでないものを非常に慎重に制御したため、GCCはエリックS.レイモンドが彼の本の中で大聖堂と巣を説明する「大聖堂」開発モデルの例として使用されました。

after-content-x4

GCCはフリーソフトウェアであるため、独自のスプリットを開発するために別の方向に作業したいプログラマーです。しかし、多くの分割は非効率的で混乱していることが判明しました。多くの開発者は、多くの開発者に、公式のGCCプロジェクトからの仕事が受け入れられていないか、困難の下でのみ受け入れられていないことに不満を感じました。

したがって、開発者のグループは1997 EGCSを設立し、単一のプロジェクトでいくつかの実験的なスプリットオフを組み合わせました。これには、G77(FORTRAN)、PGCC(Pentium-Optimized GCC)、C ++への多くの改善のインストール、およびさらにプロセッサアーキテクチャとオペレーティングシステムのコンパイラバージョンが含まれます。

EGCの開発は、GCCプロジェクトの開発よりも速く、より活気があり、全体的に優れていることが判明したため、1999年のFSFはGCC 2.xのさらなる開発を公式に停止し、代わりにEGCを公式GCCバージョンとして引き継ぎました。 EGCS開発者はプロジェクトマネージャーになりました。 メンテナー )GCCの。それ以降、このプロジェクトは「バザール」モデルに従って明示的に開発されましたが、「大聖堂」モデルに従っていなくなりました。 1999年7月にGCC 2.95の出版により、両方のプロジェクトが再会しました。

GCCプロジェクトでは、一部のプラットフォームはプライマリとして、他のプラットフォームを二次評価プラットフォームとして公式に説明しています。新しいバージョンの各公開の前に、これら2つのグループが特にテストされています。 GCCは、次の指揮セットのプログラムを作成できます(プライマリおよびセカンダリ評価プラットフォームがマークされています):

さらに、埋め込まれたシステム用のプロセッサのアーキテクチャが多数あります。

公式のGCCの一部ではありませんが、派生物はそれの誘導体であり、商業的に駆動されます。

  • ATMEL AVR32
  • Infineon C167
  • Infineon Tricore
  • Microchip PIC24、DSPIC(Cでのみ)およびPIC32(C ++でも)

全体として、GCCは60を超えるプラットフォームをサポートしています。 [十]

GCCの外部インターフェイスは、標準のUNIXコンパイラの外部インターフェイスに対応しています。

  1. ユーザーは、名前のメインプログラムを呼び出します GCC の上。
  2. GCCはコマンドライン引数を解釈します。
  3. GCCは、現在の入力ファイルのプログラミング言語を決定します。
  4. 対応する言語コンパイラが呼び出されます。
  5. 出力はアセンブラーに引き渡されます。
  6. 最後に左が呼ばれます。
  7. 完全、d。 H.ランニングプログラムが作成されました。

各言語コンパイラは、ソースコードを受け入れ、アセンブラー言語を生成する個別のプログラムです。右側のスキームでは、両方とも前処理を受ける必要があるCとアセンブラーの例は、純粋なCコードまたはアセンブラーを取得するために、Compilermakros、統合ヘッダーファイルなどで変換されます。その言語依存のフロントエンドは、対応する言語をパートし、GCCSのツリーをバックエンドに引き渡す抽象的な構文ツリーを作成します 転送言語を登録します (RTL) 転送(図には示されていません)、さまざまなコード最適化を実行し、最後にアセンブラー言語を生成します。

GCCのほとんどのコンポーネントは、もともとCで書かれていました。プロジェクトの一部として「CXXのGCC」 [11] GCCソースのC ++への変更は2010年に計画され、開始されました。この変更の目的は、GCCを理解しやすく、待っていることです。後継プロジェクトで [12番目] GCC建設プロセスのまだ欠落しているレベル1もC ++コードに切り替えられました。 [13] 例外は、主にRTLで定式化されているバックエンドと、主にADAで記述されているADAフロントエンドです。

フロントエンド [ 編集 | ソーステキストを編集します ]

フロントエンドは、バックエンドで処理できる木を生産する必要があります。これをどのように達成するかはあなた次第です。一部のパーサーはYACCのような文法を使用し、他のパーサーは手書きの再帰パーサーを使用しています。

最近まで、プログラムのツリー表現は、ターゲットプロセッサとは完全に独立していませんでした。ツリーの重要性は異なる言語フロントエンドで異なる場合があり、フロントエンドは独自のツリーコードを提供することができました。

GCC 4.0バージョンに統合されたTree SSAプロジェクトにより、2つの新しい形式の言語に依存しないツリーが導入されました。これらの新しいツリー形式はそうでした ジェネリック ギンプル 洗礼を受けた。一時的な言語依存ツリーを汎用に変換することにより、解析が行われています。いわゆる「Gimplifier」は、この複雑な形状をSSAベースのギンプルシェイプに転送し、そこから多くの新しい言語と建築に依存しない最適化を実行できます。

ミドルダック [ 編集 | ソーステキストを編集します ]

木の最適化は、言語に依存せず、解析を含んでいないため、「フロントエンド」と「バックエンド」のスキームに実際には適合しません。したがって、GCC開発者は、コンパイラのこの部分に「MiddleEnd」という名前を与えました。 SSAツリーで現在実行されている最適化には含まれます 死んだコードの除去 部分的な冗長性の除去 グローバルバリュー番号 まばらな条件付き一定の伝播 凝集体のスカラー置換 自動ベクトル化などの配列ベースの最適化。 [14]

バックエンド [ 編集 | ソーステキストを編集します ]

GCCバックエンドの動作は、プレコセッサマクロとアーキテクチャ固有の関数によって部分的に決定されます。たとえば、最終的なマンネス、ワードサイズ、およびコールコンベンションが定義され、ターゲットマシンの登録構造が記載されています。 LISPのような説明言語であるマシンの説明を使用して、GCCは内部ツリー構造をRTLディスプレイに変換します。これは名前に基づいていますが、抽象的な指示のシーケンスはすでに宛先に適合しています。

RTLでGCCが実行する最適化の種類と数は、各コンパイラバージョンでさらに開発されています。それらが含まれます (グローバル)共通のサブエクスペッション除去 、さまざまなループとジャンプの最適化( 英語 変換、分岐確率推定、兄弟コール、一定の伝播 、… )と同様に パスを組み合わせます 、いくつかの指示を単一の指示に結合することができます。

Gimple TreesでグローバルなSSAベースの最適化が導入されて以来、RTLの最適化は重要性がわずかに失われています。これは、プログラムのRTL表現には多くの最適化にとって重要な高レベルの情報がはるかに少ないためです。ただし、機械依存の最適化も非常に重要です。たとえば、マシンに関する多くの最適化が利用可能でなければならないため、たとえば、マシンが知っている命令、ターゲットアーキテクチャのパイプラインの取得方法などです。

「リロード」フェーズでは、無制限の数の抽象化された擬似レジスタの原則は、たとえば、機能のスタックに擬似登録の関数を保存するために、ここで新しい指示をここでコードに挿入する必要がある場合があります。この登録分布は、それぞれのターゲットアーキテクチャの異なる特性を考慮する必要があるため、非常に複雑です。

最後の段階では、最適化が実行されます。 覗き穴の最適化 スロットスケジューリングを遅らせます 、RTLベースの機械的拡張がアセンブリコードに表示される前に、命令を指定する文字チェーンのレジスタとアドレスの名前を実装することにより。

  1. gcc.gnu.org (2022年5月27日にアクセス)。
  2. github.com
  3. www.gnu.org
  4. リチャード・ビーナー: GCC 12.2がリリースされました 2022年8月19日(2022年8月19日アクセス)。
  5. Jens Ihlenfeld: コンパイラGCC 4.5.1公開。 Golem.de、2。2010年8月、 2015年4月27日にアクセス
  6. ニコラウスの学生: GCCコンパイラオーバービューと操作 。第1版。 BHV、Kaarst 1997、pp。28。ISBN 3-89360-873-7
  7. GNU Cコンパイラベータテストリリース – メッセージ Googleグループ 、1987年3月22日から2017年3月1日にアクセス(英語)。
  8. アレクサンダー・ノイマン: GCC 4.7および25年のGNUコンパイラコレクション。 heise.de、2012年3月22日、 2012年3月24日にアクセス
  9. GCC FAQ:GCCとEGCの関係は何ですか? の: gnu.ist.utl.pt. 21. 2006年6月、 2022年6月2日にアクセス (英語)。
  10. GCCのホスト/ターゲット固有のインストールメモ の: gnu.org 、2006年2月23日。
  11. GCC wiki-gcc-in-cxx。 の: https://gcc.gnu.org GNU ORG、6。2012年4月、 2022年5月4日にアクセス (英語)。
  12. cxx -conversion -gcc wiki。 の: https://gcc.gnu.org/ 2012年12月11日、 2022年5月4日にアクセス (英語)。
  13. Thorsten Leemhuis: GCCはC ++で内部的に増加します。 heise.de、16。2012年8月、 2015年4月26日に取得
  14. GCCの自動制定 。 gcc.gnu.org、2021年7月25日にアクセス(英語)。
after-content-x4