web-dev-qa-db-ja.com

最初のC ++コンパイラはどのようにC ++で作成できますか?

Stroustrupは、最初のC++コンパイラであるCfrontはC++で書かれたと主張しています( Stroustrup FAQ )。

しかし、最初のC++コンパイラをC++で作成することはどうして可能でしょうか。

コンパイラを構成するコードもコンパイルする必要があるため、最初のC++コンパイラはC++で作成できなかったでしょうか。

48
Pacerier

キーはここにあります:

最初のC++コンパイラー(Cfront)はC++で作成されました。それを構築するために、私は最初にCを使用して「クラス付きC」からCへのプリプロセッサーを作成しました。 「C with Classes」は、C++の直接の祖先となったC言語の方言です。そのプリプロセッサは、「C with Classes」コンストラクト(クラスやコンストラクタなど)をCに翻訳しました。これは、すべての言語を理解できない従来のプリプロセッサであり、ほとんどの型チェックをCコンパイラに任せ、個別に翻訳しました完全な知識のない構成。次に、Cfrontの最初のバージョンを「C with Classes」で書きました。

したがって、Cfrontの最初のバージョンはC++ではなく、中間言語で記述されていました。 Cで直接Cコンパイラとプリプロセッサを作成する機能は、Cの多くの革新(および 大規模なセキュリティホール )をもたらしました。そのため、「クラス付きC」コードをまっすぐにする新しいプリプロセッサを記述します。 C(ストレートCは何でもできるため)を使用して、「C with Classes」を使用してC++コンパイラを記述し(Cでそれを実行できなかったのではなく、時間がかかるだけです)、そのC++コンパイラを使用して記述しますC++のより効率的で完全なコンパイラ。とった?

58

ブートストラップされました。 C++機能がcfrontに追加されるとすぐに、cfrontはその時点からその機能を使用できるようになります(ただし、その機能を実装するためではありません)。これは、cfrontがC++コードをCコードに変換する機能を持っていたため機能しました。したがって、新しいプラットフォームが登場した場合、別のプラットフォームでcfrontを使用してcfrontをC++からCに変換し、新しいプラットフォームのCコンパイラを使用してCからオブジェクトコードへのコンパイルを完了することができます。

17
David Schwartz

B.S.その質問に答えます:

最初のC++コンパイラー(Cfront)はC++で作成されました。それを構築するために、私は最初にCを使用して「クラス付きC」からCへのプリプロセッサーを作成しました。 「C with Classes」は、C++の直接の祖先となったC言語の方言です。そのプリプロセッサは、「C with Classes」コンストラクト(クラスやコンストラクタなど)をCに翻訳しました。これは、すべての言語を理解できない従来のプリプロセッサであり、ほとんどの型チェックをCコンパイラに任せ、個別に翻訳しました完全な知識のない構成。

次に、Cfrontの最初のバージョンを「C with Classes」で書きました。 Cfrontは、C++ソースの完全な構文とセマンティックチェックを行う従来のコンパイラでした。そのために、完全なパーサーがあり、シンボルテーブルが作成され、各クラス、関数などの完全な内部ツリー表現が作成されました。また、Cを出力する前に、C++構成の内部ツリー表現でソースレベルの最適化を行いました。生成されたC。型チェックはCに依存していません。単にCをアセンブラとして使用しました。結果のコードは妥協のないほど高速でした。

最初に彼は、単純なプリプロセッサによってCに実装された「C with Classes」と呼ばれるものを作成しました。基本的にはC++でしたが、プリプロセッサはほとんどまたはまったくチェックを行いませんでした。彼はそれを使用して、タイプチェック、シンボルテーブルなどを備えたC++のCへのトランスレータのより強力なバージョンであるCfrontを記述しました。

9
Mike Dunlavey

この側面をカバーする回答がないため、この回答を追加します。

技術的には、コードをコンパイルするためのソフトウェアは必要ありません。必要なコンパイラー仕様がある限り、実際のコンパイルを手動で行うことができます。これは、最初のC++コンパイラがコンパイルされた方法ではありません。可能だと言っているだけです。

アセンブリ言語と比較してください。初期に使用されたとき、アセンブリコードをマシンコードに変換するアセンブラソフトウェアはありませんでした。手作業で行われましたが、アセンブリ言語により、プログラマはより適切な概要を知ることができました。

2
klutt