web-dev-qa-db-ja.com

Pythonは解釈、コンパイル、またはその両方ですか?

私の理解から:

解釈済み言語は、外出先でインタープリター(高水準言語をマシンコードに変換してから実行するプログラム)によって実行および実行される高水準言語です。プログラムを少しずつ処理します。

コンパイル済み言語は、コードが最初にコンパイラ(高レベル言語をマシンコードに変換するプログラム)によってマシンコードに変換され、次にエグゼキュータ(別のユーザー)によって実行される高レベル言語です。コードを実行するためのプログラム)。

定義が間違っている場合は修正してください。

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

155
Pankaj Upadhyay

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

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

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

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

194
user395760

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

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

27
Jeremy

答えは、使用されているpythonの実装に依存します。あなたが言うことができるならCPython(Pythonの標準実装)またはJython(Javaプログラミング言語との統合を対象としています) バイトコード、使用しているpythonの実装に応じて、これはbycodeは解釈のために対応する仮想マシンに送られますPVM(Python仮想マシン)CPythonの場合JVM(Java仮想マシン)Jythonの場合。

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

21
qualitytest

Python.orgによると、インタープリターです。

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

Pythonは、解釈されたオブジェクト指向の高レベルプログラミング言語です...

...

コンパイル手順がないので...

...

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

...

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

9
John S.

If(知っているJava){

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

-} else {

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

()

3
Nabil Qadir

ほとんど、Pythonは解釈言語と言えます。しかし、pythonでの1回のコンパイルプロセスの一部を使用して、完全なソースコードをJava言語のようなバイトコードに変換しています。

2
Hemant

プログラミング言語としてのPythonは、それがコンパイルまたは解釈されたプログラミング言語であるかどうかについては言及しておらず、その実装のみです。解釈またはコンパイルされた用語は、言語のプロパティではなく、実装のプロパティです。 Pythonプログラムは、ソースコードから直接実行されます。そのため、 Python は解釈されたバイトコードに該当します。 .pyソースコードは、最初に.pycとしてバイトコードにコンパイルされます。このバイトコードは、解釈(公式CPython)またはJITコンパイル(PyPy)できます。 Pythonソースコード(.py)は、IronPython(.Net)やJython(JVM)などの異なるバイトコードにコンパイルできます。 Python言語には複数の実装があります。公式のものは、バイトコード解釈されたものです。バイトコードJITコンパイル実装もあります。

0
Rajesh

初心者向け

Pythonは、スクリプトを実行する前に、バイトコードと呼ばれるコンパイル済みコードに自動的にコンパイルします。

スクリプトの実行はインポートとは見なされず、.pycは作成されません。

たとえば、別のモジュールxyz.pyをインポートするスクリプトファイルabc.pyがある場合、abc.pyを実行すると、xyzがインポートされるためxyz.pycが作成されますが、abc以来abc.pycファイルは作成されません。 pyはインポートされていません。

0
navaneeth kt

記述するpythonコードはpythonバイトコードにコンパイルされ、拡張子.pycのファイルが作成されます。コンパイルする場合、もう一度質問があります、なぜコンパイルされた言語ではありません。

これは、Wordの従来の意味でのコンパイルではないことに注意してください。通常、コンパイルには高レベル言語を使用し、それをマシンコードに変換すると言います。しかし、それはある種の編集です。マシンコードにではなく、中間コードにコンパイルされました(今すぐ手に入れたことを願っています)。

実行プロセスに戻ると、コンパイル手順で作成されたpycファイルに存在するバイトコードは、適切な仮想マシンによって実行されます。この場合、CPython VMタイムスタンプ(マジックナンバーと呼ばれます)が使用されます新しいpycファイルの作成に応じて、.pyファイルが変更されたかどうかを検証します。 pycが現在のコードである場合、コンパイル手順を単にスキップします。

0
y durga prasad