一番最初にC言語の開発をした人はどうやってコンパイラを用意したのでしょうか??
gccはC言語でできていると思います。
makeによってコンパイラであるgccをコンパイルすることができると思いますが、makeもC言語でできているんでしょうか?
その場合、makeをコンパイルするためのコンパイラがまた必要になりますよね?
永遠に終わらないんですが・・・
一度作ってしまえば、使い回しができそうですが、最初にコンパイラをどのようにして作り上げたのでしょうか?
アセンブリ言語でひたすら書くんでしょうか?
make - デバイスドライバのコンパイルやカーネルのコンパイルに使われる。
gcc - ユーザーアプリケーションのコンパイルに使われる。
2つの違いがよく分かりません。なんでgccではデバイスドライバのコンパイルができないのでしょうか?
コンパイラにも種類があるということですよね?
わかる方教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
最初のコンパイラをどうやって作るか
これはブートストラップ問題と呼ばれるように、著名な問題です。
C言語の場合は、アセンブラあるいは機械語で作っていたのだと思います(現代でも、インラインアセンブラが生き残っているように、C言語と機械語の境界線は思うほどは高くありません)。
最初のLISPコンパイラは、「先にインタプリタがあった」ので、LISPコンパイラをインタプリタ上で実行することで問題なくコンパイラを動かせたそうです。
makeとgccの違い
make自体はプログラム作成を行うのではなく、「どのファイルをどのように処理するか」を制御するための管理ツールです。makeからCコンパイラやリンカなどを呼び出して、プログラム全体を構築していきます。
投稿2017/08/26 13:55
総合スコア145183
0
解決済みですが、ちょっと補足を。
一度作ってしまえば、使い回しができそうですが、最初にコンパイラをどのようにして作り上げたのでしょうか?
アセンブリ言語でひたすら書くんでしょうか?
この辺を読むと、どうやら同じ言語で最初から最後まで開発することを想定しているようですが、そうとは限りません。
例えば、C言語のコンパイラを作る場合、
1.C言語の文法すべてを実装せずに、一部の文法だけを実装する。
(例えば、整数しか扱えない、制御構文はifとgotoだけなど)
2.上記1で作ったコンパイラを使って、1と同じ文法のコンパイラを実装する。
3.上記2で作ったコンパイラを使って、もう少しだけ文法を拡張したコンパイラを実装する。
4.上記3で作ったコンパイラを使って、さらにもう少しだけ文法を拡張したコンパイラを実装する。
5.以下、繰り返し
のような手法が取られることがあるようです。
他の高級言語が存在せずアセンブラしかない場合には、このような手法で開発していくのが現実的かと思います。
蛇足:
ちなみに手順2と手順3の違いは、手順2の時点ではアセンブリ言語で書かれたソースコードしかないのに対して、手順3の時には(手順2で作った)サブセットの言語で書かれたソースコードがある点。
なので手順3のときには手順2で書かれたソースコードを拡張するだけなので楽。手順4以降も同様。
投稿2017/08/29 02:21
総合スコア310
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
デニス・リッチー自身が書いた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 14:47
編集2017/08/26 15:05総合スコア1149
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
一度作ってしまえば、使い回しができそうですが、最初にコンパイラをどのようにして作り上げたのでしょうか?
アセンブリ言語でひたすら書くんでしょうか?
最初のアセンブラを開発した人は、機械語でアセンブラを開発した筈です。
8進数でパチパチやって入力しつつ開発した筈です。そして、そのアセンブラがあれば、アセンブラでコンパイラを記述できるのでかなり楽できます。
こんな動画があります。マイクロソフト社のビル・ゲイツさんが開発したと言われる4KBasicを紙テープから読み込んで起動する動画です。
ビル・ゲイツさんももしかするとこのようにしてパチパチやりながら4KBasicを開発したのかも知れません。ちなみに、4Kは4KBytesの4Kです。
make - デバイスドライバのコンパイルやカーネルのコンパイルに使われる。
gcc - ユーザーアプリケーションのコンパイルに使われる。
2つの違いがよく分かりません。
makeはコンパイラではないですよ。コンパイルやリンク処理を自動化するツールです。
毎回全てのソースをコンパイルしていたら、巨大プロジェクトは地獄を見ます。ビルドするのに一晩かかるようなものもありますから。ちょっとソース修正するたびに一晩とか有り得ないです。
ソースとオブジェクトの依存関係を管理し、修正したソースに依存しているオブジェクトのみをコンパイル/リンクすると効率良く開発できます。その処理を自動化するのがmakeです。
なんでgccではデバイスドライバのコンパイルができないのでしょうか?
linuxはgccでコンパイルされてますよ。デバイスドライバも普通にコンパイルできます。
投稿2017/08/26 14:14
編集2017/08/26 14:20総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/26 14:16
2017/08/26 14:21
2017/08/26 14:27
0
ブートストラップ問題を読んだらだいたいイメージ出来るんじゃないでしょうか。
言語 X のインタプリタかコンパイラを言語 Y で実装する。ニクラウス・ヴィルトは、最初のPascalコンパイラをFORTRANで書いたとされている。
と言うやつです。
投稿2017/08/26 13:55
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/26 13:57
2017/08/26 14:00
退会済みユーザー
2017/08/26 14:01
2017/08/26 14:04