web-dev-qa-db-ja.com

pythonコンパイラからネイティブマシンコードへのコンパイラがないのはなぜですか?

私が理解しているように、コンパイルされた言語とpythonの速度の違いの原因は、最初のコードがネイティブマシンのコードに至るまですべての方法でコンパイルされるのに対し、python pythonバイトコード、PVMによって解釈されるようにコンパイルします。このように、pythonコードは複数のオペレーティングシステムで使用できます(少なくともほとんどの場合) )、しかし私は理解していませんが、なぜ従来のコンパイラーと同じ方法でコンパイルする追加の(そしてオプションの)pythonコンパイラーがないのですか?これはプログラマーに選択を任せます。ネイティブマシンでのパフォーマンス一般に、コンパイルと解釈の両方で動作する言語がないのはなぜですか?

26
user2986898

いいえ。PythonとC++のような言語の間に速度の違いがある理由は、静的に型付けされた言語がプログラムの構造とそのデータに関する多くの情報をコンパイラに提供し、計算とメモリアクセス。 C++は変数の型がintであることを認識しているため、プログラムを実行する前でも、その変数を操作する最適な方法を決定できます。一方、Pythonでは、インタプリタが行に到達するまで、ランタイムは変数の値がわかりません。これは構造にとって非常に重要です。C++では、コンパイラーは、コンパイル時に構造のサイズとメモリー内のそのフィールドのすべての場所を簡単に認識できます。これにより、データがどのように使用されるかを予測するのに非常に役立ち、それらの予測に従って最適化できます。 Pythonのような言語では、そのようなことは不可能です。

Pythonのような言語を効果的にコンパイルするには、次のことを行う必要があります。

  1. プログラムの実行中は、データの構造が静的であることを確認してください。 Pythonにはevalとメタクラスがあるため、これは問題があります。どちらも、プログラムの入力に基づいてプログラムの構造を変更することを可能にします。これはPythonにそのような表現力を与えるものの1つです。
  2. ソースコード自体からすべての変数、構造、クラスのタイプを推測します。ある程度は可能ですが、静的型システムとアルゴリズムは非常に複雑になるため、実用的な方法で実装することはほとんど不可能です。言語のサブセットに対してそれを行うことはできますが、言語機能のセット全体に対してはそうではありません。
30
Euphoric

ネイティブマシンコードにコンパイルされたPythonが、コンパイルされたCまたは他の一般にコンパイルされた言語よりも速く実行されない "理由"を理解するのに役立つ2つの概念。

私はPythonの専門家ではないため、誤ってこのサイトにアクセスしましたが、このサイトが好きです。

ここでの別の応答で述べたように、C++コンパイラーはプログラムについて多くのことを知ることができ、特定のデータ構造に使用する操作について決定を下すことができます。例として、2つの整数変数を加算する必要がある場合、コンパイラーはそれらが例えば32ビット幅のネイティブ整数であることを認識し、1つの「ADD」命令でそれらを加算できます。そのため、ADD命令をコードにコンパイルします。ロックされており、プログラムの実行中は変更できません。それは事前バインディングです。

一方、Pythonのような言語では、プログラムがさまざまなタイプのデータを複雑な方法で一緒にスローすることを期待できます。2つの変数が整数、浮動小数点数、文字列であるかどうかコンパイラーは認識しません。またはリストです。そのため、実行時にその情報を決定するコードをコンパイルし、プログラムの実行中に正しい操作を選択する必要があります。これは遅延バインディングであり、プログラムの実行中にその余分な作業を行うとパフォーマンスに影響があることがわかりますPythonのような言語でこれらのオプションを開いたままにするために支払う価格ですが、実行時の柔軟性が最大になります。

0
user214354