(Translated by https://www.hiragana.jp/)
インタプリタ - Wikipedia

インタプリタ

プログラミング言語げんごかれたソースコードないし中間ちゅうかん表現ひょうげん逐次ちくじ解釈かいしゃくしながら実行じっこうするプログラム

インタプリタえい: interpreter)とは、プログラミング言語げんごかれたソースコードないし中間ちゅうかん表現ひょうげん逐次ちくじ解釈かいしゃくしながら実行じっこうするプログラムのこと[1]。「インタープリタ」「インタープリター」などと表記ひょうきすることもある。

インタプリタは、およそつぎのいずれかの動作どうさをするプログラムである。

  1. ソースコード直接ちょくせつ解釈かいしゃく実行じっこうする。
  2. ソースコードをなんらかの効率こうりつてきなかあいだてきなコード(中間ちゅうかん表現ひょうげん)に、最初さいしょすべ変換へんかんして、あるいは、逐次ちくじ変換へんかんしながら、解釈かいしゃく実行じっこうする。
  3. なんらかのコンパイラ生成せいせい出力しゅつりょくした、なんらかの効率こうりつてきな(マシンに依存いぞんしない、あるいは、マシン依存いぞんの)ちゅうあいだ表現ひょうげん解釈かいしゃく実行じっこうする[ちゅう 1]

このように程度ていどはあるが、ソフトウェアがソフトウェアを実行じっこうするというかたちになる。

いずれにしても、「インタプリタ言語げんご」などという分類ぶんるい本来ほんらい存在そんざいしない。たんにそれぞれの言語げんご代表だいひょうてき処理しょりけい実装じっそうがインタプリタであったというだけで、理論りろんじょうはどの言語げんごであってもインタプリタとコンパイラのどちらでもつくることができる。しかしながら、インタプリタかしか存在そんざいしない言語げんごがあるがゆえに、「インタプリタ言語げんご」や「コンパイラ言語げんご」と区別くべつされているのが現実げんじつである。インタプリタは実行じっこうちゅうなんもプログラムをさい解釈かいしゃくするため、ダイナミックディスパッチ英語えいごばんダイナミックバインディングリフレクション動的どうてき型付かたつのような機能きのう実現じつげんすることが容易よういである。一方いっぽう、コンパイラは事前じぜんにCPUで実行じっこうできるように変換へんかんするだけで実行じっこうには関与かんよしないため、実行じっこうちゅういを変更へんこうしたいときはそのためのプログラムを別途べっと用意よういしなければならないケースがほとんどである。さらに、自前じまえ言語げんごから既存きそんなんらかの表現ひょうげん変換へんかんするには、その表現ひょうげん対応付たいおうづけるための知識ちしき技術ぎじゅつ必要ひつようであり、言語げんご機能きのうだい規模きぼ複雑ふくざつするほど、既存きそん表現ひょうげんとの互換ごかんせいをできるだけ確保かくほしながら、自前じまえ言語げんごでのいを実現じつげんすることはむずかしくなる。中間ちゅうかん表現ひょうげん自前じまえであれば、変換へんかんする手間てまはずっとらくになる。

インタプリタはかく仮想かそう命令めいれいひもづく命令めいれいボディとディスパッチ機構きこうをもち、ホストマシンじょう実行じっこう可能かのうになっている(れい: x86マシンコードbinファイル)。仮想かそう命令めいれいぐんからなるコードを引数ひきすうとしてインタプリタが実行じっこうされると、仮想かそう命令めいれいもとづいて制御せいぎょ移行いこうされ対応たいおうする命令めいれいボディが実行じっこうされる。これをかえすことでインタプリタはコードを実行じっこうする。

命令めいれいボディ

編集へんしゅう

命令めいれいボディえい: instruction body命令めいれい本体ほんたいとも)は仮想かそう命令めいれいをホスト言語げんごエミュレートするコードである[2]命令めいれいボディがホストマシンで実行じっこうされることで仮想かそう命令めいれい事実じじつじょう実行じっこうされる。すなわち命令めいれいボディは仮想かそう命令めいれい実装じっそうである。たとえばこう仮想かそう命令めいれい ADD2対応たいおうしてC言語げんごかれた push(pop() + pop())命令めいれいボディである。

ディスパッチ

編集へんしゅう

ディスパッチえい: dispatch)は仮想かそう命令めいれいもとづいた命令めいれいボディから命令めいれいボディへの制御せいぎょ移行いこうメカニズムである[2][3]。ディスパッチのもっともシンプルなれいSwitchぶんJump命令めいれい)である。ある仮想かそう命令めいれい実行じっこうつぎ仮想かそう命令めいれい対応たいおうする命令めいれいボディへ制御せいぎょうつす(Jumpする)ことでその仮想かそう命令めいれい実装じっそう実行じっこうされる。

プログラミング言語げんご処理しょりけい実装じっそうには、インタプリタとコンパイラの2つがある、とされてきた。インタプリタは実行じっこうおこなが、コンパイラは実行じっこうおこなわない、というがある。

インタプリタは、インタプリタが提供ていきょうする言語げんごのプログラムぶんを1ぶんずつ、インタプリタを実装じっそうした言語げんご機能きのうしていく(単純たんじゅんな)方式ほうしき一般いっぱんてきであった。コマンドラインインタプリタではこれにくわえて、べつのプログラムに処理しょりゆだねてひとつの機能きのう実現じつげんする。

この時代じだいのインタプリタの長所ちょうしょ欠点けってんについては、およそつぎのような解説かいせつがされることが一般いっぱんてきであった。

  • 長所ちょうしょ)プログラムを作成さくせいしている途中とちゅうでも、とりあえずかれた箇所かしょまで実行じっこうさせることができ、プログラマの期待きたいどおりの動作どうさをしている場合ばあいも、期待きたいどおりの動作どうさをしていない場合ばあいも、早期そうきにそれを確認かくにん発見はっけんし、そして修正しゅうせいすばやく実行じっこうさい確認かくにんできる。
  • 短所たんしょ実行じっこう速度そくどおそい。(ループ(=かえし)の箇所かしょなどでは)1構文こうぶん解釈かいしゃくしたぶんでも、毎回まいかい(あらためて、最初さいしょから)解釈かいしゃく実行じっこうおこなうので、コンパイラ方式ほうしきくらべて実行じっこう速度そくどおそくなる。(ループをまったふくまないような、すべての命令めいれいいちかいだけ解釈かいしゃくされ、一回いっかいだけ実行じっこうされるような(ある意味いみ特殊とくしゅな)プログラムであれば、解釈かいしゃく+実行じっこうのトータルの時間じかんは、インタプリタでもコンパイラでもさほどしょうじない。だが、実用じつようてきなプログラムは一般いっぱんてきに、多数たすうのループをふくんでおり、そうしたプログラムではインタプリタのほうが実行じっこう完了かんりょうするまでの時間じかんおおくかかり、とくに、ループ回数かいすうおおければおおいほど(古典こてんてきな、単純たんじゅんな)インタプリタの相対そうたいてきおそさは顕著けんちょになってくる。→#長所ちょうしょ短所たんしょ

その、そうした欠点けってん解消かいしょうすべく、(1990年代ねんだいころになって)毎回まいかい毎回まいかい、(高級こうきゅう言語げんごから)機械きかい変換へんかんするのではなく、中間なかま言語げんご変換へんかんすることで高速こうそくをはかるインタプリタなどがつくりだされた。

改良かいりょう結果けっか古典こてんてき意味いみでの「インタプリタ」と「コンパイラ」の双方そうほう性質せいしつそなえたようなインタプリタが登場とうじょうし、複雑ふくざつしてきている。

近年きんねんの)インタプリタがおこなう、(旧来きゅうらいの)コンパイラがおこなっているような変換へんかんのひとつとしては、高速こうそくなどを目的もくてきとした、実行じっこうコンパイラによる動的どうてきコンパイルげることができる。

[ちゅう 2]

インタプリタという手法しゅほう、すなわち、「そのハードウェアが直接ちょくせつ解釈かいしゃくするのではないプログラム」をり、「プログラムで実装じっそうされた抽象ちゅうしょうてきな、あるいは仮想かそうじょうのコンピュータで解釈かいしゃく実行じっこうする」というプログラムの実行じっこうほうは、コンピュータが登場とうじょうしたときから、ないしそれ以前いぜんからある。

万能ばんのうチューリングマシンは、「どんなチューリングマシンについても、それを模擬もぎできるチューリングマシン」というもので、あるしゅエミュレータないしインタプリタであり、考察こうさつされたのは電子でんししきのコンピュータの誕生たんじょうする以前いぜんである。

EDSAC実用じつようてき機能きのうったプログラム内蔵ないぞう方式ほうしき世界せかいはつ電子でんし計算けいさんとされている)においてすでに、あるしゅのインタプリタが実装じっそうされていたことが記録きろくのこっている。同機どうきにおけるプログラミングの技法ぎほうかれた The Preparation of Programs for an Electronic Digital Computer の chapter 2 の § 2-22 Interpretive subroutines説明せつめいされているが、複素数ふくそすう演算えんざんなどのサブルーチンを明示めいじてきにサブルーチンとしてぶのではなく、通常つうじょう加減算かげんざんなどと同様どうよう形式けいしきのプログラムをインタプリタで解釈かいしゃくしてそれらのサブルーチンを利用りようする、というものである。また日本にっぽんにおいても、パンチカード入力にゅうりょくとしてパッチパネル配線はいせんによるプログラミングで処理しょりするような機械きかいで、配線はいせんによってあるしゅのインタプリタのようなものを実装じっそうし、パンチカードの内容ないようをデータとしてではなくプログラムのようにあつかう、というようなれいがあるとわれている[4]

最初さいしょの Lisp インタプリタはスティーブ・ラッセルIBM 704 うえ実装じっそうした。これにはエピソードがあり、ジョン・マッカーシーが「Lisp の論文ろんぶん[5]で「数学すうがくてき」にしめしたものだったのであるが、マッカーシー自身じしん実装じっそうできるものだとはかんがえていなかった。それを、論文ろんぶんんだ、院生いんせいであったラッセルが、実装じっそう可能かのうだとって数学すうがくてき記述きじゅつから変換へんかんして機械きかい実装じっそうしてみせたという。[6][7]

1960年代ねんだいには(現在げんざいのJavaなどと同様どうような)、プログラミング言語げんごから中間ちゅうかん表現ひょうげんにコンパイルし、それをインタプリタで実行じっこうする、というような手法しゅほう一般いっぱんてきになった(pコードマシン参照さんしょう)。

長所ちょうしょ短所たんしょ

編集へんしゅう

開発かいはつ修正しゅうせい作業さぎょう容易ようい

編集へんしゅう

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

この特性とくせい利用りようしたプログラムとして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種類しゅるいというべきかもしれない。仮想かそう関数かんすうテーブルテーブルジャンプによるフロー制御せいぎょていなくもない。

スレッデッドコードは、されるべきサブルーチンのアドレスのみが順番じゅんばん羅列られつされたものである。「直接ちょくせつスレッディング」の場合ばあいは、そのアドレスがさき機械きかいのサブルーチンである。ほかにもいくつかのバリエーションがある。「サブルーチン・スレッディング」はもっとちがうタイプのバリエーションで、アドレスのみではなく、機械きかいのCALL命令めいれいとして羅列られつするので、ハードウェアのプロセッサで直接ちょくせつ実行じっこうできる。これは実行じっこうのオーバーヘッドは極小きょくしょうだが、メモリ効率こうりつわる[ちゅう 3]。サブルーチン・スレッディング以外いがいのスレッデッドコードは、きわめて単純たんじゅんなインタプリタで実行じっこうできる。Forthでは「内部ないぶインタプリタ」とんでいる(これは、Forth言語げんご自体じたい実装じっそうしているインタプリタである「外部がいぶインタプリタ」とたいになっている)。

バイトコード

編集へんしゅう

ソースコードを実行じっこう可能かのうかたちにするには、まず、ソースコードを構文こうぶん変換へんかんする必要ひつようがある。構文こうぶんのまま、インタプリタがた処理しょりけい実行じっこうする処理しょりけいもあるが、構文こうぶんをさらに、中間なかまコード(バイトコードなど)などの中間ちゅうかん表現ひょうげん変換へんかんしてから実行じっこうするものもある。中間なかまコードをバイトコードとんでいる処理しょりけいではそのインタプリタをバイトコードインタプリタとぶ。Java.NET Framework のように、中間なかまコードの仕様しよう公開こうかいしファイルにすものもあるし、仕様しよう公開こうかいせず処理しょりけい内部ないぶだけで使用しようするものもある。動的どうてきコンパイル使つかっているインタプリタは、内部ないぶ実機じっき機械きかい変換へんかん実行じっこうする。

インタプリタとコンパイラのあいだには様々さまざまなかあいだてき実装じっそう存在そんざいし、それぞれにプログラム実行じっこうまえおこなわれる解析かいせき度合どあいがことなる。たとえば Emacs Lispバイトコードにコンパイルされ、LISP のソースを高度こうど圧縮あっしゅく最適さいてきした表現ひょうげんにしているが、それは機械きかいコードではない(したがって特定とくていのプラットフォームに依存いぞんしない)。この「コンパイル」されたコードを解釈かいしゃくするのがバイトコードインタプリタである(それ自体じたいCかれている)。この場合ばあいのコンパイルされたコードは仮想かそう機械きかい機械きかいコードであり、仮想かそう機械きかいはハードウェアで実装じっそうされておらず、バイトコードインタプリタとして実装じっそうされている。同様どうよう手法しゅほうOpen Firmware システムで使つかわれている Forth コードでも使つかわれている。ソース言語げんごは「Fコード」(バイトコードの一種いっしゅ)にコンパイルされ、それを仮想かそう機械きかい解釈かいしゃく実行じっこうする。Pコードマシンなどがある。

コントロール・テーブル英語えいごばんはコンパイラをとおさなくとも生成せいせいでき、バイトコードインタプリタと同様どうよう方法ほうほうでカスタマイズされたインタプリタでの適切てきせつなアルゴリズムてき制御せいぎょ構造こうぞう記述きじゅつできる。

抽象ちゅうしょう構文こうぶん

編集へんしゅう

インタプリタとコンパイラのなかあいだてき手法しゅほうの1つとして、ソースコードを最適さいてきされた抽象ちゅうしょう構文こうぶん (AST) に変換へんかんし、その構造こうぞうにしたがってプログラムを実行じっこうするか、実行じっこうコンパイラでの機械きかいコード生成せいせい使用しようする方法ほうほうがある[10]。この方式ほうしきではかくぶんを1かいだけ構文こうぶん解析かいせきする必要ひつようがある。バイトコードにくらべると、ASTではプログラムの全体ぜんたいてき構造こうぞうぶんぶん関係かんけい保持ほじでき(それらはバイトコードではうしなわれる)、圧縮あっしゅくするとさらにコンパクトな表現ひょうげんになる[11]。そのため、実行じっこうコンパイラにとってはバイトコードよりもASTのほうすぐれたなかあいだ表現ひょうげんだとして提案ていあんされてきた。また、実行じっこう解析かいせきもよりすぐれたものにできる。

しかし、ASTはバイトコードよりも冗長じょうちょうであるため、インタプリタとしてはオーバーヘッドがおおきくなるという問題もんだいがある[12]CRuby場合ばあいは、1.8までは構文こうぶんインタプリタであったが、1.9では(開発かいはつちゅうには YARVばれていた)バイトコードインタプリタにえられ、性能せいのう向上こうじょうした。

実行じっこうコンパイル

編集へんしゅう

インタプリタとコンパイラの境界きょうかいをさらにぼやけさせる方式ほうしきとして、中間ちゅうかん表現ひょうげん実行じっこうコンパイラ (JIT) でコンパイルし、実行じっこうにネイティブの機械きかいにコンパイルする技法ぎほうがある。これはネイティブなコードの実行じっこう効率こうりつ実現じつげんするわり、ASTやバイトコードを最初さいしょにコンパイルするさい起動きどう時間じかんやメモリ使用しようりょう増大ぞうだいするという欠点けってんがある。これをおぎな技法ぎほうとして適応てきおうてき最適さいてき英語えいごばんがあり、インタプリタが実行じっこうちゅうのプログラムを性能せいのう解析かいせきしてもっと頻繁ひんぱん実行じっこうされる部分ぶぶんをネイティブのコードにコンパイルする。これらの技法ぎほうは1980年代ねんだいSmalltalk などの言語げんご使つかわれはじめた[13]

実行じっこうコンパイルは近年きんねんおおくの言語げんご処理しょりけい採用さいようされており、Java.NET Framework最近さいきんJavaScript実装じっそうでも JIT が採用さいようされている。

トランスレータ方式ほうしき

編集へんしゅう

のインタプリタ言語げんご変換へんかんして、ターゲット言語げんごのインタプリタじょう実行じっこうする方式ほうしきたとえば CoffeeScriptJavaScript変換へんかんされて、JavaScript インタプリタじょう実行じっこうされる。

応用おうよう

編集へんしゅう

デバッグ、教育きょういくよう

編集へんしゅう

通常つうじょうC言語げんごはコンパイラで処理しょりされるが、デバッグ目的もくてきおよび教育きょういく目的もくてきのインタプリタがたのC言語げんご処理しょりけいもある。MS-DOS時代じだいに、いくつかの製品せいひん提供ていきょうされていた。C-Terpなどがそのよう製品せいひんれいである。C/C++のインタプリタはほかにCINTChがある。

パンチカード

編集へんしゅう

パンチカードシステムにおいて、パンチカードんで、その内容ないよう人間にんげんめる形式けいしき文字もじ)でパンチカードじょう印字いんじする機械きかいをインタプリタとぶ。たとえば、IBM 550英語えいごばん Numeric Interpreter (1930ねん) や IBM 557英語えいごばん Alphabetic Interpreter (1954ねん) がある。

プログラミング言語げんご

編集へんしゅう

インタプリタとコンパイラ方式ほうしき併用へいようのもの

編集へんしゅう

共通きょうつう言語げんごランタイム」のバイナリー・コードにコンパイルされるもの

編集へんしゅう

Erlang VM」(BEAM)のバイナリー・コードにコンパイルされるもの

編集へんしゅう

Java仮想かそう機械きかい」のバイナリー・コードにコンパイルされるもの

編集へんしゅう

JavaScript変換へんかんされるもの

編集へんしゅう

Lua VM」のバイナリー・コードにコンパイルされるもの

編集へんしゅう

「Pコードマシン」のバイナリー・コードにコンパイルされるもの

編集へんしゅう

Parrot」のバイナリー・コードにコンパイルされるもの

編集へんしゅう

Smalltalk VM」のバイナリー・コードにコンパイルされるもの

編集へんしゅう

VBAのPコードにコンパイルされるもの

編集へんしゅう

脚注きゃくちゅう

編集へんしゅう

注釈ちゅうしゃく

編集へんしゅう
  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ねん

関連かんれん項目こうもく

編集へんしゅう

外部がいぶリンク

編集へんしゅう

この記事きじは2008ねん11月1にち以前いぜんFree On-line Dictionary of Computingから取得しゅとくした項目こうもく資料しりょうもとに、GFDL バージョン1.3以降いこうの「RELICENSING」(さいライセンス) 条件じょうけんもとづいてまれている。