プリプロセッサとは
プリプロセッサとは、
ソフトウェアが特定の処理を行う前に、準備段階としてデータ入力や整形を行うプログラムのことです。プログラミングの分野では、
ソースコードが
コンパイラや
インタプリタに渡される前に、様々な前処理を施す役割を担います。
例えば、CADやCAEにおけるデータ処理、ワープロソフトでの漢字変換ソフトなども、プリプロセッサの一例として挙げられます。
プログラミング言語においては、プリプロセッサは
ソースコードに対して、コンパイルや解釈の前に前処理を行います。
ソースコードには、プリプロセッサに対する指令(プリプロセッサ
ディレクティブ)が含まれており、これに基づいて処理が実行されます。この処理自体は「プリプロセス」と呼ばれます。
プリプロセッサの主な処理内容
プリプロセッサの具体的な処理内容は、使用する言語やプリプロセッサによって異なりますが、一般的には以下のようなものがあります。
ファイルの読み込み (include)
別のファイルの内容を
ソースコードに挿入します。
マクロの展開
事前に定義されたルールに従って、シンボルを別の文字列に置き換えます。
条件付きコンパイル
特定の条件に基づいて、
ソースコードの一部を選択的にコンパイルします。
コメントの削除
ソースコード中のコメントを取り除きます。
プリプロセッサの利用例
C言語はプリプロセッサを広く利用する言語として知られています。
GNUプロジェクトの`cpp`コマンド(Cプリプロセッサ)がよく使われます。
C言語の
コンパイラ(`cc`や`gcc`コマンド)は、内部でプリプロセッサを自動的に実行することができます。
また、プリプロセッサは、言語仕様が限定的な言語に構造化プログラミングの機能を追加するためにも使われます。`ratfor`(FORTRANのプリプロセッサ)がその例です。さらに、メインフレーム向けの商用ツールとして、FORTRANや
COBOLのプリプロセッサも存在します。
プリプロセッサ利用時の注意点
プリプロセッサを使用する際には、いくつかの注意点があります。プリプロセッサを通すことを前提としたプログラムは、
コンパイラが直接関与しない部分を含みます。例えば、マクロ定義と同じ文字列が意図せず変換されたり、定数の型チェックができないなど、予期せぬ問題を引き起こす可能性があります。
このような問題を防ぐために、ユーザー定義のマクロの識別子は大文字で記述し、他の識別子には小文字を混ぜるという慣習があります。これにより、名前の衝突を避けることができます。
C言語におけるプリプロセッサの慣習と進化
C言語の規格自体は、マクロと非マクロの識別子における大文字・小文字の使い分けを規定していません。初期の
C言語では、大文字と小文字が混在したマクロが使われていましたが、これはリスクが認識される前の名残です。
その後、
C99やC11規格では、`bool`, `true`, `false`, `offsetof()`, `noreturn`のような小文字のマクロが追加されましたが、これらは本来キーワードとして定義されるべき要素を、
互換性を保つためにマクロとして定義したものです。これらの小文字マクロは、
C言語の次期規格であるC2xで廃止し、キーワード化することが検討されています。
プリプロセッサの代替と高度な利用
C++のように、言語自体が定数、インライン関数、ジェネリックな関数テンプレートといった機能を持つ言語では、プリプロセッサの使用を避け、言語自体の機能を使うことが推奨されています。しかし、
互換性や慣習から、プリプロセッサを利用した記述も依然として多く見られます。
Javaではプリプロセッサは採用されていません。C#では限定的なプリプロセッサが採用されています。
一方で、プリプロセッサを積極的に利用した
メタプログラミングという高度な利用法も存在します。
まとめ
プリプロセッサは、プログラムの柔軟性や保守性を高めるための強力なツールですが、使い方によっては問題を引き起こす可能性もあります。適切な知識と注意を持って利用することが重要です。
関連項目
m4 (プログラミング言語))
マクロ (コンピュータ用語))
外部リンク
The C Preprocessor - gnu.org
The C Preprocessor - 株式会社SRA(和訳)
*
C/C++ プリプロセッサ・リファレンス | MSDN