質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

コンパイラのコンパイラ

解決済

回答 6

投稿

  • 評価
  • クリップ 4
  • VIEW 2,060

strike1217

score 577

一番最初にC言語の開発をした人はどうやってコンパイラを用意したのでしょうか??

gccはC言語でできていると思います。
makeによってコンパイラであるgccをコンパイルすることができると思いますが、makeもC言語でできているんでしょうか?
その場合、makeをコンパイルするためのコンパイラがまた必要になりますよね?
永遠に終わらないんですが・・・

一度作ってしまえば、使い回しができそうですが、最初にコンパイラをどのようにして作り上げたのでしょうか?
アセンブリ言語でひたすら書くんでしょうか?

make - デバイスドライバのコンパイルやカーネルのコンパイルに使われる。
gcc - ユーザーアプリケーションのコンパイルに使われる。

2つの違いがよく分かりません。なんでgccではデバイスドライバのコンパイルができないのでしょうか?
コンパイラにも種類があるということですよね?

わかる方教えてください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

checkベストアンサー

+8

最初のコンパイラをどうやって作るか

これはブートストラップ問題と呼ばれるように、著名な問題です。

C言語の場合は、アセンブラあるいは機械語で作っていたのだと思います(現代でも、インラインアセンブラが生き残っているように、C言語と機械語の境界線は思うほどは高くありません)。

最初のLISPコンパイラは、「先にインタプリタがあった」ので、LISPコンパイラをインタプリタ上で実行することで問題なくコンパイラを動かせたそうです。

makeとgccの違い

make自体はプログラム作成を行うのではなく、「どのファイルをどのように処理するか」を制御するための管理ツールです。makeからCコンパイラやリンカなどを呼び出して、プログラム全体を構築していきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/26 22:57

    ブートストラップ問題と言うんですか!!
    初めて知りました!

    makeから呼ばれているC用のコンパイラはなんですか?gccですか?

    キャンセル

  • 2017/08/26 23:00

    Makefileや環境変数で設定します。

    よく、Unix系ソフトウェアのインストールで「./configure」を実行しますが、これは環境にあるCコンパイラやライブラリの状況をチェックして、適切なMakefileを作るためのシェルスクリプトです。

    キャンセル

  • 2017/08/26 23:01

    make自体は言語は選ばないんじゃないですかね。gnu makeでdmd(D言語)を使ってビルドしているものもありました。

    キャンセル

  • 2017/08/26 23:04

    なるほど!makeの仕組みがわかりました!

    コンパイラをアセンブリ言語で作るってかなり大変なのでは?
    昔の人にとってはそうでもないんですかね?

    キャンセル

+5

解決済みですが、ちょっと補足を。

一度作ってしまえば、使い回しができそうですが、最初にコンパイラをどのようにして作り上げたのでしょうか?
アセンブリ言語でひたすら書くんでしょうか?

この辺を読むと、どうやら同じ言語で最初から最後まで開発することを想定しているようですが、そうとは限りません。

例えば、C言語のコンパイラを作る場合、

1.C言語の文法すべてを実装せずに、一部の文法だけを実装する。
(例えば、整数しか扱えない、制御構文はifとgotoだけなど)
2.上記1で作ったコンパイラを使って、1と同じ文法のコンパイラを実装する。
3.上記2で作ったコンパイラを使って、もう少しだけ文法を拡張したコンパイラを実装する。
4.上記3で作ったコンパイラを使って、さらにもう少しだけ文法を拡張したコンパイラを実装する。
5.以下、繰り返し

のような手法が取られることがあるようです。

他の高級言語が存在せずアセンブラしかない場合には、このような手法で開発していくのが現実的かと思います。

蛇足:
ちなみに手順2と手順3の違いは、手順2の時点ではアセンブリ言語で書かれたソースコードしかないのに対して、手順3の時には(手順2で作った)サブセットの言語で書かれたソースコードがある点。
なので手順3のときには手順2で書かれたソースコードを拡張するだけなので楽。手順4以降も同様。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/29 18:50

    なるほど!
    分かりやすいです!!

    キャンセル

+3

デニス・リッチー自身が書いたC言語誕生の歴史が以下にあります

The Development of the C Language (Dennis M. Ritchie)
The Evolution of the Unix Time-sharing System (Dennis M. Ritchie)

  • C言語コンパイラはB言語コンパイラで作成された(C言語は当初New Bと呼ばれていた)
  • C言語を作るのに用いたB言語コンパイラは、B言語自身で記述されたもの
  • 最初のB言語コンパイラはTMGという言語で作成された

使用したTMGコンパイラが何で作られたかは明確に書かれていませんが、TMG登場以前のUnix上のプログラムは全てアセンブラで書かれていたとあるので、最初はアセンブラで作成されたはず

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/26 23:51

    アセンブリ→TMG→B言語→C言語という順番なのですね。
    別の言語を使って別の言語のコンパイラを作る以外に方法が無さそうですね。

    キャンセル

+2

こんにちは。

一度作ってしまえば、使い回しができそうですが、最初にコンパイラをどのようにして作り上げたのでしょうか?
アセンブリ言語でひたすら書くんでしょうか?

最初のアセンブラを開発した人は、機械語でアセンブラを開発した筈です。
8進数でパチパチやって入力しつつ開発した筈です。そして、そのアセンブラがあれば、アセンブラでコンパイラを記述できるのでかなり楽できます。

こんな動画があります。マイクロソフト社のビル・ゲイツさんが開発したと言われる4KBasicを紙テープから読み込んで起動する動画です。
ビル・ゲイツさんももしかするとこのようにしてパチパチやりながら4KBasicを開発したのかも知れません。ちなみに、4Kは4KBytesの4Kです。

make - デバイスドライバのコンパイルやカーネルのコンパイルに使われる。
gcc - ユーザーアプリケーションのコンパイルに使われる。
2つの違いがよく分かりません。

makeはコンパイラではないですよ。コンパイルやリンク処理を自動化するツールです。
毎回全てのソースをコンパイルしていたら、巨大プロジェクトは地獄を見ます。ビルドするのに一晩かかるようなものもありますから。ちょっとソース修正するたびに一晩とか有り得ないです。
ソースとオブジェクトの依存関係を管理し、修正したソースに依存しているオブジェクトのみをコンパイル/リンクすると効率良く開発できます。その処理を自動化するのがmakeです。

なんでgccではデバイスドライバのコンパイルができないのでしょうか?

linuxはgccでコンパイルされてますよ。デバイスドライバも普通にコンパイルできます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/26 23:16

    ほお。
    やはりアセンブリ言語で作り上げたんですね!
    わかりました。

    キャンセル

  • 2017/08/26 23:21

    あら、デバイスドライバもgccでコンパイルできるんですか?
    すいません。確認しますね。

    キャンセル

  • 2017/08/26 23:27

    モジュールコンパイル用のオプションを忘れていました。
    ありがとうございます。

    キャンセル

+1

プログラム言語年表

プログラムの歴史としてC言語が最初じゃないのです。

機械語やアセンブリ言語で書かれたんでしょうね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/26 22:58

    アセンブリ言語でコンパイラを作るってとてつもなく大変ですね!

    キャンセル

+1

ブートストラップ問題を読んだらだいたいイメージ出来るんじゃないでしょうか。

言語 X のインタプリタかコンパイラを言語 Y で実装する。ニクラウス・ヴィルトは、最初のPascalコンパイラをFORTRANで書いたとされている。

と言うやつです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる