Stroustrupは、最初のC ++コンパイラであるCfrontがC ++で作成されたと主張しています(Stroustrup FAQ)。
しかし、最初のC ++コンパイラをC ++で作成することはどのように可能ですか?
コンパイラーを構成するコードもコンパイルする必要があります。したがって、最初のC ++コンパイラーをC ++で作成することはできませんでしたか?
Stroustrupは、最初のC ++コンパイラであるCfrontがC ++で作成されたと主張しています(Stroustrup FAQ)。
しかし、最初のC ++コンパイラをC ++で作成することはどのように可能ですか?
コンパイラーを構成するコードもコンパイルする必要があります。したがって、最初のC ++コンパイラーをC ++で作成することはできませんでしたか?
回答:
ここに鍵があります:
最初のC ++コンパイラ(Cfront)はC ++で作成されました。それを構築するために、最初にCを使用して「C with Classes」-to-Cプリプロセッサを記述しました。「C with Classes」は、C ++の直接の祖先となったC方言でした。このプリプロセッサは、「C with Classes」コンストラクト(クラスやコンストラクタなど)をCに変換しました。これは、すべての言語を理解せず、Cコンパイラが行う型チェックのほとんどを残し、個々の完全な知識なしで構築します。その後、「C with Classes」でCfrontの最初のバージョンを作成しました。
そのため、Cfrontの最初のバージョンはC ++ではなく、中間言語で作成されました。CコンパイラーとプリプロセッサーをCで直接作成する機能は、Cの多くの革新(および大規模なセキュリティホール)につながりました。したがって、「C with Classes」コードをストレートCに変換する新しいプリプロセッサーを作成します(ストレートCは何でも)そして、「C with Classes」を使用してC ++コンパイラを記述し(Cで実行できなかったため、しばらく時間がかかります)、そのC ++コンパイラを使用してより効率的で完全なコンパイラを記述しますC ++。とった?
ブートストラップされました。CfrontにC ++機能が追加されるとすぐに、cfrontはその時点からその機能を使用できます(ただし、その機能を実装することはできません)。これは、cfrontがC ++コードをCコードに変換する機能を持っていたために機能しました。新しいプラットフォームが登場した場合、別のプラットフォームでcfrontを使用してcfrontをC ++からCに変換し、新しいプラットフォームのCコンパイラを使用してCからオブジェクトコードへのコンパイルを終了できます。
BSはその質問に答えていると思います。
最初のC ++コンパイラ(Cfront)はC ++で作成されました。それを構築するために、最初にCを使用して「C with Classes」-to-Cプリプロセッサを記述しました。「C with Classes」は、C ++の直接の祖先となったC方言でした。このプリプロセッサは、「C with Classes」コンストラクト(クラスやコンストラクタなど)をCに変換しました。これは、すべての言語を理解せず、Cコンパイラが行う型チェックのほとんどを残し、個々の完全な知識なしで構築します。
その後、「C with Classes」でCfrontの最初のバージョンを作成しました。Cfrontは、C ++ソースの完全な構文およびセマンティックチェックを行う従来のコンパイラでした。そのため、完全なパーサー、シンボルテーブルの構築、各クラス、関数などの完全な内部ツリー表現の構築を行いました。また、Cを出力する前に、C ++構造の内部ツリー表現でソースレベルの最適化を行いました。生成されたCで、型チェックにCに依存しませんでした。アセンブラとしてCを使用しました。結果のコードは妥協のないほど高速でした。
最初に、彼は「C with Classes」と呼ばれる単純なプリプロセッサによってCに実装されたものを作成しました。これは基本的にC ++でしたが、プリプロセッサはほとんどまたはまったくチェックしませんでした。次に、それを使用して、C ++のより強力な翻訳者であるCfrontをCfrontに書き込み、型チェック、シンボルテーブルなどを完備しました。