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

**マクロ**（）あるいは**マクロ命令**（）は、計算機科学の分野では、アプリケーションソフトウェアの自動操作のような、プログラミング言語での記述と比較して粒度が大きい処理を記述したり、テキストを別のテキストに置換したり、粒度が大きい命令を粒度の小さい命令（マイクロ命令）に変換したりするための規則または型のこと。マクロを記述するコンピュータ言語を**マクロ言語**と呼ぶ。また、テキスト等の変換を記述する言語は変換言語と呼ばれる。マクロは「大きい」「巨大な」という意味のに由来する。

## プログラムとマクロ
### アセンブラとマクロ
アセンブリ言語では、機械語の命令と一対一で対応するニーモニックだけを記述できる。その後、アセンブラにマクロ機能を追加したマクロアセンブラが登場した。マクロアセンブラは複数のニーモニックをまとめ、簡略に記述できる。関数のような引数を取ることができる機能があるかどうかは処理系による。

### C言語のマクロ
C言語は、プリプロセッサと呼ばれる、コンパイラがソースプログラムを解釈してオブジェクトプログラムを生成する前に動作するプロセッサ（処理系）を備えている。番号記号`#`で始まる、プリプロセッサに与える指令のことをプリプロセッサディレクティブと呼び、いくつかのディレクティブが規格で標準化されているほか、固有のディレクティブをサポートするコンパイラも存在する。

ソースプログラムで

```c
#define STRING1 STRING2
```

という行を記述すると、プリプロセッサによってコード中の`''STRING1''`は`''STRING2''`に置換される。これをオブジェクト形式マクロ（object-like macro）と呼ぶ。また、

```c
#define SQUARE(val) ((val)*(val))
```

のようにパラメータをとる関数形式マクロ（function-like macro）を定義することもできる。そのほか、

```c
#define TO_STRING(symbol) #symbol
#define PASTE_TOKEN(a,b) a##b
```

といった、シンボルの文字列化やトークンの連結を行なうことのできるマクロ特有の演算子も用意されている。マクロによる置換は、文字列リテラルやコメントの中には適用されない。

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

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

### C++ のマクロ
C++ではC言語のプリプロセッサマクロも依然として使用可能だが、C++にはテンプレートというマクロの発展系機能が存在する。テンプレートはプリプロセッサではなくコンパイラが解釈・展開する機能であり、マクロと比較して、より言語に密着した能力や型安全性を持つ。また、マクロは名前空間を使うことができず、そのため大規模開発時に意図しない名前衝突により破綻する危険性があるが、テンプレートは名前空間を利用することが可能であり、大規模開発にも向いている。MISRA C++ では問題点の多いマクロよりも安全なテンプレートやインライン関数オーバーロードなどを使用することを推奨している。

しかし、テンプレートではなくマクロでなければ記述できない処理もある。例えばBoost C++ライブラリにおけるBoost.Preprocessorなどのマクロを駆使したライブラリがある。マクロおよびテンプレートは、いずれも静的ダックタイピングによく利用される。プリプロセスあるいはコンパイル時点にコードが決定されるので、マクロやテンプレートを活用したプログラミングは一種のメタプログラミングである。

### Lisp のマクロ
Lisp のマクロ処理は、Lisp のプログラム自体が Lisp のリストオブジェクトで表現されるもの（S式）であることを利用し、S式をS式に変換する関数により行われるものであり、この節の他のマクロ（C++のテンプレートを除く）がテキストベース（トークンベースを含む）であるのに対し、テキストベースではない変換系である点で全く異なったものである。プログラムが実行される前に自由に構文木（S式）を操作できるため、Lisp では（他の言語におけるキーワードに相当する）特殊形式も、利用者が自由に追加変更できるという特徴となっている（なお、一部の Lisp にあるリードマクロは読み込み時に働くため、より言語をカスタムする自由度が大きい）。

Lisp でのマクロについては以下の書籍が参考になる。
* Paul Graham, *On Lisp*（邦訳版は から読める）
* Doug Hoyte, *Let Over Lambda*（）

### マクロプロセッサ
m4など、単独のマクロプロセッサもある。m4はsendmailやautotoolsで設定ファイルなどを生成するために使われている。

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

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

### キーボードマクロ
キーボードによる複数の操作を記録し、一度に再生する機能。マウスなど、キーボード以外の別のインターフェイスによる入力を含む場合もある。複雑な処理を繰り返し行う場合、作業を省力化し、操作ミスを減らすことができる。このことは、作業を自動化すると見なすこともできる。VZ Editorでは、キーボードマクロをマクロの一部として利用することができ、マクロをよく理解できない利用者も、引数を変更するだけで大量処理を短時間にできるため有用であった。

### テキストエディタにおけるマクロ
多くのテキストエディタにキーボードマクロやマクロ言語などのマクロ機能がついている。マクロ機能と正規表現を駆使すれば、高度なテキスト処理を少ない手間で行うことが可能になる。

* GNU EmacsはEmacs Lispによる拡張とキーボードマクロ機能を持つ。公開されているマクロには電子メールクライアントやウェブブラウザなど高度で複雑な機能を持つものもある。オリジナルの「Emacs」という名前はTECOエディタのマクロ集「**E**ditor **MAC**ro**S**」に由来する。
* 秀丸エディタは キーボードマクロ機能とともに、C言語に似た文法を持つマクロ言語を採用している。
* EmEditorはWSHエンジンを利用し、JScriptおよびVBScriptでの記述が可能になっている。COMオブジェクトを利用して、例えばEmEditorからMicrosoft Excel等を操作することができる。RubyやPythonなどの言語でも記述が可能。
* サクラエディタはキー入力などを自動記録するキーマクロやWSHへの対応のほか、ppa.dll（）
* ９を導入すればPascal風のマクロが記述でき、ActivePerl, ActiveRubyなどを導入することでPerlやRubyなどでもマクロを作成できる。
* MIFESはC言語に似たコンパイル型のマクロ言語MIL/Wをサポートしている。MIFESはまた、記録したキーボードマクロをMIL/Wに変換することのできる機能も持っている。
* Sublime TextはPythonの処理系を持っており、これを用いてマクロを記述することができる。実際、CとのAPIを用いて日本語IMEに対応させるマクロが記述されている。

### オフィススイートにおけるマクロ

* Microsoft Officeでは共通のマクロ言語としてVisual Basic for Applications (VBA) が使える。VBAの文法は、Visual Basicとほぼ同じである。コードはアドイン形式でも作成できるが、Office用ファイルの中に埋め込む形で保存することが多い。
** Microsoft Officeのマクロ機能を悪用したコンピュータウイルスが数多く作られており、セキュリティ上の大きな脅威になっている。
* OpenOffice.orgでは、マクロ言語としてOpenOffice.org Basic、JavaScript、Python、BeanShell（Java）が利用できる。OpenOffice.org Basicは、VBAに似たマクロ言語である。
* IBM社のSuperOfficeではマクロ言語としてLotus Scriptが使える。同様にロータスブランドのグループウェアであるNotes/DominoでもLotus Scriptを使用出来る。
* ジャストシステム社の一太郎（ワープロソフト）・花子（グラフィックソフト）・三四郎（表計算ソフト）ではマクロ言語としてSuperPlayRiteが使える。
* Google WorkspaceにはGoogle Apps ScriptというJavaScriptベースの言語がある。Googleのアプリケーション全体の自動化できる非常に強力なマクロである。マクロウイルスについてはサーバ側でチェックされるため起こらないというメリットも存在する。

### その他のアプリケーションにおけるマクロ

* バージョン2010までのMicrosoft Visual Studioには、VBAあるいはVB.NETによるマクロ機能が標準で付属していた。バージョン2012で廃止されたが、バージョン2013以降はJavaScriptでマクロを記述することのできる拡張機能（アドイン）が開発されている。
* Adobe PhotoshopやAdobe Illustratorなど、アドビ製品ではを使って各ソフトウェア上の作業を自動化することができる。ExtendScriptの文法はJavaScriptに準じている。
* 寺西高およびTeraTerm Projectによるターミナルエミュレータ、TeraTermは、マクロ言語としてTera Term Language（TTL）が利用できる。コードは、拡張子として ttl を付与したテキストファイルとして保存する。メニューからマクロを呼び出して使うほか、起動時にオプションとして指定することもできる。

### OSのマクロ

* Classic Mac OSやmacOSでは、アプリケーションに汎用的なマクロ言語としてAppleScriptが採用されている。OSを開発しているAppleのソフトウェアだけではなく、Microsoft Officeなどのサードパーティー製のソフトウェアも対応しているため、アプリケーション毎に言語の基礎的な部分から学習する必要がない。

## 脚注

## 関連項目
* プリプロセッサ