マクロ (コンピュータ用語)
マクロは「大きい」といったような意味の語であるが、コンピュータ関係では、アプリケーションソフトウェアなどの操作などといった、プログラミング言語と比較して粒度が巨きい操作をまとめて自動化したりする機能を指して良く使われる。マクロを記述するコンピュータ言語をマクロ言語と言う(言語の無いマクロ機能もある)。また、テキスト等の変換を記述する変換言語もマクロと呼ばれる。
この記事と、マクロ言語の記事は、それぞれに書くべき内容と書かれている内容が混乱している。また以下の内容のいくつかは変換言語についてのものである。
目次
プログラムとマクロ
アセンブラとマクロ
アセンブリ言語ではもともと、基本的に機械語の命令と一対一対応するニーモニックだけを記述していた。その後、アセンブラにマクロ機能を追加したマクロアセンブラが登場したことで、複数のニーモニックをまとめ、簡略に記述できるようになった。
C言語のマクロ
C言語のソースプログラムで「#define STRING1 STRING2
」という行を記述すると、プリプロセッサによってコード中のSTRING1
はSTRING2
に置換される。また、「#define SQUARE(val) ((val)*(val))
」のようにパラメータをとる関数形式マクロを定義することもできる。プリプロセッサは、コンパイラがソースプログラムを解釈してオブジェクトプログラムを生成する前のプロセッサ(処理系)である。
関数マクロには、引数の型を固定しないなど、関数よりも便利な面がある。しかし、マクロ自体はテキストの置換を機械的に実行するものでしかないので、そのマクロを使用する際にパラメータとしてインクリメント式やデクリメント式を直接渡したり、あるいはパラメータに関数の戻り値を使うために関数呼び出しを直接記述したりすると、それらの評価が複数回実行される場合がある。通常、マクロ利用者はそのような動作を期待していない。これをマクロの副作用とよび、関数マクロの定義時や使用時には注意すべきである。こうした点から、C言語では関数マクロ機能をできるだけ使わないようにすべきだとされている。
なお、コンパイル環境によって特定の値(文字列)に展開されるマクロがあり、「定義済みマクロ」と呼ばれる。プログラム中にファイル名や行番号を自動的に埋め込んだり、コンパイラのバージョンやターゲット環境によってコンパイルするコードを変更する目的(前方互換性の維持)で利用される。
C++ のマクロ
C++ のテンプレートはマクロの発展系であり、より言語に密着した能力や型安全性を持つ機能である。C++ では問題点の多いマクロよりも安全なテンプレートやインライン関数オーバーロードなどを使用することが推奨されている。また、マクロは名前空間を使うことができないので、大規模開発時に破綻する危険性もある。しかし、マクロでなければできない処理(コンパイル時点で決定されるので、処理というよりは一種のメタプログラミング)もあり、Boost.Preprocessor などのマクロを駆使したライブラリも依然として活発である。マクロおよびテンプレートは、静的ダックタイピングによく利用される。
LISP のマクロ
LISP のマクロは受け取ったS式を別のS式に変換して返す関数として定義される。したがってマクロはそれ自体チューリング完全な言語であり、プログラムが解釈される前に自由に構文木を操作できる。これは実質的に文法構造の自由な拡張機能を(S式という範囲で)与える能力である。
LISP でのマクロについては以下の書籍が参考になる。
- Paul Graham "On Lisp" (邦訳版は http://www.komaba.utmc.or.jp/~flatline/onlispjhtml/ から読める)
マクロプロセッサ
m4など、単独のマクロプロセッサもある。m4はsendmailやautotoolsで設定ファイルなどを生成するために使われている。
テンプレート:TeX のマクロ
組版処理ソフトウェア [[TeX|テンプレート:TeX]] では、ユーザーが独自に定義した新しい命令をマクロと呼ぶ。マクロの定義には \newcommand や \def などを用いる。
アプリケーションソフトウェアのマクロ
多くのアプリケーションソフトウェアで、作業を自動化するためのキーボードマクロ機能やマクロプログラミングが利用できる。
キーボードマクロ
複数のキーボード(マウスなどが含まれる場合もある)操作を記録し、1タッチで再生する機能。複雑な処理を繰り返し行う場合、作業を省力化し、操作ミスを減らすことが出来る。このことは、作業を自動化すると見なすことも出来る。