ロゴ(青) Excel/VBA Tips ロゴ(緑)

( 2005/11/12 : 初版  ,  2018/7/29 : MSDN 文書のネットアーカイブ リンク を追記 )

Tips13: VBA は、インタープリタか? コンパイラか?

  VBA を使っていて、
      「VBA のコンパイルって何をやってるの?」
という疑問を持った人も多いのではないでしょうか。
      「VBA はインタプリターで、ソースコードを1行ずつ実行する」
と教えられた人も多いのではないでしょうか。そして、「コンパイルって何だ?」という問いに
      「VBA のコンパイルなんて文法チェック程度のもの」
という答えを貰った人も多いでしょう。かく言う私もその一人でした。でも実は違うようです。

  インタプリタかコンパイラか、という疑問の大元は
      「exe 形式の実行ファイルが出来ず、ソースコードの形で保存され、その状態で実行される」
というインタープリタ言語の特質がある一方で、
      「デバッグメニューとオプションダイアログにある [ コンパイル ] という項目」
が 『VBA はコンパイラ言語』 と主張しているように見える為でしょう。

 調べてみると、結局の所、「インタプリタでもあり、コンパイラでもあり」というのが真相のようです。

 「コンパイル」を実行して保存すると、実行しない場合に比べてブックサイズが大きくなるという事は、
多くの人が気付いていると思います。大きくなった分は何か?という問いに対して、「Pコードというもの
を作っている」と聞いた人も居ると思います。実はこの『Pコード』がキーポイントなんです。

【 Pコード とは 】
  Pコードは、中間言語 / 擬似コード / p-code / Pseudo-Code 等とも呼ばれています。このPコー
ドという考え方を利用している最も有名な言語としては JAVA が挙げられるでしょう。

  実際にプログラムを実行するのはCPUですが、このCPUに対する低レベルな命令(マシン語)は
インテルやモトローラなどのメーカーによって異なります。当然、ひとつのプログラム(ソースコード)
を異なるCPUで実行させるには、各々のCPU向けに用意されたコンパイラで、ソースコードを各々
CPU専用のマシン語にコンパイルしなければなりません。従来のホストマシン運用などでは、プ
ログラムを作る場合に、「そのプログラムを実行させるコンピュータ(CPU)が予め決まっている」とい
うのが常でしたので何の問題もありませんでした(そのコンピュータにあるコンパイラでソースコードを
コンパイルすれば充分)。

  しかし、インターネット時代となり、
        インターネットに繋がった先にあるクライアントPC上で、
        サーバー側に保存されているプログラムを動作させる
という運用法が広がってくると、いままでの考え方のままでCPUごとに 「exe ファイル」を用意すると
いう事が現実的に無理となってきました(ネットの先にあるPCで、どのくらいの種類のCPUが使われ
ているのか等は知りようがありません)。かといって、ソースコードをネットを通して送り、インタプリタ
方式で実行するのでは処理速度が遅くて使えませんし、なにより、ソースコードそのものを送るとい
うのはセキュリティの面からも著作権の面からも問題があります。ソースコードを送って、先方のPC
でコンパイル後に実行するというのも同じ問題を抱えますので無理です。

  そこで考え出されたのが、開発サイドでは「CPUに依存しないレベルで、且つマシン語にできる
だけ近い表現」にまでソースコードを翻訳(即ち、コンパイル)し、クライアントPCでは、この翻訳結
果を1行ずつ、自身のCPUのマシン語に翻訳しながら実行(インタプリタ)するという方式です。
  開発サイドではCPUの種類・数に煩わされる事無く、ただ1種類のコンパイル結果のファイルを
用意すれば良い事になりますし、加えてクライアント側へ送るのが翻訳された結果であり、ソースコ
ードを送る必要がなくなりますので、セキュリティ・著作権等の問題点もクリアされます。
  クライアントPC側では、「1行ずつ解釈・実行する」とはいっても、かなりマシン語に近い内容に
なっているので、そのコードをマシン語に解釈するのに要する時間は僅かで済み、ほとんど exe
形式ファイルでの実行に近い性能を発揮する事が可能です(クライアントPC側で解釈実行する
プログラムは仮想マシン等と呼ばれます。[JAVA VM(Virtual Machine)] などの名前は良く聞くと
思います)。

  この方式でコンパイルされたコードが『擬似コード ( Pseudo-Code )』、即ちPコード(p-code) です。
   (参考)
    The Unix and Internet Fundamentals HOWTO
      / 11. コンピュータ言語はどのような仕組みで動いているのか (Archive )
    http://www.linux.or.jp/JF/JFdocs/Unix-and-Internet-Fundamentals-HOWTO/languages.html

    言語処理系(TinyJavaインタプリタ)開発講座
    http://leo.nit.ac.jp/~ohki/ohki/OpenLecture/Index.html

【 VBA における Pコード 】
  VBA で [ コンパイル] により生成されるものが、上記と同様の考え方で作られているPコードで
す。ソースコードから Pコードへの翻訳は、[デバッグ/コンパイル] メニューをクリックした時に行な
われます。また、オプションで[順次コンパイル]にチェックを入れてあれば、ソースコードを入力の
都度コンパイルされます。コンパイルせずに保存したブックの場合は、そのブックを開いた後で最
初のマクロが実行される前に自動的にコンパイルされます。コンパイルするとブックサイズが増える
というのはPコードの内容が付加される為です。
  では、JAVA VM に相当する仮想マシンプログラムがVBAの場合には見当たりませんが、それは
Excel やAccess などのVBAを実装するアプリケーションの中に組み込まれているものと考えられま
す。

  「本当にVBAはPコード方式を採っているのか」という問いに対しては、その根拠として下記のMS
DN文書を紹介します(MS-Access の文書ですが、Access 2000時点の文書ですので、そのVBA は
Excel と同等のもののはずです)。
    [ACC2000] Visual Basic for Applications Is Both a Compiler and an Interpreter
      https://support.microsoft.com/en-us/kb/209176  ( Internet Archive )
    (日本語ページ)
      https://support.microsoft.com/ja-jp/kb/209176  ( Internet Archive )

ただ、相変わらずMSの機械翻訳がメチャクチャですので、私のほうで和訳したものを掲載します。
   [ACC2000] Visual Basic for Applications Is Both a Compiler and an Interpreter
  https://support.microsoft.com/en-us/kb/209176

 【要約】
    この記事は、VBA(Visual Basic for Applications)言語が、コンパイル言語である
  のか、インタープリタ言語であるのかに関して解説しています。

 【詳細】
    Cのような従来のコンパイラ言語は人間が読み取れるソースコードをマシンが読み
  取れて高速で実行できるオブジェクトコードへコンパイルします。これらのオブジェク
  トプログラムは、実行に際し、実行可能なファイルへとリンクする必要があります。通
  常、コードが完全にコンパイルされるまでは構文エラーは見つかりません(逐次コン
  パイルによる場合は除きます)。

    QBasic のような従来のインタプリタ言語は、コードを書くとともに、それらのコードを
  読み取り、コンピューターの命令に翻訳するというインタープリターを使用しています。
  この方法の利点は、コードを書くと同時に、インタープリターがそのコードをテストでき
  るということです。欠点は、この1行ずつ解釈する方法が低速だということです。

    VBA(Visual Basic for Applications)言語はコンパイラとインタープリタの両方の要
  素を合わせ持ちます。

    VBAは、コードを書くと同時にそれらのコードを解釈しますが、Microsoft Access は
  バックグラウンドでこれらの解釈を実行しますので、インタープリタ処理による処理速
  度の低下は起こりません。

    このインタープリタ処理の際に、Microsoft Access は擬似コード(p-code) として知
  られているコンパイルとインタープリタの性質を兼ね備えるコードへコンパイルします。
  このp-codeによる実行はインタープリタによる実行よりも遥かに高速です。

    p-codeへのコンパイルは、最初にそのコードを実行する時、またはデバックメニュー
の[コンパイル]をクリックした時に行なわれます。

    Microsoft Access は、コンパイルされたデータベース・プログラムを安全に保存する
  為の別のメカニズムも提供します。この機能は「MDEファイルの作成」と呼ばれ、それ
  はツール・メニューのデータベース・ユーティリィティの項目にあります。

    これは、テキスト形式であるVBAコードを削除し、バイナリ形式であるコンパイル済
  のp-codeのみを保存します。データベース内にVBAコードを含んでいる場合、全て
  のモジュールをMDEファイルとして保存し、ソースコードを削除してデータベースを最
  適化します。コードを実行する事はできますが、その内容を見たり編集する事はでき
  ませんし、ソースコードの削除により、データベースファイルのサイズは小さくなります。


以上の結論としては
    VBA は、インタプリタ言語でもあり、コンパイル言語でもある。
    両者の長所を併せ持つハイブリッド言語である。
というところに落ち着くと思います。


 Home   Back Page   Next Page

ロゴ(ゴールド)   ロゴ(ゴールド)

角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2005 Allrights Reserved.