web-dev-qa-db-ja.com

Python解釈またはコンパイルされますか?

これは、インタプリタおよびコンパイル済みの言語について読んでいたときに私が思っただけです。

Rubyは、ソースコードが実行時にインタプリタによって処理されるため、間違いなくインタプリタ言語です。
逆に[〜#〜] c [〜#〜]は、ソースコードをコンパイルする必要があるため、コンパイルされた言語です最初にマシンに従って、次に実行します。この結果、実行がはるかに高速になります。

Pythonに来ています:

  • pythonコード(somefile.py)をインポートすると、ファイル(somefile.pycが作成されます) )同じディレクトリにあります。インポートがpythonシェルまたはDjangoモジュールで行われたとしましょう。インポート後、コードを少し変更し、インポートされた関数を再度実行して、古いコードがまだ実行されていることを確認します。これは、*。pycファイルを直接実行することはできませんが、*。pycファイルはCファイルのコンパイル後に作成された実行可能ファイルに似たpythonファイルでコンパイルされることを示唆しています。
  • pythonファイル(somefile.py)を直接実行すると(./somefile.pyまたはpython somefile.py)、. pycファイルは作成されず、コードは指示どおりに実行されます解釈された動作。

これらは、pythonコードが新しいプロセスにインポートされるたびにコンパイルされ、直接実行されたときに解釈されながら.pycを作成することを示唆しています。

それで、私はそれをどの言語と見なす必要がありますか?解釈済みまたはコンパイル済み?そして、その効率はインタプリタやコンパイルされた言語と比べてどうですか?

Wikiの Interpreted Languages ページによると、それは仮想マシンコードにコンパイルされた言語としてリストされていますが、それはどういう意味ですか?

82
crodjer

languagesは解釈またはコンパイルされず、むしろ言語実装コードを解釈またはコンパイルします。 Rubyは「解釈された言語」ですが、Rubyàla MacRuby はコンパイルできるため、alwaysインタプリタ言語。

ほぼすべてのPython実装は、コンパイラではなくインタープリタで構成されています。表示される.pycファイルは、Python virtual machine(Javaの.classファイルに似ています)。これらは、ネイティブマシンアーキテクチャ用にCコンパイラによって生成されたマシンコードと同じではありません。ただし、一部のPython実装は、 Pythonバイトコードをネイティブマシンコードにコンパイルするジャストインタイムコンパイラの例).

(私はPythonのネイティブマシンコンパイラーを知らないので、「ほとんどすべて」と言いますが、どこにも存在しないと主張したくありません。)

83
mipadi

Pythonは解釈されたバイトコードに該当します。 .pyソースコードは最初に.pycとしてバイトコードにコンパイルされます。このバイトコードは、解釈(公式CPython)、またはJITコンパイル(PyPy)できます。 Pythonソースコード(.py)は、IronPython(.Net)やJython(JVM)のように別のバイトコードにコンパイルできます。Python言語。公式のものはバイトコードが解釈されたものであり、バイトコードのJITコンパイルされた実装もあります。

言語のさまざまな実装の速度を比較するには、 ここ を試してください。

36
aufather

コンパイルされたものと解釈されたものは、状況によっては役立つ場合がありますが、技術的な意味で適用すると、誤った二分法になります。

コンパイラー(最も広い意味で)はtranslatorです。プログラムAをプログラムBに変換し、将来の実行のためにマシンMを使用してそれを実行します。

(最も広い意味で)インタープリターはexecutorです。これは、プログラムAを実行するマシンMです。通常、この定義から物理マシン(または物理マシンのように動作する非物理マシン)を除外します。しかし、理論的な観点からは、その区別はやや恣意的です。


たとえば、 re.compile 。正規表現を中間形式に「コンパイル」し、その中間形式が解釈/評価/実行されます。


結局のところ、それはあなたが話している抽象化のレベルとあなたが気にかけていることに依存します。人々はプロセスの最も興味深い部分の広い説明として「コンパイルされた」または「解釈された」と言いますが、実際、ほとんどすべてのプログラムは何らかの方法でコンパイル(翻訳)され、解釈(実行)されます。

CPython(Python言語の最も一般的な実装)は、コードを実行するために最も興味深いものです。したがって、CPythonは通常、解釈されたものとして記述されます。これは緩いラベルですが。

11
Paul Draper

仮想マシンコードは、元のソースコード(バイトコード)のよりコンパクトなバージョンです。それはマシンコードではないため、仮想マシンで解釈する必要があります。ただし、人間が書いた元のコードよりも解析が簡単で高速です。

一部の仮想マシンは、仮想マシンコードを初めて解釈するときにマシンコードを生成します(ジャストインコンパイル-JIT)。次の呼び出しでは、このマシンコードを直接使用するため、実行が高速になります。

私が知る限り、Ruby> = 1.9はPythonのような仮想マシンを使用します。

7

Pythonランタイムは、仮想マシンでカスタムオブジェクトコード(バイトコード)を実行します。

コンパイルプロセスは、ソースコードをオブジェクトコードに変換します。

処理を高速化するために、オブジェクトコード(または、必要に応じてバイトコード)がディスクに保存されるため、次にプログラムを実行するときに再利用できます。

5
ykombinator