インタプリタ 長所と短所

インタプリタ

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/07/30 07:46 UTC 版)

長所と短所

開発時に修正作業が容易

プログラム開発中、プログラマは頻繁にソースコードに手を加える。コンパイラの場合、ソースコードを変更するたびにコンパイルし、リンクして実行ファイルを完成させないと、そのプログラムを実行できない。プログラムが大きくなると、ビルドの完了を待っている時間が長くなる。一方、インタプリタではソースコードをそのまま実行するか中間表現に変換するだけなので、ほとんど待つ必要がなく、修正がうまくいったかどうかのテストをより素早く確認できる。

この特性を利用したプログラムとしてREPLがある。入力を受け取る(Read)、入力の評価(Eval)、評価結果を提示する(Print)を繰り返す(Loop)、テスト環境の一つである。評価はインタプリタに限らずコンパイラで行なわれるかもしれないが、ユーザからの入力は常にソースコードの断片であり、それを逐次実行するという点で一種のインタプリタということもできる。実際、その挙動はソースコードを指定せずに起動したBASICなどのそれとよく似ている。しかし、テスト環境も兼ねているため、エラーが起きた場合のメッセージが詳細であることが多い。関数型言語論理型言語では、通常は機械語にコンパイルする処理系であっても用意される。

可搬性

AOTコンパイラ方式では事前に生成された機械語実行ファイルがユーザーに配布される。機械語はプロセッサアーキテクチャに依存するため、このバイナリは特定のプロセッサでしか動作しない(可搬性が低い)。

一方インタプリタ形式ではソースコードとインタプリタが配布される。インタプリタは機械語実行ファイルであるため環境に依存するが、ソースコードには環境に依存しない言語を採用できる。その場合環境に合わせたインタプリタを事前配布しておけば、アーキテクチャに依存しないプログラムの配布が可能である(可搬性が高い)。またインタプリタの代わりにJITコンパイラを用いても同様の利点が得られる。同一動作の保証はインタプリタ実装に依存しており(JITであればコンパイラ)、互換性バグの例として表計算マクロやWebページ(HTML)が挙げられる。

複雑性

AOTコンパイラ方式では1つのバイナリを実行するだけでプログラムが機能する。一方インタプリタ方式では、まずインタプリタをインストールしその上でソースコードを動かす必要がある。その結果全体のプログラムサイズが大きくなり、ユーザーの手間が増える場合がある(複雑性が高い)。またJITコンパイル方式でも同様の複雑性が生まれる。

可読性

インタプリタ用コード(高級言語コードあるいはバイトコード)は機械語バイナリより容易に解読できる(可読性が高い)。ゆえに配布後のデバッグや修正が容易な一方、知的財産保護上の問題を起こしうる。そのための暗号化・難読化を考慮した言語・システムが存在する。またJITコンパイル方式でも同様の可読性に関する特性が現れる。

速度

インタプリタ方式の実行速度はコンパイラ方式の実行速度よりも遅い傾向がある。

コンパイラではプログラム内のの解析を実行前に1回だけ行うが、単純な実装のインタプリタではそれを文ごとに実行時に毎回行うため、実行性能が低くなる。単純な実装のインタプリタでは変数にアクセスする際も識別子とメモリ上の位置のマッピングを確認しなければならず、しかもそれを実行中に何度も行わなければならないので、遅くなる。

またディスパッチはインタプリタが本質的に抱えるコストである。コンパイル方式では事前(コンパイル時)にディスパッチ相当の命令ボディ整列がおこなわれるため、実行時にディスパッチコストが発生しない。ゆえにインタプリタ方式ではディスパッチコスト×命令数分の追加コストが本質的に掛かる。

ディスパッチ分岐予測を難しくする。ゆえにパイプライン方式を採用するCPUにおいて速度へ影響を与える[8]。影響の大きさは分岐予測器の性能に左右され、2000年代以前のCPUではインタプリタの低速度がこのペナルティによって引き起こされるとされていた。予測器の性能が上昇した2010年代以降のCPU(例: x86 Haswell)ではその影響は小さい[9]

インタプリタによる開発の速さとコンパイラによる実行の速さの間で、様々な妥協案が考案されてきた。一部の LISP 処理系などでは、インタプリタのコードとコンパイルされたコードが相互に呼び出しあうことができ、変数も共有できる。そのため、あるルーチンをインタプリタで評価しデバッグした後、先行してコンパイルして実行性能を高めつつ、他のルーチンを開発し続けることができる。多くのインタプリタはソースコードをそのまま実行するわけではなく、よりコンパクトな内部形式に変換している。多くの BASIC インタプリタは予約語を1バイトトークンに置換し、それをジャンプテーブルのインデックスとして使用する。PBASIC など一部のインタプリタでは、バイト単位ではなくビット単位でプログラムの短縮を行っており、例えばコマンドを5ビットで表し、一般に16ビットで表される定数をその数値の大きさに対応して可変長(3、6、10、18ビットなど)で表し、アドレスオペランドとして「ビットオフセット」を用意している。多くの BASIC インタプリタは独自にトークン化された内部表現を保存し、読み込むことができる。

インタプリタがコンパイラと同様の字句解析構文解析を行い、その結果生成された抽象構文木を解釈することもある。

プログラムの実行時間はコンパイラよりもインタプリタの方が長いが、コンパイル時間と実行時間を合計すればインタプリタでの実行時間よりも長くなることがある。プロトタイピングテストにおいては、この差が重要となる。

その他の技法に制御フロー解析静的単一代入がある。


注釈

  1. ^ この意味では、CPUは機械語インタプリタであると見ることができる。
  2. ^ 現在では、「インタプリタ / コンパイラ」という区分に関しては状況が変わっており、[誰?]に言わせると『だが、それらは必ずしも相互排他的に2つに分類できるわけではない。なぜなら多くのインタプリタ方式の処理系は、コンパイラが行っているような変換も内部で行っているからだ。[要出典]」とも言われ、『「インタプリタ言語」あるいは「コンパイラ言語」といった呼称も見掛けることがあるが、これらは単にその言語の規範的実装がインタプリタかコンパイラかを示しているに過ぎない(実際、詳しく調べれば、実験的な程度の実装まで含めれば両方ともあるということも多い)。』という見解も出てくることになる。高水準言語は基本的に抽象であり、(理想的には)特定の実装からは独立している。しかし、動的プログラミング言語のようにインタプリタでの実装が向いている方向性の言語、あるいはその逆もあるということは確かである。
  3. ^ つまり、近年では高速化にはキャッシュのほうが重要なので、高速化に有利か否かはわからない。

出典

  1. ^ bit 編集部『bit 単語帳』共立出版、1990年8月15日、19頁。ISBN 4-320-02526-1 
  2. ^ a b "An interpreter dispatches a virtual instruction body to emulate each virtual instruction in turn." Zaleski (2007). YETI: a GraduallY Extensible Trace Interpreter. University of Toronto.
  3. ^ "we defined dispatch as the mechanism used by a high level language virtual machine to transfer control from the code to emulate one virtual instruction to the next." Zaleski (2007). YETI: a GraduallY Extensible Trace Interpreter. University of Toronto.
  4. ^ 日本のソフトウェアの草創期:座談会:日本のソフトウェアの草創期
  5. ^ Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I のこと
  6. ^ History of Lisp の、§3 の最後のほうに、次のようにある「S.R. Russell noticed that eval could serve as an interpreter for LISP, promptly hand coded it, and we now had a programming language with an interpreter. (段落) The unexpected appearance of an interpreter ...(後略)」
  7. ^ ポール・グレアムの『ハッカーと画家』(原著「Hackers & Painters、185ページ)によれば、マッカーシーは「ラッセルは『ねえ、この eval をプログラムしようか』と言った。…私は『ほう、ほう。君は理論と実際を混同している。この eval は読み物として書いたもので、実際に動かすために書いたものじゃない』と答えた。しかし彼はそれをやってのけた。つまり彼は私の論文にある evalIBM 704 の機械語にコンパイルして、バグを修正し、それを LISP インタプリタだと宣伝したし、実際それはそのとおりだった。だからその時点で LISP は今日のような形態を本質的に備えていた」と述べたという。
  8. ^ "Conventional wisdom states that this indirect jump incurs a major performance degradation on deeply pipelined architectures because it is hardly predictable" Rohou, et al. (2015). Branch Prediction and the Performance of Interpreters - Don’t Trust Folklore. International Symposium on Code Generation and Optimization, Feb 2015, Burlingame, United States.
  9. ^ "we show that the accuracy of indirect branch prediction is no longer critical for interpreters." Rohou, et al. (2015). Branch Prediction and the Performance of Interpreters - Don’t Trust Folklore. International Symposium on Code Generation and Optimization, Feb 2015, Burlingame, United States.
  10. ^ AST intermediate representationsLambda the Ultimate forum
  11. ^ A Tree-Based Alternative to Java Byte-Codes — トーマス・キスラー、マイケル・フランズ
  12. ^ Annoucing SquirelFish
  13. ^ L. ドイチュ、A. シフマン、Efficient implementation of the Smalltalk-80 systemProceedings of 11th POPL symposium、1984年





英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「インタプリタ」の関連用語

インタプリタのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



インタプリタのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのインタプリタ (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2024 GRAS Group, Inc.RSS