インタプリタ
インタプリタ(interpreter)とは、プログラミング言語で書かれたソースコード、ないし中間表現を逐次解釈しながら実行するプログラムのこと。プログラムの実行に主としてインタプリタを用いるプログラミング言語をインタプリタ言語と呼ぶ。一括して翻訳するコンパイラと対比される。Javaのように、中間表現に変換するコンパイラと、中間表現を実行するインタプリタに分ける、という構成をとるものもある。
目次 |
[編集] 定義
以下の擬似コードの形で実装される処理系を指す。
while (true) { switch (実行する命令) { case 命令1: 命令1の処理 case 命令2: 命令2の処理 } }
[編集] 特徴
以下の特徴を持つ。
- 処理速度がコンパイラ方式よりも遅い。
- コンパイラ方式よりも実装コストが小さい。
インタプリタ方式が速度が遅くなる、最大の原因は一命令ごとにswitch文を実行することにある。現代のCPUはパイプライン方式を採用しており、命令の先読みが可能でないと、実行速度が著しく低下する。switch文の場所が命令の先読みが不可能であるため、インタプリタ方式は遅くなる。インタプリタ方式で実装された処理系を高速化(最適化)するための、最初にとられるステップがswitch文を廃止し、コンパイラ方式に切り替えることである。それゆえ、実装不可能というわけではないが、効果が薄いため、インタプリタ方式で実装する場合は、一般には、制御フロー解析や静的単一代入などを使った、複数の命令を超えての最適化が実装されないことが多い。
ほぼ全てのプログラミング言語が、インタプリタ方式でもコンパイラ方式でもどちらでも実装可能である。しかしながら、変数に型を持たないスクリプト言語では、高速に動作することがあまり期待されておらず、JavaScriptやLuaなどをのぞいて、多くの物が実装の容易なインタプリタ方式で実装されている。
また、最近の処理系では、Javaや.NET Frameworkなど、JITコンパイラを利用している物の中で、起動時にコンパイルすると起動が遅くなるため、まず、最初にインタプリタで動かし、バックグラウンドでコンパイルして、コンパイルが完了してから、そちらに切り替える、併用型もある。
処理系の開発において、まず初めに実装の容易なインタプリタで実装してから、コンパイラに切り替えることも多い。例えば、Javaは、最初のJDK 1.0はインタプリタで、JDK 1.1からJITコンパイラを搭載している。Adobe FlashはFlash 8まではインタプリタであったが、Flash 9からJITコンパイラになった。JavaScriptも、1995年の登場当初から長いことインタプリタでの実装が主流であったが、2009年頃からJITコンパイラが増えた。
インタプリタはプログラムを逐次機械語に変換して実行する、という説明を仄聞するが、それは正しくない。そのような動作は動的コンパイルという別の技術によるものである(動的コンパイルをおこなうインタプリタもある)。
[編集] バイトコードインタプリタ
ソースコードを実行可能な形にするには、まず、ソースコードを構文木に変換する必要がある。構文木のまま、インタプリタ型の処理系で実行する処理系もあるが、構文木をさらに、中間コード(バイトコードなど)に変換してから実行する物もある。中間コードをバイトコードと呼んでいる処理系ではそのインタプリタをバイトコードインタプリタと呼ぶ。Javaや.NET Frameworkのように、中間コードの仕様を公開しファイルに書き出すものもあるし、仕様は公開せず処理系内部だけで使用するものもある。動的コンパイルを使っているインタプリタは、内部で実機の機械語に変換し実行する。
[編集] デバッグ、教育用インタプリタ
通常C言語はコンパイラで処理されるが、デバッグ目的および教育目的のインタプリタ型のC言語の処理系もある。MS-DOS時代に、いくつかの製品が提供されていた。C-Terpなどがその様な製品の例である。C/C++のインタプリタはほかにCINTやChがある。
[編集] インタプリタ型の処理系が一般的なプログラミング言語
[編集] インタプリタとコンパイラ方式が併用の物
- Java(JDK 1.0はインタープリタのみ。JDK 1.2以降は、併用方式。)
- JavaScript (Firefox 3.5は併用方式、Google Chromeはコンパイラのみ、Internet Explorer 8まではインタープリタのみ)
- Lua (LuaJIT)
- .NET Framework(C#など)