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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

Q&A

解決済

6回答

7168閲覧

コンパイラのコンパイラ

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

2グッド

4クリップ

投稿2017/08/26 13:44

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

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

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

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

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

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

SVC34, yohhoy👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ベストアンサー

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

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

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

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

makeとgccの違い

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

投稿2017/08/26 13:55

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/08/26 13:57

ブートストラップ問題と言うんですか!! 初めて知りました! makeから呼ばれているC用のコンパイラはなんですか?gccですか?
maisumakun

2017/08/26 14:00

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

退会済みユーザー

2017/08/26 14:01

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

2017/08/26 14:04

なるほど!makeの仕組みがわかりました! コンパイラをアセンブリ言語で作るってかなり大変なのでは? 昔の人にとってはそうでもないんですかね?
guest

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

JunSuzukiJapan

総合スコア310

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/08/29 09:50

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

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
SVC34

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/08/26 14:51

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

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
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/08/26 14:16

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

2017/08/26 14:21

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

2017/08/26 14:27

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

0

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

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

と言うやつです。

投稿2017/08/26 13:55

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

プログラム言語年表

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

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

投稿2017/08/26 13:54

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/08/26 13:58

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問