web-dev-qa-db-ja.com

実行の観点からは、JVMまたは.net Frameworkと同じインタープリターです

私は最近、2つの入門レベルのコースを開始しました。1つはPythonを使用し、もう1つはJavaを使用します。

私は this Question への回答を読みましたが、それぞれがどのようにマシンコードになり、主なものになるかを理解するのはまだ困難です2つのモデルの違いは次のとおりです。

  • [〜#〜] jvm [〜#〜] のようなものと同じ仕事をしている通訳者ですか?バイトコード?
  • pythonの場合、インタープリターは高レベルのコードを取得してマシンコードに変換しますか?
  • Javaプログラムを実行するには、Java仮想マシンをマシンにインストールする必要があります-インタープリターがインストールされている場合はpythonと同様ですターゲットマシンの場合、pythonプログラムが実行されますか?
  • JVM(&。netフレームワーク)は効果的にバイトコードインタープリターですか?
6
whytheq

さまざまなコメントが、質問のいくつかのあいまいさや答えのニュアンスを指摘していますが、単純な答えはノーです。

JVMと.NET Frameworkは Just-In-Timeコンパイラ です。 それらはまだコンパイラであり、コンパイラのすべての作業を実行します。それらは中間言語(バイトコード)を取り、それを最適化し、それをマシンコードに変換します。ジッタと従来のコンパイラの唯一の違いはwhenであり、コンパイルを行います。

インタプリタ 、少なくとも従来の定義では、neverコンパイルコード。むしろ、与えられた命令を実行するためにコンパイルされたalreadyであるコードを使用します。これにより、起動は速くなりますが(何もコンパイルする必要がないため)、各命令に関連するオーバーヘッドがあるため、一般的に実行が遅くなります。

一連の「switch」または「if」ステートメントを使用して以下を実行するコードを記述した場合:

  • ファイルのすべての行を読み取る
  • 「A」と書かれているすべての行について、画面に「hello」と書き込みます
  • 「B」と書かれているすべての行について、「world」を画面に書き込みます
  • 1行おきに、画面に「エラー」と書き込みます

次に、これは(非常に粗雑な)インタプリタになります。 notは、実際にはマシン上でrunであるすべての部分がyourプログラム内にあるため、あらゆる種類のコンパイラになります。 解析を実行していますが、コンパイルリンクのステップをスキップして、ルックアップに基づいて実行に直接移動していますテーブル。

それを考える別の方法-これは純粋に初心者のためのアナロジーであり、完全に正確な技術的な説明ではないことに注意してください-インタープリターは基本的に行ごとに動作するのに対し、ジッターはバイトコードの大きなチャンクをコンパイルするか、おそらく、同時にバイトコード全体もです。

通常、バイトコードはマシンコードと非常に類似(ただし同一ではない)であるため、バイトコードなしジッター(MicrosoftのNGenなど)をプリコンパイルすることもよくあります。解釈されたコードは通常、実行に至るまで高級言語のままです。

13
Aaronaught

技術的な観点があります:

  • コンパイラは、プログラムのビューを別のビューに変換し、抽象化のレベルを下げるプロセスです。

  • インタプリタは、プログラムを実行するプロセスであり、おそらく最初にソースを別のビューに変換しますが、抽象化のレベルが大幅に低くなることはありません。

ユーザーの視点があります:

  • コンパイラはプログラムを変換するだけで、次のステップまで実行されません。

  • インタプリタがプログラムを実行します。

この2つの違いには、いくつかの混乱があります。

ユーザーとしてのインタプリタは、コンパイル手法を使用することがあります。事前に、ソースプログラムを解釈する前に、ソースよりも大幅に抽象化レベルが低い中間表現でソースプログラムをコンパイルします。おそらく、マシンレベルまで下げます(コンパイラのロードアンドゴー)。頻繁に使用されるコードを検出し、その部分だけをコンパイルしたり、特別な最適化を適用したりすることがあります(ジャストインタイムコンパイル)。

コンパイラーは機械語に行く必要はありません。 Cは実験言語の人気のあるターゲットです。別の一般的な選択は、仮想マシンによって後で解釈される必要がある中間コードのような多かれ少なかれマシンであり、バイトコード自体を公開することもあれば、1つの実行可能ファイル内のバイトコードで仮想マシンをバンドルすることもあります(これは、最も人気があり、普及しているPascal実装が機能しました)。

仮想マシン自体はインタプリタですが、上記のコンパイル手法を適用できます。

コンパイラーは、記述のような多かれ少なかれマシンを生成し、真のマシンコード生成をリンカーに委任することがあります。その生成はインストール時にも行われる可能性があります(AS/400、および?Seriesスープで名前を思い出せない後継者は、その方法を使用していることがわかっているシステムの中で最も長くなります)。


今あなたの質問:

  • インタプリタは、バイトコードなしで、JVMのようなものと同じ仕事をしていますか?

時々はい、時々それはJavaコンパイラとJVMのバンドルです。

  • pythonの場合、インタプリタは高レベルのコードを取得してそれをマシンコードに変換していますか?

いくつかのPythonインタープリターとシステムがあります。最も人気のあるものはマシンコードにあるとは思いません。

  • Javaプログラムを実行するには、Java仮想マシンをマシンにインストールする必要があります-インタープリターがにインストールされている場合はpythonと同様ですターゲットマシンはpythonプログラムを実行しますか?

最も人気のあるPython実装は、インストールする必要のあるインタープリターです。

  • JVM(&.netフレームワーク)は事実上バイトコードインタープリターですか?

はい、私が「ユーザーレベルのインタープリター」と呼んだものです。彼らは真のコンパイル手法を適用してパフォーマンスを向上させることができます。

1
AProgrammer

インタープリター型コードとコンパイル済みコードの違いは以前より明確でした私が最初に学習したとき。

私が最初に学んだプログラミング言語は、テキストであるMicrosoft BASICの初期バージョンであり、それはインタープリターによって解釈されました。

次に、大学に行ったときに、パスカルとCでプログラミングすることを学びました。どちらもマシンコードにコンパイルされ、仮想マシンのようなものを実行する必要がないコンパイル済み言語です。

また、大学では、テキストで解釈されるUnixシェルスクリプトを学びました。

区別は以前より明確でした。

JavaおよびPythonはコンパイルおよび解釈されていると考えています。Pythonが再コンパイルせずに何かを変更できるようにしたい場合のジョブ。

Javaは良いです。コンパイルすると、コンパイル時に多くのバグが見つかります。

PythonとJavaの両方がコンパイルされ、解釈されていると思います。Javaは、「よりコンパイルされている」と思います。より多くのバグがコンパイル時に見つかりました。

0
Kaydell