「プリプロセッサ」の版間の差分

削除された内容 追加された内容
盛宿 (会話 | 投稿記録)
出典に基づいた事実の記述が無思慮に削除されていたので復帰。欠如あるいは不適切な位置にある句点の修正。読点の欠如により読みづらい文を修正。ガイドライン違反の記述も修正。Wikipedia:出典を明記する#名無しリンクを避けるWikipedia:ウィキペディアは何ではないか#ウィキペディアはマニュアル、ガイドブック、教科書、学術雑誌ではありません
3行目:
他の分野の例としては、[[CAD]]や[[CAE]]のデータ処理がある。また[[ワープロ]]ソフトウェアにおける[[漢字変換]]ソフトウェアもプリプロセッサの一例である。
 
==プログラミング言語に対してのプリプロセッサ==
[[プログラミング言語]]処理系においては、[[ソースコード]]に対して、それらが[[インタプリタ]]や[[コンパイラ]]などの本体に渡される前に、前処理を施す[[プログラム (コンピュータ)|プログラム]]がプリプロセッサと呼ばれている。
 
そういったソースコード中には、プリプロセッサに対する指令などが含まれており、それらは「'''プリプロセッサ指令'''」(プリプロセッサ[[ディレクティブ]])などと呼ばれている。処理自体は「'''プリプロセス'''」(preprocess) と呼ばれる。
18行目:
 
==環境==
プリプロセッサを用いる言語のごく一例として[[C言語]]がある。[[GNUプロジェクト]]のcppコマンド (C preprocessor) はよく使われているプリプロセッサである。cppコマンドを明に実行しなくても、C言語コンパイラのccコマンドやgccコマンドはその内部でプリプロセッサを先に実行させることができる。
 
また、言語仕様の貧弱な言語を構造化プログラミングができるようにしたものもある。[[ratfor]]([[FORTRAN]]のプリプロセッサ)が有名である。
27行目:
プリプロセッサを通すことを前提に記述されたプログラムは、コンパイラのあずかりしらない内容を含んでいることになる。このことは、たとえばマクロの定義と同じ文字列が(意図せず)全て変換されてしまったり、定数の型をチェックできなかったりと、問題の火種をはらんでいる。そのため、プリプロセッサを用いる場合には注意が必要である。
 
このような名前衝突の問題をさけるための対策として、少なくともユーザー定義のマクロの識別子は大文字だけで記述し、それ以外の識別子は小文字をまぜるという慣習がある<ref>[http://www.libjingu.jp/trans/bs_faq2-j.html#Hungarian "C++の設計者Bjarne Stroustrupによる注意:「すべての文字を大文字にした名前は慣例的にマクロでの使用に予約されているので、絶対に使用しないでください」"]</ref><ref>ISBN 978-4839921941 "Code Craft ~エクセレントなコードを書くための実践的技法~" p.570</ref><ref name=":0">[[標準Cライブラリ]]にも小文字のマクロassert()や大文字の<code>FILE</code>型(規格では「オブジェクト型」としか規定されていないが、通例は[[構造体FILE]]で実装される)が存在するが、これらは脚注の「Code Craft エクセレントなコードを書くための実践的技法」にあるように危険性が認知される以前の名残である。</ref>
 
例:プリプロセッサと同じく全て大文字で定数を定義してしまった場合
52行目:
</source>
 
C言語の規格自体は、マクロと非マクロの識別子に関して、大文字・小文字の使い分けを規定してはいい。ISO/IEC 9899よびJIS X3010の§6.10.3にて例示されたマクロにはすべて大文字のものもあれば、すべて小文字のものもある。[[標準Cライブラリ]]も同様であり、例えば<code>assert()</code>は規格でマクロであることが規定されているにもかかわらずすべて小文字である。<code>getc()</code>関数や<code>putc()</code>関数、<code>errno</code>などはマクロによる実装を規格で許可している。また、<code>FILE</code>型はマクロであることが規定されていないにもかかわらずすべて大文字である<ref>初期の実装において、<code>FILE</code>の定義にマクロが使われていたことに由来する。[[Version 7 Unix]]の例:[https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/include/stdio.h V7/usr/include/stdio.h]</ref>。なお、後発の[[C99]]規格や[[C11 (C言語)|C11]]規格でも<code>bool</code>, <code>true</code>, <code>false</code>, <code>offsetof()</code>, <code>noreturn</code>など<ref>[https://ja.cppreference.com/w/c/types/boolean ブーリアン型サポートライブラリ - cppreference.com]</ref><ref>[https://en.cppreference.com/w/c/types Type support - cppreference.com]</ref>、依然として小文字のマクロが標準仕様として追加導入されている。ただし、これらは本来[[予約語|キーワード]]して定義されるべき単語構成要素互換性維持ためにやむをえずマクロとして定義したものである<ref> [http://www.open-std.org/jtc1/sc22/wg14/www/docs/n609.htm ISO/IEC JTC1/SC22/WG14 N609]</ref><ref name="c2x_proposal">[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2392.pdf Revise spelling of keywords and make them feature tests; proposal for C2x]</ref>特殊な事情ゆえの小文字であり小文字のマクロ作成を常用すべきではない。なお、これら小文字のマクロはC言語の次期規格であるC2xにおいて廃止し予約語キーワードとすることが検討されている<ref>http: name="c2x_proposal"//www.open-std.org/jtc1/sc22/wg14/www/docs/n2392.pdf</ref>
 
[[C++]]のように、言語自体の機能によって定数やインライン関数およびジェネリックな関数テンプレートを記述可能な言語ではなるべく言語自体の機能を使い、プリプロセッサを排除して記述すべきだという意見が存在するが、[[互換性]]や慣習からプリプロセッサを利用した記述が行われる場面は依然多い。[[Java]]ではプリプロセッサは採用されなかった。[[C Sharp|C#]]では限定されたプリプロセッサが採用された。<!--[[C Sharp|C#]]では{{要出典範囲|date=2017年9月|規約としてプリプロセッサ以外の識別子に全て大文字の名前を使うことを禁止している}}。--><!-- System.Math.PI などが矛盾する。 -->