GCCとClangの類似点と相違点

GCC:GNU(Gnu's Not Unix)コンパイラコレクション(GNUコンパイラコレクション、GCC)は、プログラミング言語コンパイラのセット、GPLおよびLGPLライセンスの下で発行されたフリーソフトウェアを指し、GNUプロジェクトおよびGNUの重要な部分でもあります。ツールチェーン主要コンポーネントの1つ。GCC(特にC言語コンパイラ)は、クロスプラットフォームコンパイラの事実上の標準と見なされることがよくあります。1985年にRichardMatthew Stallmanによって開発され、現在はFree SoftwareFoundationによって保守されています。GCCは元々Cで開発されました。その後、LLVMとClangの台頭により、開発言語をより迅速にC ++に変換しました。

GCCでサポートされている言語:元々はC言語しか処理できないため、元々はGNU Cコンパイラ(GNU Cコンパイラ)と呼ばれていました。GCCはリリース後すぐに拡張され、C ++を処理できるようになりました。その後、Fortran、Pascal、Objective-C、Java、Ada、Go、その他の言語も処理できます。

LinuxやBSDファミリなど、多くのUnixライクなシステムを含む多くのオペレーティングシステムは、GCCを標準コンパイラとして使用しています。AppleコンピュータにプリインストールされているMacOSXオペレーティングシステムもこのコンパイラを使用します。

GCCは現在、世界中のプログラマーのいくつかのグループによって保守されています。最も中央処理装置のアーキテクチャーとほとんどのオペレーティングシステムに移植されているのはコンパイラーです。GCCはGNUシステム(GNU / Linuxファミリーを含む)の公式コンパイラーになっているため、BSDファミリー、Mac OS X、NeXTSTEP、BeOSなどの他のオペレーティングシステムをコンパイルおよび作成するためのメインコンパイラーにもなっています。

GCCは通常、クロスプラットフォームソフトウェアに最適なコンパイラです。一般に特定のシステムや動作環境に限定されるコンパイラとは異なり、GCCはすべてのプラットフォームで同じフロントエンド処理プログラムを使用して同じ中間コードを生成します。したがって、この中間コードは他のプラットフォームでGCCを使用してコンパイルされます。これは非常に重要です。正しい出力プログラムを取得するチャンス。

GCCでサポートされている主なプロセッサアーキテクチャ:ARM、x86、x86-64、MIPS、PowerPCなど。

        GCC構造GCCの外部インターフェースは標準のUnixコンパイラのように見えます。ユーザーは、コマンドラインにgccプログラム名といくつかのコマンドパラメーターを入力して、各入力ファイルで使用される個々の言語コンパイラーを決定し、出力コードにこのハードウェアプラットフォームに適したアセンブリ言語コンパイラーを使用して、リンクを選択的に実行します。実行可能プログラム。各言語コンパイラは独立したプログラムであり、入力ソースコードと出力アセンブリ言語コードを処理できます。すべての言語コンパイラには共通の中間アーキテクチャがあります。フロントエンドはこの言語に一致するソースコードを解析して抽象構文ツリーを生成し、この構文ツリーの翻訳はGCCのレジスタ変換言語のバックエンドになります。この段階で、コンパイラの最適化と静的コード分析の手法がコードに適用されます。最後に、このハードウェアアーキテクチャに適したアセンブリ言語コードは、JackDavidsonとChrisFraserによって発明されたアルゴリズムによって生成されます。

Adaフロントエンドを除いて、ほとんどすべてのGCCはC / C ++で記述されており、そのほとんどはAdaで記述されています。

        Clang:は、C、C ++、Objective-C、Objective-C ++プログラミング言語用のコンパイラフロントエンドです基盤となる仮想マシン(LLVM)をバックエンドとして使用します。その目標は、GNUコンパイラスイート(GCC)に代わるものを提供することです。著者はChrisLattner(Chris Lattner)であり、開発はAppleの支援を受けており、ソースコードの承認は、イリノイ大学アーバナシャンペーン校のBSDのようなオープンソースライセンスの使用です。Clangは主にC ++で書かれています。

Clangプロジェクトには、ClangフロントエンドとClang静的アナライザーが含まれています。このソフトウェアプロジェクトは、2005年にApple Computerによって開始され、LLVM(Low Level Virtual Machine)コンパイラツールセットのフロントエンドです。目的は、コードに対応する抽象構文ツリー(Abstract Syntax Tree、AST)を出力することです。コードはLLVMビットコードにコンパイルされます。次に、バックエンドでLLVMを使用して、プラットフォーム固有の機械語にコンパイルします。

Clang自体は優れたパフォーマンスを発揮し、Clangによって生成されるASTによって消費されるメモリはGCCの約20%にすぎません。2014年1月にリリースされたFreeBSD10.0バージョンは、デフォルトのコンパイラとしてClang / LLVMを使用します。

        Clangのパフォーマンス:このテストは、ClangがObjective-CコードをGCCの3倍の速度でコンパイルすることを証明し、ユーザーのコンパイルエラーを正確に示唆することもできます。

        GCCとClangの違い

        GCCの機能:C / C ++ / Objective-C / Objective-C ++言語のサポートに加えて、Java / Ada / Fortran / Goなどもサポートしています。現在のClangC ++のサポートはGCCに遅れをとっています。より多くのプラットフォームをサポートしています。より人気があり、広く使用されている、サポートが完了しています。

        Clangの機能:コンパイル速度が速い、メモリフットプリントが小さい、GCCと互換性がある、明確でシンプルなデザイン、理解しやすい、拡張と拡張が簡単、ライブラリに基づくモジュラーデザイン、IDE統合が簡単、エラープロンプトがわかりやすい

        Clangが使用するライセンスはBSDであり、GCCはGPLv3です。

        それらは異なるマクロを使用します

        (1)GCCで定義されているマクロは次のとおりです。

 

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
__GNUG__


 (2)GCCで定義されたマクロのサポートに加えて、Clangは以下も定義します。

__clang__
__clang_major__
__clang_minor__
__clang_patchlevel__

 ​​​​​​​

Clang vs GCC(GNUコンパイラコレクション):

GCCとclangの長所:

(1)、GCCは、Java、Ada、FORTRAN、Goなど、clangが目的としない言語をサポートしています。

(2)、GCCはLLVMよりも多くのターゲットをサポートします。

(3)、GCCは多くの言語拡張をサポートしており、その一部はClangによって実装されていません。たとえば、Cモードでは、GCCはネストされた関数をサポートし、構造体でVLAを許可する拡張機能を備えています。

clangvs GCCのプロ:

(1)、Clang ASTとデザインは、関連する言語に精通し、コンパイラーの動作の基本を理解している人なら誰でも簡単に理解できるように設計されています。GCCには非常に古いコードベースがあり、新しい開発者に急な学習曲線を提示します。

(2)、Clangは当初からAPIとして設計されており、ソース分析ツール、リファクタリング、IDE(など)やコード生成で再利用できます。GCCはモノリシック静的コンパイラとして構築されているため、APIとして使用したり他のツールに統合したりすることは非常に困難です。さらに、その歴史的な設計と現在のポリシーにより、フロントエンドをコンパイラの他の部分から切り離すことは困難です。

(3)、さまざまなGCC設計上の決定により、再利用が非常に困難になります。ビルドシステムの変更が難しく、複数のターゲットを1つのバイナリにリンクできず、複数のフロントエンドを1つのバイナリにリンクできません。カスタムガベージコレクターは、グローバル変数を広範囲に使用し、再入可能またはマルチ読み取り可能ではありません。Clangにはこれらの問題はありません。

(4)、Clangは、GCCのようにコードを解析するため、暗黙的にコードを単純化することはありません。これを行うと、ソース分析ツールに多くの問題が発生します。簡単な例として、ソースコードに「xx」と書くと、GCCASTには「x」が含まれずに「0」が含まれます。これは、「x」の名前を変更したいリファクタリングツールにとっては非常に悪いことです。

(5)、ClangはASTをディスクにシリアル化して別のプログラムに読み戻すことができるため、プログラム全体の分析に役立ちます。GCCにはこれがありません。GCCのPCHメカニズム(コンパイラメモリイメージの単なるダンプ)は関連していますが、アーキテクチャ的には、ダンプを生成したものとまったく同じ実行可能ファイルに読み戻すことしかできません(構造化された形式ではありません)。

(6)、ClangはGCCよりもはるかに高速で、使用するメモリもはるかに少なくなります。

(7)、Clangは最初から非常に明確で簡潔な診断(エラーおよび警告メッセージ)を提供するように設計されており、表現力豊かな診断のサポートが含まれています。GCCの最新バージョンは、この分野で大幅な進歩を遂げ、次のようなさまざまなClang機能が組み込まれています。診断でtypedefを保持し、マクロ展開を表示しますが、GCCはまだ追いついてきています。

(8)、GCCはGPLライセンスの下でライセンスされています。clangはBSDライセンスを使用しているため、GPLライセンスではないソフトウェアに組み込むことができます。

(9)、Clangは、LLVMをバックエンドとして使用することで、中間コードのバイトコード表現のサポート、プラグ可能なオプティマイザー、リンク時最適化のサポート、ジャストインタイムコンパイル、複数のリンク機能など、多くの機能を継承しています。コードジェネレーターなど

(10)、ClangのC ++のサポートは、多くの点でGCCのサポートよりも準拠しています。

(11)、Clangは多くの言語拡張をサポートしており、その一部はGCCによって実装されていません。たとえば、Clangは、スレッドセーフと拡張ベクトルタイプをチェックするための属性を提供します。

 

おすすめ

転載: blog.csdn.net/wu347771769/article/details/82775665