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


76

これは、インタープリターおよびコンパイルされた言語について読んでいたときの不思議です。

ソースコードは実行時にインタープリターによって処理されるため、Rubyは間違いなくインタープリター言語です。
それどころか、Cはコンパイルされた言語であり、マシンに応じて最初にソースコードをコンパイルしてから実行する必要があります。これにより、実行速度が大幅に向上します。

Pythonに来ました:

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

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

それで、どのタイプの言語と考えるべきですか?解釈またはコンパイル?そして、その効率は、インタープリター言語およびコンパイル言語と比較してどうですか?

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


1
Rubyがインタープリター言語であるかどうか疑問があるのはいつですか?コンパイルされたとき。:) macruby.org
mipadi

8
厳密な意味で現代語が解釈されないことは注目に値します。ほぼすべてがバイトコードにコンパイルされます。
ウィンストンイーバート

@Winston Ewert:ブラボー!Applesoft Basic(1980年代)はバイトコードでコンパイルされました。この場合の「現代」とは、生きた記憶にあるすべてのインタープリター言語を意味し、唯一の例外は初歩的なダートマスベーシックの実装です。
S.Lott

6
>>反対に、Cはコンパイルされた言語です<< root.cern.ch/drupal/content/cint
igouy

3
@ S.Lott:Applesoftおよび80年代のBASICインタプリタが「バイトコードのコンパイル」を行ったトークン化プロセスを呼び出すことは、少し不誠実ではありません。はい。ユーザーが入力したプログラムコードは、予約語ごとに1バイトの圧縮形式でメモリに保存されましたが、それ以上は何も入力しませんでしたRUN。字句解析のステップを実行して、プログラムを実行するたびに再解析する必要があるトークンのストリームを出力するコンパイラーがあるようでした。たとえば、javacレキシング、解析、最適化を含む現代のバイトコードコンパイルとはまったく異なります。
dodgethesteamroller

回答:


80

言語が解釈またはコンパイルされるのではなく、言語実装がコードを解釈またはコンパイルすることに注意してください。Rubyは「解釈された言語」であることに注意しましたが、RubyをMacRubyでコンパイルできるので、常にインタプリタ言語であるとは限りません。

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

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


定義に応じて、Python用のネイティブマシンコンパイラが存在します。Pythonのサブセットのみをコンパイルするものもあります。その他のpythonのすべてを実装しますが、実際、それはCで実行できない操作を実行するためのpythonのAPIを使用する
ウィンストンエバート

Pythonは、私が「セミコンパイル」と呼ぶもの、または実際に完全にコンパイルできるもののいずれかであると実際に説明していると思います。セミコンパイルとは、通常、Python仮想マシンで使用される「中間言語」の.pycファイルにコンパイルされるため、通常はこの「セミコンパイル」フォームから実行され、一般にコードよりも高速になることを意味します解釈されたコードの実行時の単純な解釈。興味深いことに、セミコンパイルされたコードは、ネイティブにコンパイルされたコードよりも高速になる場合があります(たとえば、C#は一般にC ++よりも高速です)。
クリスハルクロー

5
CythonはPythonコードをCにコンパイルし、共有オブジェクトとしてコンパイルできるようにします。
greyfade

この方法でバイトコードとマシンコードを区別するのは、かなりarbitrary意的です。Javaがコンパイルされます。javacコンパイラは、仮想マシン(ホットスポットなど)またはハードウェア(Jazelle拡張機能を備えたARMプロセッサなど)で実行可能な低レベルの命令を含むクラスファイルを生成します。私の知る限り、Python vm命令を直接実行するために同様のプロセッサアーキテクチャを設計できなかった技術的な理由はありません。
ジュール

@Jules偶然にも、Jythonコードは実際に.classファイルにコンパイルされ、pyソースを変更するまで再利用されると思います。
ジミージェームズ

35

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

言語のさまざまな実装の速度の比較については、こちらをお試しください


情報によれば、ベンチマークによると、Pythonのパフォーマンスはかなり低下しています!
クロッジャー

1
私が与えたリンクは、これらが言語実装の欠陥のあるベンチマークあると述べています。実行パフォーマンスについてあまりにも心配する場合は、Pythonを言語として選択しないでください。それでも比較したい場合は、同様の言語を比較します。公式CPythonで解釈されるバイトコードは、JITでコンパイルされたRubyと同等またはそれより高速です。
aufather

1
@ jase21-「2006年の私の計画は、Psycoで実装された技術をPyPyに移植することです。PyPyにより、より柔軟なJITスペシャライザーを構築でき、実験が容易になり、 Python言語。」psyco.sourceforge.net/introduction.html
igouy

1
@ jase21-「PythonコードをCのカウンターパーツよりも高速に実行する」-そのためにあなたの言葉をそのまま使うべきですか?
igouy

3
答えのリンクが壊れています。
バシレフス

11

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

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

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


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


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

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


7

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

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

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


5

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.