73551


C言語などのプログラミングにはGCCなどのコンパイラが必要ですよね。ですが、そもそもの話、コンパイラというプログラムを作るためにコンパイラが必要になるわけで、ここにパラドックスが生じてしまいます。

コンパイラをコンパイルするためのコンパイラはどのようにして開発されたのですか？
すべての源となるコンパイラはアセンブリ言語やマシン語で開発されたのでしょうか？


CC BY-SA 4.0
2021-01-24T10:28:39.667
73546
2021-01-25T23:20:28.097
43413
question
c++ c gcc
C言語などのコンパイラはどのようにしてコンパイルされたのですか？


アセンブラで開発されます  
そして、その言語でコンパイラを作り、アセンブラで開発されたコンパイラに掛け、次のバージョンのコンパイラが生成されます。  
そして、その言語でそのまた次のバージョンを組み、そのコンパイラにかけて、、、と繰り返していきます

そうやっていまのGCCができました


CC BY-SA 4.0
2021-01-24T23:08:02.053
73549
2021-01-24T23:08:02.053
27481
73546
answer


## GCCについて

GCC登場以前からCコンパイラーは存在していました。そのため、GCCは既存のCコンパイラーを使ってコンパイルされることを前提に設計されています。例えばビルド方法も

  1. stage1: 既存のCコンパイラーでGCCをビルドする  
既存のCコンパイラーがコード生成したGCC

  2. stage2: stage1のGCCでGCCをビルドする  
既存のCコンパイラーがコード生成したGCCがコード生成したGCC

  3. stage3: stage2のGCCでGCCをビルドする  
完全にGCCのみでコード生成したGCC

と３回ビルドを行い、最終的にstage3のGCCが使われます。

## クロスコンパイル

そうはいっても既存のCコンパイラーが存在しない環境ではどう作るのかというと、クロスコンパイルという技術があります。別のプラットフォームのCコンパイラーでビルドを行いコード生成します。

  * ホスト： コンパイラーが動作する環境
  * ターゲット： 実行ファイルを作成したい環境

と呼び、ホスト上でターゲット向け実行ファイルを生成できるクロスコンパイラーを用意します。

## 最初の１つ

C言語は[UNIX](https://ja.wikipedia.org/wiki/UNIX)を記述するために設計されました。

> 当初はアセンブリ言語のみで開発されたが、1973年にほぼ全体をC言語で書き直した。

とも説明されています。UNIXでは小さなツールを組み合わせて構築されますがCコンパイラーも例外ではなく`cc`は次のツールを呼び出すことで成り立っています。

  * `cpp`; Cプリプロセッサー。`.c`ソースファイルから`#include`、`#define`などのプリプロセッサディレクティブを処理し`.i`ファイルを生成する。
  * `cc1`; 狭義のCコンパイラー。`.i`ファイルをコンパイルし、`.s`アセンブリソースを生成する。
  * `as`; アセンブラー。`.s`ファイルから`.o`オブジェクトファイルを生成する。
  * `ar`; アーカイバー。複数の`.o`ファイルをまとめて`.a`ライブラリファイルを生成する。
  * `ld`; リンカー。複数の`.o`ファイルと`.a`ファイルをまとめて実行ファイルを生成する。

UNIX OS全てをC言語で書き直すプロジェクトにおいて、Cコンパイラーもその一部でしかなく、一緒に書き直されたのかな、と想像しています。

## C++

C++コンパイラーも大きなものですが、C++コンパイラーの元祖[Cfront](https://ja.wikipedia.org/wiki/Cfront)はC++ソースからCソースへ変換するツールだったりします。


CC BY-SA 4.0
2021-01-24T23:09:42.923
73551
2021-01-24T23:09:42.923
4236
73546
answer


C言語はベル研究所で開発されました。  
以下のページにはその歴史がDennis M. Ritchie氏によって記述されています。

<https://www.bell-labs.com/usr/dmr/www/chist.html>

BCPL => B言語 => C言語 の順で作られたようですが、並走で使われていたようです。  
そして、コンピューター側の発展も関連しているようです。つまり、ある言語が稼働するには、それが可能な性能を持つコンピュータが必要とのことでしょう。  
あたりまえの事ですが、新しい物はすべからくその時あるものから生み出されるということです。


CC BY-SA 4.0
2021-01-24T23:23:17.580
73552
2021-01-24T23:23:17.580
3793
73546
answer


この話題には、コンパイラの **ブートストラップ問題** という名前が付いています

  * [https://ja.wikipedia.org/wiki/ブートストラップ問題](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%83%88%E3%82%B9%E3%83%88%E3%83%A9%E3%83%83%E3%83%97%E5%95%8F%E9%A1%8C)

本当の本当に最初にはその計算機が理解できる言葉、いわゆる **マシン語** で実装することになります。また、アセンブラが実装済みであれば **アセンブリ**
で実装できます。

別の計算機でコンパイラが実装済みであれば、クロスコンパイラも実装することによって実装できます。

また、その計算機において別の言語のコンパイラが実装済みであれば、その別の言語でコンパイラを実装することによって実装できます。

更には、コンパイラが自分自身をコンパイルできるようにするところまで実装できる場合もあり、これをコンパイラの **セルフホスティング** と言います。

  * [https://ja.wikipedia.org/wiki/セルフホスティング](https://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)


CC BY-SA 4.0
2021-01-25T04:27:48.620
73557
2021-01-25T23:20:28.097
2021-01-25T23:20:28.097
19110
19110
73546
answer