6

初期の C++ コンパイラは、コンパイルする前に最初の C++ コードをプレーンな C に変換した (またはサードパーティの C コンパイラが必要だった) ことを何度か読んだことがあります。

文法 / 言語 / コンパイルのフィールドをいじって、C++ がプレーンな C でどのように実装されたか、特にクラス継承と [仮想] メソッド呼び出しを実装する 1 つの方法を知りたいと思っています。

現在でも利用可能なコンパイラを教えてください。

オブジェクト指向コードは、構造体と関数ポインターを使用してプレーンな C でシミュレート/エミュレートできることは知っていますが、C での C++ 言語の実際の実装を見たいと思っています。

4

5 に答える 5

5

cfrontを試すことができます。古いバージョンはここからダウンロードできます。ただし、非常に限られた C++ サブセットしかサポートしていません。例外などの一部の機能は、この方法では実装できません。

更新: Maxim Yegorushkin が指摘したように、例外は setjmp/longjmp で実装される可能性があります。しかし、私の記憶が正しければ、例外を C++ のライブラリとして実装することはできません。それらはコア言語の一部でなければなりません。

于 2013-04-12T12:08:10.043 に答える
2

C++ を C でどのように変換できるかを確認したいだけの場合は、いくつかのオプションを利用できます。C++ FAQ には、これをカバーするセクションがあります。これまでに提案されたすべての主要なオプションをカバーしており、新しいオプションが利用可能になったときに更新する必要があります。

于 2013-04-12T12:11:02.613 に答える
2

Comeau コンパイラはこのように動作します。全盛期には、誰もが標準への準拠を称賛し、Comeau をオンラインで使用してコードのスニペットをテストしていましたが、製品コードの構築に使用していた人はほとんどいませんでした。

EDGE フロントエンドもこのように動作します。Intel C++ コンパイラと Comeau の両方で使用されていると聞きました。

于 2013-04-12T12:12:31.403 に答える
1

最初の Microsoft C++ コンパイラは、まさにあなたが説明したとおりでした。私はそれを使用したことを覚えているので知っています。私の記憶では、C コンパイラのバージョン 7 だったと思います。これは 1992 年頃 (プラス/マイナス 2 年) のことです。

更新: http://en.wikipedia.org/wiki/Visual_C%2B%2Bを参照してください。私が言及しているものは、実際には 1992 年にリリースされ、「C/C++ 7.0」と呼ばれていました。

于 2013-04-12T12:08:24.590 に答える
0

これが、 と呼ばれる C++ の元の実装の仕組みcfrontです。これは C コンパイラのフロント エンドでした。EDG の C++ フロント エンドは、C コードを生成するように C バックエンドで構成できますが、最近ではあまり一般的ではありません。これは、新しいコンパイラを実行するときに役立ちますが、製品コンパイラでは無駄なステップであるため、商用コンパイラは通常、ターゲット プラットフォームの優先形式に直接移行します。また、生成された C コードを読み取ってプログラムをデバッグする必要はありません私はこれを C++ に対して行ったことはありませんが、Dinkumware で働いていたとき、EDG の開発中の Java フロントと連携して Java コア ライブラリを実装しました。C コードは論理的に構造化されていますが、LISP: 多くの地獄の愚かな括弧によく似ています。

于 2013-04-12T14:59:33.417 に答える