7

純粋な Python を完全にコンパイルできないのはなぜですか? コンパイルまたは解釈は、言語ではなく、実装の特性です。事前に完全にネイティブ コードにコンパイルされた Python 実装が必要ではないでしょうか。(純粋な) Python のコンパイルが難しい理由は何ですか?

PyPyやCythonのようなものがあることは知っていますが、私が理解しているように、それらは純粋なPythonではなく、型注釈などが必要です.

ありがとう

完全にコンパイルされたという意味は、C、C++、Lisp などのネイティブ コードにあらかじめコンパイルされていることを意味します。

4

3 に答える 3

6

誤った前提。Python完全にコンパイルすることができ、型注釈などは必要ありません。

さらに、PyPyPython コードをマシン コードに完全にコンパイルします。これが事前に行われていないことは、コンパイル可能性の面とは無関係です。これは、JIT アーキテクチャの実装の詳細にすぎません。

于 2013-09-01T10:31:19.250 に答える
4

最大の問題 (およびそれらの実装に型注釈が必要な理由) は、Python 仕様が、関数バインディングのような意味論的評価を実行時間に延期することに大きく依存していることだと思います。

場合によってはタイピングがスクリプトから完全に推測できる場合でも、一般的なケースでそれを行うのは非常に複雑であり、Magnus Hoff がコメントで指摘しているように、遅延バインディングに依存するコードには、結果の実行可能ファイルのインタープリター。

編集:私は、誰かがこの問題に正面から取り組んでいない理由についての暗黙の二次的な質問に答えており、それがどういうわけか不可能であるという考えに同意していません. たとえば、C++ ランタイムは多くの遅延バインディングを行いますが、私の感覚では、Python はより多くのことを行い、それを後で行います。

于 2013-09-01T10:28:18.533 に答える
3

UPD: この回答を指摘してくれた Konrad と kqr に感謝します。この回答は C または C++ スタイルのコンパイルについてのみ述べています。たとえば、Common Lisp が行っているように、他の方法もあります。

厳密に言えば、コンパイル時に必ずしも完全なソースコードを持っているとは限らないため、事前に Python プログラムをコンパイルすることはできません。Python プログラムは、ソース コードをダウンロードしてeval()、私たちが知っているすべてのことを行うことができます。または、プログラムで構築します(標準ライブラリでは、実際にはそれを正確に行いnamedtuple()ます)。

ただし、これは最大の問題ではありません。これらは限界的な慣行です。最大の問題は、事前にデータ型を推測することが信じられないほど困難であり、一般的にはおそらく不可能だということです。関数があり、それをネイティブ コードにコンパイルする場合は、とmax(x, y)の可能な型を把握し、組み合わせごとに異なるバージョンをコンパイルする必要があります。それは問題かもしれません。現在、いくつかの機能を制限して、そのような推論を可能にすることができ、RPython を取得できます。xy

したがって、python プログラムをコンパイルすることはできますが、事前完全に行うのは困難です。

PyPy があるのはそのためです。PyPy はJIT コンパイラです。推論する代わりに、コードを実行し、実行中に分析します。そのため、実際にはループのみを最適化します。これがどのように機能するかです(非常に大まかに):

  1. PyPy は、フローに関するデータを収集しながら (現在は 1000 回の反復)、干渉することなくループを実行します。
  2. 収集したデータ型とフローに基づいて、最適化されたアセンブラ コードが生成され、コンパイルされます。
  3. 実際のプログラム フローが予測に対応するかどうかをチェックするために、「ガード」が配置されます。
  4. ネイティブ コードは、ガードが起動するかループが終了するまで実行されます。

また、PyPy の開発中に、開発者は RPython を作成しました。これは、実際には完全かつ静的にコンパイルできる Python のサブセットです。彼らは主に早期バインディングを強制することでそれを達成しました。たとえば、整数である変数がある場合、後でそれを char として転用することはできません。また、リストや他のコンテナなどに異なるデータ型を混在させることはできません。

于 2013-09-01T11:13:23.083 に答える