「先輩,スクリプトって,テキスト・ファイルを保存するだけで作れるから手軽ですね」
「そうだね。ちょっと性能は出ないから用途は選ぶけど,十分お釣りが来るくらい使い手はあるよね。ただ,開発環境がちょっと弱いんだよな」
「でもこの前のスクリプトは,Visual Basicみたいな環境で作れましたけど」
「それはExcelのマクロじゃないかな。スクリプトとは似て非なるものさ」
「そうなんですか。でも文法とかほとんど一緒じゃないですか」
「でも,仕組みはちょっと違うんだ」

 マクロとスクリプト。どちらも手軽なプログラミング環境として多くのユーザに使われている。だが,両者の意味合いは微妙に違う。

リスト1●シェル・スクリプトの例。
例えば標準シェルを使った場合(a)と,Perlを使った場合(b)では,1行目で解釈するエンジンを変えている。あとは,そのエンジンの文法に基づいて記述することになる

 そもそもマクロとは,「大きい」とか「長い」とかいう意味の接頭辞である( 「こんなマクロ,あんなマクロ」参照)。お手軽プログラミング環境としてのマクロは,バッチ処理的に“大きくまとめたもの”ということになる。この意味からすると,例えばMS-DOSのバッチ・ファイルなどもマクロと言えなくもない。一般にマクロと呼ぶのは,アプリケーション・ソフトの上で動く「まとまった処理」のことが多い。アプリケーション・ソフトが備える機能を組み合わせて,定型的な処理を再現するものである。

 一方の「スクリプト」には,「台本」とか「下書き」とかいう意味がある。だから「手軽に書いた手順書」といったところだろう。テキスト・ファイルでさらっと書いて,その場で実行したらあとは忘れてもよいような,手軽な処理を記述することが多い。PerlやRubyなどがスクリプト言語と呼ばれるのは,テキスト・ファイルに記述したプログラムを,そのまま実行エンジンにかければ,プログラムの実行が始まるからだ。コンパイルだ,リンクだといったプロセスを必要としない。

 スクリプトという言葉が最初に使われたのは,UNIXのシェル・スクリプトだろう。この仕組みもPerlやRubyと本質的に変わらない。コマンドを解釈して実行する「コマンド・シェル」自体がスクリプトの実行エンジンとなっている。だからシェル・スクリプトの代わりにPerlやRubyを使うこともできる(リスト1[拡大表示])。1行目で指定しているのが,解釈して実行するエンジンとなるプログラムである。また最近多くのWebアプリケーション開発で使われているPerlのスクリプトも,仕組みはこれと同じである。CGI(Common Gateway Interface)というインタフェースを通じて,スクリプトに処理の実行を依頼し,その処理結果を受け取っているだけである。ときどきPerlで書かれたスクリプトとCGIをごっちゃにしていることがあるが,CGIはインタフェースにすぎない。起動するプログラムが,CGIの利用するインタフェースに対応していさえすればよい注1)。PerlであろうとRubyであろうと,あるいはCで書かれたプログラムであっても構わないのだ。

図1●マクロとスクリプトの違い

実行する環境が違う

 ではスクリプトとマクロの違いとは何だろうか。結論的に言ってしまえば,その稼働環境の違いということになる(図1[拡大表示])。スクリプトの場合は,必ずしもアプリケーションに依存しない実行環境の上で動く。例えばWindows 98から標準搭載された「Windows Script Host」では,JavaScriptやVisual Basic Script(VBS)で書かれたプログラムを実行できる。OSに実行エンジンが組み込まれているからだ。APIを通じてサード・パーティ製のスクリプティング・エンジンを組み込むことも可能だ注2)。

 一方マクロの場合,アプリケーション・ソフトが備えるさまざまな機能を利用する形になる。例えばエディタ用のマクロであれば,クリップボードの内容を挿入したり,置換を実行するなどユーザがメニューを通じて実際に操作する内容と同じことができる。エディタなどの場合は,普通のプログラミング言語に近い文法で記述するものが多い。例えば秀丸エディタでは,文法的にC言語に近いものになっている(リスト2)。

リスト2●秀丸エディタのマクロの例。
中カッコ({})でブロックを作ったり,セミコロン(;)をセパレータにしているなど,C言語に近い文法構造になっている

 表計算ソフトでも,Microsoft OfficeのようにVisual Basic for Applications(VBA)を使うものはかなりプログラミング言語らしい文法になっている。しかし以前のLotus 1-2-3のマクロなどは,かなり独自の規約に基づいていた(図2[拡大表示])。1-2-3では,キー操作に対応するコマンドをそのままシートに記述する。それをシートの上から下へ順番に実行していくという形を採っていた。また以前のExcelのマクロも,アイデアは1-2-3に近かった。個々の機能に対応する関数が定義されており,それを順番に並べていくというスタイルである。制御構造があるようなちょっと複雑なマクロを定義しようとすると,かなりトリッキーな記述をしなければならなくなる(図3[拡大表示])。

 当時のパソコンの主記憶容量や,MS-DOSというOSの機能を考えれば,別形態のエディタを用意するのは難しい。となれば,シートにマクロを記述できるようにせざるを得なかったのだ。これは表計算ソフトに限らない。例えばデスクトップ・データベースの「桐」の「一括処理」のエディタも,データベース操作とほぼ同じ方式になっていた。

図2●MS-DOS時代の表計算ソフトにおけるマクロ記述例。
1989年に出ていたLotus 1-2-3やMicrosoft Excelでは,かなり独特な表記法を使ってマクロを記述していた。ただ当時でも,WingzなどはVisual Basicに近い文法のマクロを利用できた。ちなみにWingzは,現在英Investment Intelligence Systems Group社が開発・販売している。Linux版もある
 
図3●独特な制御構造の例。
かなりトリッキーで,可読性は低い。特に1-2-3のマクロの制御構造はかなり独特である




リストA●Cにおけるマクロの例。
引数をとれるので,一見すると関数のように見えるが,コンパイル前にマクロを展開したソースに変換される
●こんなマクロ,あんなマクロ

 マクロという言葉自体はいろいろな場面で使われる。例えば,カメラの「マクロ撮影」。等倍で大きく接写するのに使う言葉だ。また,LSIの「マクロ・セル」というのも,機能単位でまとめた設計情報のこと(IPとも言う)を指す。大局的に見ることを,「マクロ・スコーピック」ということもある。
 プログラミング関連でも,別の意味がある。例えば「マクロ・アセンブラ」である。アセンブラの場合,一つひとつの命令自体はごく単純なものだ。そこで,いくつかの命令ステップをまとめておいて,定型的に再利用したりするための「マクロ」として定義する。C言語の「マクロ」も同じ意味だ(リストA[拡大表示])。


(北郷 達郎、八木 玲子)