マクロ (コンピュータ用語)
表示
この記事には複数の問題があります。改善やノートページでの議論にご協力ください。
●出典がまったく示されていないか不十分です。内容に関する文献や情報源が必要です。︵2016年1月︶
●脚注による出典や参考文献の参照が不十分です。脚注を追加してください。︵2016年1月︶
●独自研究が含まれているおそれがあります。︵2016年1月︶
●言葉を濁した曖昧な記述になっています。︵2016年1月︶
●独立記事作成の目安を満たしていないおそれがあります。︵2016年1月︶
出典検索?: "マクロ" コンピュータ用語 – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL
|
マクロ (英: macro) は﹁大きい﹂﹁巨大な﹂といったような意味の語であるが、コンピュータ関係では、アプリケーションソフトウェアなどの操作などといった、プログラミング言語と比較して粒度が大きい操作をまとめて自動化したりする機能を指して良く使われる。マクロを記述するコンピュータ言語をマクロ言語と言う︵言語の無いマクロ機能もある︶。また、テキスト等の変換を記述する変換言語もマクロと呼ばれる。
この記事と、マクロ言語の記事は、それぞれに書くべき内容と書かれている内容が混乱している[要説明]。また以下の内容のいくつかは変換言語についてのものである。
プログラムとマクロ
アセンブラとマクロ
アセンブリ言語では、機械語の命令と一対一対応するニーモニックだけを記述できる。その後、アセンブラにマクロ機能を追加したマクロアセンブラが登場した。マクロアセンブラは複数のニーモニックをまとめ、簡略に記述できる。関数のような引数を取ることができる機能があるかどうかは処理系による。C言語のマクロ
C言語のソースプログラムで#define STRING1 STRING2
という行を記述すると、プリプロセッサによってコード中のSTRING1
はSTRING2
に置換される。また、
#define SQUARE(val) ((val)*(val))
のようにパラメータをとる関数形式マクロを定義することもできる。プリプロセッサは、コンパイラがソースプログラムを解釈してオブジェクトプログラムを生成する前のプロセッサ(処理系)である。そのほか、
#define TO_STRING(symbol) #symbol
#define PASTE_TOKEN(a,b) a##b
といった、シンボルの文字列化やトークンの連結を行なうことのできるマクロ特有の演算子も用意されている。
関数マクロには、引数の型を固定しない、呼び出しの実行時処理コストがかからないなど、関数よりも便利な面がある。しかし、マクロ自体はテキストの置換を機械的に実行するものでしかないので、そのマクロを使用する際にパラメータとしてインクリメント式やデクリメント式を直接渡したり、あるいはパラメータに関数の戻り値を使うために関数呼び出しを直接記述したりすると、それらの評価が意図せず複数回実行される場合がある。これをマクロの副作用と呼ぶ。マクロ利用者が副作用を期待していない場合は、関数マクロの定義時や使用時には注意すべきである。こうした点から、MISRA-Cでは関数マクロ機能をできるだけ使わないようにすべきとしている。
なお、﹁定義済みマクロ﹂として、コンパイル環境によって特定の値︵文字列︶に展開されるマクロがある。プログラム中にファイル名や行番号を自動的に埋め込んだり、コンパイラの版やターゲット環境によってコンパイルするコードを変更する目的︵前方互換性の維持︶で利用する。
.asahi-net .or .jp /~kc7k-nd /onlispjhtml /から読める)
●Doug Hoyte, Let Over Lambda (letoverlambda .com)
C++ のマクロ
C++ではC言語のプリプロセッサマクロも依然として使用可能だが、C++にはテンプレートというマクロの発展系機能が存在する。テンプレートはプリプロセッサではなくコンパイラが解釈・展開する機能であり、マクロと比較して、より言語に密着した能力や型安全性を持つ。また、マクロは名前空間を使うことができず、そのため大規模開発時に意図しない名前衝突により破綻する危険性があるが、テンプレートは名前空間を利用することが可能であり、大規模開発にも向いている。MISRA C++ では問題点の多いマクロよりも安全なテンプレートやインライン関数オーバーロードなどを使用することを推奨している。 しかし、テンプレートではなくマクロでなければ記述できない処理もある。例えばBoost.Preprocessorなどのマクロを駆使したライブラリがある。マクロおよびテンプレートは、いずれも静的ダックタイピングによく利用される。プリプロセスあるいはコンパイル時点にコードが決定されるので、マクロやテンプレートを活用したプログラミングは一種のメタプログラミングである。Lisp のマクロ
Lisp のマクロ処理は、Lisp のプログラム自体が Lisp のリストオブジェクトで表現されるもの︵S式︶であることを利用し、S式をS式に変換する関数により行われるものであり、この節の他のマクロ︵C++のテンプレートを除く︶がテキストベース︵トークンベースを含む︶であるのに対し、テキストベースではない変換系である点で全く異なったものである。プログラムが実行される前に自由に構文木︵S式︶を操作できるため、Lisp では︵他の言語におけるキーワードに相当する︶特殊形式も、利用者が自由に追加変更できるという特徴となっている︵なお、一部の Lisp にあるリードマクロは読み込み時に働くため、より言語をカスタムする自由度が大きい︶。 Lisp でのマクロについては以下の書籍が参考になる。 ●Paul Graham, On Lisp (邦訳版は wwwマクロプロセッサ
m4など、単独のマクロプロセッサもある。m4はsendmailやautotoolsで設定ファイルなどを生成するために使われている。TeXのマクロ
組版処理ソフトウェア TeXでは、ユーザーが独自に定義した新しい命令をマクロと呼ぶ。マクロの定義には \newcommand
や \def
などを用いる。