[解決済み】Java「仮想マシン」vs Python「インタプリタ」の言い分け?
質問
Pythonのquot;virtual machineは珍しいと思いますが、Javaではquot;virtual machineはよく使われます。
どちらもバイトコードを解釈しますが、なぜ一方を仮想マシンと呼び、もう一方をインタプリタと呼ぶのでしょうか?
解決方法は?
仮想マシンは、特定の言語とは関係なくサポートされる、よく定義された特定の命令セットを持つ仮想コンピューティング環境であり、一般にそれ自体がサンドボックスであると考えられています。VMは、特定のCPUの命令セットに類似しており、次の命令とは独立した非常に基本的なビルディングブロック(またはバイトコード)を使って、より基本的なレベルで動作する傾向がある。命令は、仮想マシンの現在の状態のみに基づいて決定論的に実行され、その時点の命令ストリーム内の他の情報には依存しない。
一方、インタプリタは、特定の言語、特定の文法で書かれた構文のストリームを解析するように作られており、周囲のトークンの文脈で解読しなければならないという点でより高度なものである。各バイトや各行を単独で見て、次に何をすべきかを正確に知ることはできないのです。言語のトークンは、VMの命令(バイトコード)と相対化できるように、単独で捉えることはできないのです。
JavaコンパイラはJava言語をバイトコードストリームに変換しますが、これはCコンパイラがC言語プログラムをアセンブリコードに変換するのと同じことです。一方、インタプリタは、プログラムを明確に定義された中間形式に変換するのではなく、ソースを解釈するプロセスの問題として、プログラムの動作を取り込むだけです。
VMとインタプリタの違いのもう一つのテストは、言語に依存しないと考えるかどうかということです。私たちがJava VMとして知っているものは、実はJavaに特化したものではありません。他の言語からコンパイラを作って、その結果、JVM上で実行できるバイトコードを作ることができます。一方、Python以外の言語をPythonにコンパイルして、Pythonインタプリタに解釈させるということは考えにくいでしょう。
具体的には、言語トークンなどを解析して特定し、ソースの文脈を理解して、インタプリタ内で実行処理を行えるようにすることです。このような解釈型言語を高速化するために、ここでは、より容易に直接解釈できるように、事前に解析され、トークン化されたソースコードの中間形式を定義することができます。この種のバイナリ形式は、実行時にまだ解釈されますが、パフォーマンスを向上させるために、人間が読むことのできない形式から始めているだけです。しかし、この形式を実行するロジックは仮想マシンではありません。なぜなら、これらのコードは依然として単独では解釈できないからです。周囲のトークンのコンテキストは依然として重要ですが、現在はよりコンピュータ効率の高い別の形式になっているだけです。
関連
-
[解決済み】Pythonのvirtualenvを離脱/終了/無効化する方法
-
[解決済み] XX:MaxDirectMemorySizeの既定値
-
[解決済み] init-paramとcontext-param
-
[解決済み] Javaコンパイラーエラー:ステートメントではありません
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] Pythonで標準エラー出力するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 最も近い整数への切り捨て - 私は不正をしているのでしょうか、それともこれは十分すぎるほど適切なのでしょうか?
-
[解決済み] JDBC タイプの方言マッピングがありません。1111
-
[解決済み] アクティビティに割り当てられない
-
[解決済み] publicId と systemId の間に空白が必要です。
-
[解決済み] SubclipseとJavaHLのインストールで頭を悩ます
-
[解決済み] タイプの安全性。アンチェック・キャスト
-
[解決済み] Maven: assembly-pluginが全く実行されない
-
[解決済み] Java: getInstanceとStaticの比較
-
[解決済み] Spring ApplicationContext - リソースリーク: 'context' が閉じられない
-
[解決済み] ヘッドリカーシオンとテールリカーシオンの違い [重複]について