1. ホーム
  2. パイソン

[解決済み】Pythonはインタプリタか、コンパイルか、それとも両方か?

2022-04-16 12:19:38

質問

私の理解では

An 解釈 言語とは、インタープリタ(高級言語を機械語に変換して実行するプログラム)が実行する高級言語であり、インタープリタはプログラムを少しずつ処理する。

A コンパイル済み 言語とは、コンパイラ(高級言語を機械語に変換するプログラム)によってコードがまず機械語に変換され、次に実行プログラム(コードを実行するための別のプログラム)によって実行される高級言語である。

私の定義に間違いがあれば訂正してください。

さて、Pythonの話に戻りますが、これについては少し混乱しています。Pythonはインタプリタ言語であるとどこでも習いますが、何らかの中間コード(バイトコードやILなど)に解釈され ではなく をマシンコードに変換します。では、次にどのプログラムがIMコードを実行するのでしょうか?Pythonスクリプトがどのように処理され、実行されるのかを理解するのにお役立てください。

どのように解決するのですか?

まず、インタープリタブル/コンパイル済は、言語の特性ではなく、実装の特性です。ほとんどの言語では、すべてではないにしても、ほとんどの実装はどちらかのカテゴリに分類されるので、その言語もインタプリタ/コンパイラであると言えば少しは言葉を節約できるかもしれません。さらに、C言語のインタプリタや、PythonのサブセットをCやC++のコードに(そしてその後機械語に)コンパイルしようとするプロジェクトがあります。

第二に、コンパイルはネイティブの機械語コードへの先読みコンパイルに限定されるものではない。コンパイラとは、より一般的には、あるプログラミング言語のプログラムを別のプログラミング言語のプログラムに変換するプログラムのことです(重要な変換を施せば、同じ入力言語と出力言語を持つコンパイラを持つことも可能でしょう)。そして、JITコンパイラはネイティブの機械語にコンパイルする。 実行時 ベンチマークと比較する実装の質にもよりますが、)前倒しコンパイルに近い、あるいはそれ以上の速度が得られます。

しかし、小難しいことを言わずに、あなたが質問したかったことに答えると、実用上(ある程度人気があって成熟した実装を使って)、Pythonは コンパイル . 先に機械語にコンパイルされるのではなく(つまり、制限された間違った、しかし残念ながら一般的な定義によるコンパイル)、quot;only" にコンパイルされるのです。 バイトコード しかし、それはコンパイルであり、少なくともいくつかの利点があります。例えば、次のような文があります。 a = b.c() はバイトストリームにコンパイルされ、ディスアセンブルされると次のようになります。 load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a) . これは単純化したもので、実際にはもっと可読性が低く、もう少し低レベルです。 dis モジュール をクリックして、本物がどのようなものか見てみましょう。これを解釈する方が、上位の表現から解釈するよりも速い。

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