GCCはコンパイラですか、それともコンパイルプロセス用のツールのコレクションですか?
私はGNUとGCCに不慣れです、私の質問がばかげているように聞こえたら申し訳ありません。
GCCはGNUコンパイラコレクションの略であることがわかっているので、gccは(コンパイラコレクションからの)単なるコンパイラだと思います。
しかし、gccは、プリプロセッサ(cpp)、コンパイラ(cc1)、アセンブラ(as)、およびリンカー(ld)を含むコンパイラドライバであることも読みました。
したがって、GCCはコンパイラではないように見えますが、なぜwikiは次のように述べています。
「GCCはGNUツールチェーンの重要なコンポーネントであり、GNUとLinuxに関連するほとんどのプロジェクトの標準コンパイラです。」
そして、「1」はcc1で何を意味し、なぜcc2、cc3などではなくcc1と呼ばれるのでしょうか。
回答
ほとんどの場合、(少し不正確に)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つの良い推測は、コンパイルの最初のフェーズを表すということです。しかし、良い情報源は見つかりませんでした。