マクロ (コンピュータ用語)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

マクロ (Macro) は、コンピュータ言語の一種である。プログラム中の文字列を、あらかじめ定義された規則に従って置換すること。マクロを展開するプロセッサ(処理系)をマクロプロセッサという。転じて、アプリケーションソフトウェア上の作業を自動化する機能やプログラム言語(マクロ言語)のこともマクロと呼ぶ。

目次

プログラムとマクロ [編集]

アセンブラとマクロ [編集]

アセンブリ言語ではもともと、基本的に機械語の命令と一対一対応するニーモニックだけを記述していた。その後、アセンブラにマクロ機能を追加したマクロアセンブラが登場したことで、複数のニーモニックをまとめ、簡略に記述できるようになった。初期のマクロアセンブラの例として、デジタルリサーチ社の MAC やマイクロソフト社の MASM (Macro Assembler) などがある。

C言語のマクロ [編集]

C言語のソースプログラムで「#define STRING1 STRING2」という行を記述すると、プリプロセッサによってコード中のSTRING1STRING2に置換される。また、「#define SQUARE(val) ((val)*(val))」のようにパラメータをとる関数形式マクロを定義することもできる。プリプロセッサは、コンパイラがソースプログラムを解釈してオブジェクトプログラムを生成する前のプロセッサ(処理系)である。

関数マクロには、引数の型を固定しないなど、関数よりも便利な面がある。しかし、マクロ自体はテキストの置換を機械的に実行するものでしかないので、そのマクロを使用する際にパラメータとしてインクリメント式やデクリメント式を直接渡したり、あるいはパラメータに関数の戻り値を使うために関数呼び出しを直接記述したりすると、それらの評価が複数回実行される場合がある。通常、マクロ利用者はそのような動作を期待していない。これをマクロの副作用とよび、関数マクロの定義時や使用時には注意すべきである。こうした点から、C言語では関数マクロ機能をできるだけ使わないようにすべきだとされている。

なお、コンパイル環境によって特定の値(文字列)に展開されるマクロがあり、「定義済みマクロ」と呼ばれる。プログラム中にファイル名や行番号を自動的に埋め込んだり、コンパイラのバージョンやターゲット環境によってコンパイルするコードを変更する目的(前方互換性の維持)で利用される。

C++ のマクロ [編集]

C++テンプレートはマクロの発展系であり、より言語に密着した能力や型安全性を持つ機能である。C++ では問題点の多いマクロよりも安全なテンプレートやインライン関数オーバーロードなどを使用することが推奨されている。また、マクロは名前空間を使うことができないので、大規模開発時に破綻する危険性もある。しかし、マクロでなければできない処理(コンパイル時点で決定されるので、処理というよりは一種のメタプログラミング)もあり、Boost.Preprocessor などのマクロを駆使したライブラリも依然として活発である。マクロおよびテンプレートは、静的ダックタイピングによく利用される。

LISP のマクロ [編集]

LISP のマクロは受け取ったS式を別のS式に変換して返す関数として定義される。したがってマクロはそれ自体チューリング完全な言語であり、プログラムが解釈される前に自由に構文木を操作できる。これは実質的に文法構造の自由な拡張機能を(S式という範囲で)与える能力である。

LISP でのマクロについては以下の書籍が参考になる。

マクロプロセッサ [編集]

m4など、単独のマクロプロセッサもある。m4は、メールサーバソフトウェアsendmailの設定ファイルを作成する場合にも使われる。sendmail の設定ファイルの書式は非常に複雑なので、比較的単純な書式で設定を記述したファイルを作成し、m4 などを使って設定ファイルに変換するのである。

TeX のマクロ [編集]

組版処理ソフトウェア TeX では、ユーザーが独自に定義した新しい命令をマクロと呼ぶ。マクロの定義には \newcommand や \def などを用いる。

アプリケーションソフトウェアのマクロ [編集]

多くのアプリケーションソフトウェアで、作業を自動化するためのキーボードマクロ機能やマクロプログラミングが利用できる。

キーボードマクロ [編集]

複数のキーボード(マウスなどが含まれる場合もある)操作を記録し、1タッチで再生する機能。複雑な処理を繰り返し行う場合、作業を省力化し、操作ミスを減らすことが出来る。このことは、作業を自動化すると見なすことも出来る。

マクロ言語 [編集]

マクロ言語は、アプリケーションの機能を直接キーボードやマウスなどから利用するのではなく、プログラムから利用するために用いる。キーボードマクロと比べて、複雑な処理を柔軟に記述できる。また、キーボードなどからはできない操作を実現できる場合もある。一方でプログラムを組む必要があるため、やや難易度は高い。

アプリケーションソフトウェアによっては、キーボードマクロの記録がマクロプログラミング言語のコードとして残される場合もある。こうした場合は、キーボードマクロの記録を元に効率的にマクロプログラムを作成できる。