236

私の理解から:

解釈言語とは、外出先でインタプリタ(高水準言語を機械語に変換して実行するプログラム)によって実行および実行される高級言語です。プログラムを少しずつ処理します。

コンパイル言語とは、コンパイラー(高水準言語を機械語に変換するプログラム)によってコードが最初に機械語に変換され、次に実行者(コードを実行するための別のプログラム)によって実行される高水準言語です。

私の定義が間違っている場合は私を訂正してください。

今Pythonに戻って、私はこれについて少し混乱しています。Pythonはインタプリタ言語であることをどこでも知っていますが、Pythonはマシンコードではなく、いくつかの中間コード(バイトコードやILなど)にインタプリタされています。では、どのプログラムがIMコードを実行するのでしょうか。Pythonスクリプトがどのように処理および実行されるかを理解するのを手伝ってください。

4

15 に答える 15

292

まず、解釈/コンパイルは言語のプロパティではなく、実装のプロパティです。ほとんどの言語では、すべてではないにしてもほとんどの実装が 1 つのカテゴリに分類されるため、その言語も解釈/コンパイルされているという言葉をいくつか省くことができますが、理解を助け、かなりの数の言語があるため、それでも重要な違いです。両方の種類の使用可能な実装を使用します (主に関数型言語の領域で、Haskell と ML を参照してください)。さらに、Python のサブセットを C または C++ コード (およびその後のマシン コード) にコンパイルしようとする C インタープリターおよびプロジェクトがあります。

第 2 に、コンパイルはネイティブ マシン コードへの事前コンパイルに限定されません。コンパイラは、より一般的には、あるプログラミング言語のプログラムを別のプログラミング言語のプログラムに変換するプログラムです (おそらく、大幅な変換が適用されれば、同じ入力言語と出力言語を持つコンパイラを使用することもできます)。また、JIT コンパイラは実行時にネイティブ マシン コードコンパイルします。これにより、事前コンパイルに非常に近いか、それよりも優れた速度が得られます (ベンチマークと比較する実装の品質によって異なります)。

しかし、細かいことを言うのをやめて、あなたが尋ねようとしていた質問に答えるために: 実際には (読んでください: やや人気のある成熟した実装を使用して)、Python はコンパイルされています。事前にマシンコードにコンパイルされていません(つまり、制限された間違った、しかし残念ながら一般的な定義によって「コンパイル」されています)、バイトコードに「のみ」コンパイルされていますが、それでも少なくともいくつかの利点があるコンパイルです。たとえば、ステートメントa = b.c()はバイト ストリームにコンパイルされます。これを「逆アセンブル」すると、次のようになりload 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)ます。これは単純化したもので、実際には読みにくく、もう少し低レベルです。標準ライブラリdisモジュールを試してみて、実際の取引がどのように見えるかを確認してください。

そのバイトコードは、参照実装 (CPython) のように解釈されるか (理論上と実際のパフォーマンスの両方で、直接解釈することと、中間表現に最初にコンパイルしてそれを解釈することの間に違いがあることに注意してください)、または解釈とコンパイルの両方を行います。PyPyと同様に、実行時に最適化されたマシン コード。

于 2011-07-31T13:43:23.793 に答える
50

実際、CPU は機械語しか理解できません。インタープリター プログラムの場合、インタープリターの最終的な目標は、プログラム コードをマシン コードに "解釈" することです。ただし、通常、最新のインタープリター言語は非効率的であるため、人間のコードを直接解釈しません。

Python インタープリターは、まず人間のコードを読み取り、中間コードに最適化してから機械コードに解釈します。そのため、コードのコンパイル済み実行可能ファイルを直接実行できる C++ とは異なり、Python スクリプトを実行するには常に別のプログラムが必要です。たとえば、c:\Python27\python.exeまたは/usr/bin/python.

于 2011-07-31T13:40:52.627 に答える
37

答えは、使用されている python の実装によって異なります。CPython (Python の標準実装) またはJython (Java プログラミング言語との統合をターゲット)を使用している場合、最初にbytecodeに変換され、使用している python の実装に応じて、このbycode は対応する解釈のための仮想マシンCPython のPVM (Python 仮想マシン) と Jython のJVM (Java 仮想マシン)。

しかし、別の標準 CPython 実装であるPyPyを使用しているとしましょう。Just-In-Time Compilerを使用します。

于 2016-09-06T18:10:20.677 に答える
24

Pythonの公式サイトによると、解釈されています。

https://www.python.org/doc/essays/blurb/

Python は、インタープリター型のオブジェクト指向の高水準プログラミング言語です...

...

コンパイルステップがないので...

...

Python インタープリターと広範な標準ライブラリが利用可能です...

...

代わりに、インタープリターがエラーを検出すると、例外が発生します。プログラムが例外をキャッチしない場合、インタープリターはスタック トレースを出力します。

于 2017-01-24T14:32:45.187 に答える
6

If ( You know Java ) {

Python コードは Java のようにバイトコードに変換されます。
そのバイトコードは、アクセスしようとするたびに再度実行されます。

} else {

Python コードは、最初はバイトコードと呼ばれるものに変換されます。
これは機械語に非常に近いですが、実際の機械語ではありません。
そのため、アクセスまたは実行するたびに、バイトコードが再度実行され

ます }

于 2018-09-02T11:34:39.827 に答える
2

ほとんどの場合、Python はインタープリター型言語であると言えます。しかし、完全なソース コードを Java 言語のようなバイト コードに変換するために、Python で 1 回限りのコンパイル プロセスの一部を使用しています。

于 2013-04-10T05:12:06.367 に答える
-2

私の意見では、Python は、個々の python ステートメントを (python コードから cpu での実行まで) 完全に処理できるように設計されているため、インタープリターのカテゴリに分類されます。つまり、1 つのステートメントを記述し、それを実行して、エラーがなければ対応する結果を得ることができます。

中間コード(バイトコードなど)を持っていても、それを全体的にコンパイラとして分類することに違いはないと思います。このコンポーネント (中間コード生成) は通常、コンパイラーの一部ですが、インタープリターでも使用できます。インタープリターの wiki 定義を参照してください https://en.m.wikipedia.org/wiki/Interpreter_(computing)。実行速度の面で効率を高めるための重要な部分です。キャッシュを使用するとさらに強力になるため、現在のプログラム スコープでコードを変更していない場合は、字句解析、セマンティック解析、さらにはコードの最適化などの重い処理手順をスキップできます。

于 2021-03-27T08:17:43.270 に答える