1. ホーム

[解決済み】Java「仮想マシン」vs Python「インタプリタ」の言い分け?

2022-04-05 21:20:16

質問

Pythonのquot;virtual machineは珍しいと思いますが、Javaではquot;virtual machineはよく使われます。

どちらもバイトコードを解釈しますが、なぜ一方を仮想マシンと呼び、もう一方をインタプリタと呼ぶのでしょうか?

解決方法は?

仮想マシンは、特定の言語とは関係なくサポートされる、よく定義された特定の命令セットを持つ仮想コンピューティング環境であり、一般にそれ自体がサンドボックスであると考えられています。VMは、特定のCPUの命令セットに類似しており、次の命令とは独立した非常に基本的なビルディングブロック(またはバイトコード)を使って、より基本的なレベルで動作する傾向がある。命令は、仮想マシンの現在の状態のみに基づいて決定論的に実行され、その時点の命令ストリーム内の他の情報には依存しない。

一方、インタプリタは、特定の言語、特定の文法で書かれた構文のストリームを解析するように作られており、周囲のトークンの文脈で解読しなければならないという点でより高度なものである。各バイトや各行を単独で見て、次に何をすべきかを正確に知ることはできないのです。言語のトークンは、VMの命令(バイトコード)と相対化できるように、単独で捉えることはできないのです。

JavaコンパイラはJava言語をバイトコードストリームに変換しますが、これはCコンパイラがC言語プログラムをアセンブリコードに変換するのと同じことです。一方、インタプリタは、プログラムを明確に定義された中間形式に変換するのではなく、ソースを解釈するプロセスの問題として、プログラムの動作を取り込むだけです。

VMとインタプリタの違いのもう一つのテストは、言語に依存しないと考えるかどうかということです。私たちがJava VMとして知っているものは、実はJavaに特化したものではありません。他の言語からコンパイラを作って、その結果、JVM上で実行できるバイトコードを作ることができます。一方、Python以外の言語をPythonにコンパイルして、Pythonインタプリタに解釈させるということは考えにくいでしょう。

具体的には、言語トークンなどを解析して特定し、ソースの文脈を理解して、インタプリタ内で実行処理を行えるようにすることです。このような解釈型言語を高速化するために、ここでは、より容易に直接解釈できるように、事前に解析され、トークン化されたソースコードの中間形式を定義することができます。この種のバイナリ形式は、実行時にまだ解釈されますが、パフォーマンスを向上させるために、人間が読むことのできない形式から始めているだけです。しかし、この形式を実行するロジックは仮想マシンではありません。なぜなら、これらのコードは依然として単独では解釈できないからです。周囲のトークンのコンテキストは依然として重要ですが、現在はよりコンピュータ効率の高い別の形式になっているだけです。