Cfront(シーフロント)は、ビャーネ・ストロヴストルップが1983年頃に開発した、
C++(当時はC with Classesと呼ばれていた)の初期の
コンパイラです。
C++の
ソースコードを
C言語に変換する役割を担っていました。
プリプロセッサは
ソースコードをプログラミング言語として解釈せず、単に文字列を変換するだけですが、Cfrontは完全なパーサを搭載していました。これにより、シンボルテーブルの構築、クラスや関数のツリー構造の作成が可能になりました。これは、単なるテキスト変換以上の複雑な処理をCfrontが行っていたことを意味します。
Cfront自体も
C++で記述されていました。当初は
C++コンパイラ自体が存在しなかったため、ブートストラップ問題(
コンパイラをコンパイルするための
コンパイラがない状態)が生じました。この問題を解決するために、
C++で記述されたCfrontの
ソースコードと同時に、そのCfrontでコンパイルし、
C言語に変換した「半分処理済み」の特殊バージョンも提供されました。この特殊バージョンは、ネイティブな
C言語コンパイラでコンパイルすることができ、
C++で記述されたCfrontのコードをコンパイルできる実行ファイルを作成することができました。
Cfrontを新しいマシンに移植する際には、特に標準入出力周りの部分が問題となりました。
C++のストリームは、
C言語標準ライブラリのバッファ付きI/Oストリームに強く依存していましたが、
C言語の他のライブラリとの関連性は薄かったのです。System V系のシステムへの移植は比較的容易でしたが、BSD系のシステムでは
C言語のライブラリや標準入出力の構造体に多くの差異があったため、より多くの修正が必要となりました。
Cfrontは1990年頃まで、事実上
C++の言語規格そのものであり、
C++は「
C++から
C言語へのコンバータ」に過ぎない、非常にマイナーな存在でした。しかし、今日の
C++にもCfrontのコンバータとしての名残が見られます。例えば、名前修飾は、当時の比較的原始的なリンカがシンボルの型情報をサポートしていなかったためにCfrontで実装されたものであり、一部のテンプレートのインスタンス化に関する仕様も、Cfrontの初期の試行錯誤から発展したものです。
C++(およびCfront)は、タイプチェックやweak symbol(同じシンボルがある場合はweak symbolが無視される)のような機能をリンク時に必要とする言語として、初めて広く普及しました。このことは、Unixにおけるリンカと
オブジェクトファイルの
ファイルフォーマットの発展に直接的に重要な役割を果たしました。
例外処理が未完成のまま、Cfront 4.0は開発が中止され、現在では販売されていないようです。
C++はCfrontの限界を超えて成長しましたが、同様のアプローチを取りつつ、より標準に準拠したComeau C/
C++が後に登場しました。
関連情報として、Cpre(Cプリプロセッサ)、トランス
コンパイラがあります。
外部リンク
Cfront is mentioned in Bjarne Stroustrup's FAQ
Cfront Releases at C++ Historical Sources Archive