GCCはコンパイラですか、それともコンパイルプロセス用のツールのコレクションですか?

Aug 24 2020

私はGNUとGCCに不慣れです、私の質問がばかげているように聞こえたら申し訳ありません。

GCCはGNUコンパイラコレクションの略であることがわかっているので、gccは(コンパイラコレクションからの)単なるコンパイラだと思います。

しかし、gccは、プリプロセッサ(cpp)、コンパイラ(cc1)、アセンブラ(as)、およびリンカー(ld)を含むコンパイラドライバであることも読みました。

したがって、GCCはコンパイラではないように見えますが、なぜwikiは次のように述べています。

「GCCはGNUツールチェーンの重要なコンポーネントであり、GNUとLinuxに関連するほとんどのプロジェクトの標準コンパイラです。」

そして、「1」はcc1で何を意味し、なぜcc2、cc3などではなくcc1と呼ばれるのでしょうか。

回答

2 klutt Aug 24 2020 at 19:58

ほとんどの場合、(少し不正確に)gccをコンパイラーと呼びます。その理由は、少なくとも単純なプロジェクトでは、単一のgccコマンドでツールチェーン全体を実行できるためです。あなたがこれを持っているとしましょうmain.c

// main.c
#include <stdio.h>
int main(void)
{
    printf("Hello, world!\n");
}

でコンパイルします

gcc main.c

次に、cpp、cc1、as、およびldのすべてが、実行可能ファイルa.outの作成に関与します。よくほとんど。cppは古く、新しいバージョンのコンパイラにはプリプロセッサが統合されています。

プリプロセッサの出力を確認したい場合は、 gcc -E main.c

先ほど申し上げたように、最近はプリプロセッサとコンパイラが統合されているのでcc1、プリプロセッサなしでは実際に実行することはできません。ただし、を使用してアセンブリファイルを生成するgcc -S main.cと、が生成されmain.sます。gcc -c main.sそれを生成するオブジェクトファイルにアセンブルしmain.o、それをリンクしgcc main.oて最終的な生成を行うことができますa.out

https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/GCC/cc1/index (エンファシスマイン)

cc1は、適切なコンパイラとも呼ばれます。

cc1は、ac変換ユニットを前処理し、アセンブリコードにコンパイルします。アセンブリコードは、アセンブラでオブジェクトファイルに変換されます。

以前のバージョンのcc1は、前処理段階で/ usr / bin / cppを使用していました。

https://renenyffenegger.ch/notes/Linux/fhs/usr/bin/cpp (エンファシスマイン)

プリプロセッサ。

cppはc ++と混同されません。

プリプロセッサは次のようなものに関係しています

  • マクロ展開
  • コメントを削除する
  • トリグラフ変換
  • エスケープされた改行スプライシング
  • ディレクティブの処理

新しいバージョンのgccは、変換ユニットを前処理するために/ usr / bin / cppを直接呼び出しません。むしろ、前処理はコンパイラーの適切なcc1によって実行されます。

私はこれをこれの複製とほぼ見なしますが、クロスサイト複製を作成することは不可能です。cc1とgccの関係は?

関連:Cプログラムの「コンパイラー固有」コマンド

そして、「1」はcc1で何を意味し、なぜcc2、cc3などではなくcc1と呼ばれるのでしょうか。

わからない。私の最初の推測では、ccUnix(Linuxを除く)システムの標準コンパイラである1が追加されたばかりでした。ほとんどのLinuxシステムでccは、はへの単なるリンクgccです。しかし、もう1つの良い推測は、コンパイルの最初のフェーズを表すということです。しかし、良い情報源は見つかりませんでした。