Cfront

Cfront（シーフロント）はビャーネ・ストロヴストルップが1983年頃に開発したC++（当時 C with Classes と呼ばれていた）の初期のコンパイラである。C++のソースコードをC言語にコンパイルした。プリプロセッサはソースコードをプログラミング言語として解釈せず文字列を変換するものに過ぎないが、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++にはCfrontのコンバータとしての名残がまだある。名前修飾は当時の比較的原始的なリンカがシンボルの型情報をサポートしなかったことからCfrontで実装されたものであり、また一部のテンプレートのインスタンス化に関する仕様もCfrontの初期の試行錯誤から発展したものである。
C++（およびCfront）は、タイプチェックやweak symbol（同じシンボルがある場合はweak symbolが無視される）などのような機能をリンク時に必要とする言語として初めて広く普及し、Unixにおけるリンカとオブジェクトファイルのファイルフォーマットの発展に重要な役割を直接的に果たした。

例外処理の完成を見ずにCfront 4.0は途中放棄され、現在では販売されていないようである。C++はCfrontの限界を超えた言語に成長してしまったが、同様のアプローチを取りつつより標準に準拠したが後に登場した。

関連項目

 Cpre
 トランスコンパイラ

外部リンク

 Cfront is mentioned in Bjarne Stroustrup's FAQ 
 Cfront Releases at C++ Historical Sources Archive

Category:C++
Category:UNIXプログラミングツール