5

たとえば、 Java で JVMを作成した場合、この実装を構築するために使用した元の実装よりも、実際に作成した実装を高速にすることは可能ですか?その実装について?

(紛らわしい...)

PyPyを見てください。Pythonで作られたPython用のJITコンパイラです。それは問題ありませんが、使用し、依存している Python の元の実装よりも高速であると主張するにはどうすればよいでしょうか?

4

5 に答える 5

9

言語とその言語の実行装置を混同しています。

PyPy が CPython よりも高速である理由の 1 つは、PyPy が完全に独立したネイティブ実行可能ファイルにコンパイルされ、CPython に依存せず、CPython で実行されないためです。

それにもかかわらず、高レベルのインタープリターがより効率的な実行戦略を利用した場合、ある言語の非効率的な実装が、同じ言語で記述され、非効率的なインタープリターでホストされているインタープリターによって凌駕される可能性があります。

于 2012-02-21T14:56:45.083 に答える
7

もちろん可能です。JVM 実装は、Java バイトコードを最適化されたマシン コードにコンパイルできます。オプティマイザが、Java コンパイラを実行する JVM 実装よりも洗練されている場合、最終結果はより高速になる可能性があります。

その場合、Java コンパイラを独自のソース コードで実行すると、それ以降のコンパイル速度が向上します。

PyPy は Python 用の JIT コンパイラだとおっしゃいました (私自身はよく知りません)。その場合は、Python プログラムをマシン コードに変換してから、マシン コードを実行します。別の投稿者は、PyPy コンパイラは CPython とは別のスタンドアロンの実行可能ファイルとして実行されると述べました。しかし、CPython で実行する場合でも、プログラムがマシン コードに JIT され、コンパイルされたマシン コードが実行されると、コンパイラのパフォーマンスは重要ではなくなります。コンパイラの速度は、起動時間にのみ影響します。

于 2012-02-21T14:52:30.087 に答える
2

PyPy は Python で実装された Python インタープリターではなく、Python の静的に型指定された制限付きサブセットである RPythonで実装された Python インタープリターおよびコンパイラーです。

RPython は、静的分析に適した Python の制限付きサブセットです。言語には追加機能があり、驚くほど機能するものもありますが、これは考慮すべき制限の大まかなリストです。行っているときに遭遇する特別なケースの制限がたくさんあることに注意してください。

実際の速度の違いは、プログラム全体をバイトコードとして解釈する CPython とは異なり、PyPy はRPython の部分に対して (機械コードへの) ジャストインタイム (JIT) コンパイルを使用するという事実から生じます。

于 2012-04-16T14:11:35.970 に答える
1

その言語でその言語のインタープリターを実装し (これを A と呼びます)、その言語の別の既存のインタープリター (これを B と呼びます) の上でそれを実行し、プログラムを実行する (これを P と呼びます) ことはできないと思います。また、P を (B で実行している) 上で実行するのは、B で実行している P よりも高速です。

A のすべての操作は、B の少なくとも 1 つの操作で実装する必要があります。したがって、B が非常に悪く、A が最適な状態であっても、A が B で実行されているという事実は、B の悪さが A を遅くすることを意味します。 .

言語自体の言語にインタープリター + JIT コンパイラーを実装することが可能になる可能性があります。この場合、JIT コンパイラーは実行時に他のより高速なコードを生成し、P を B で実行する (B で実行する) P を B で実行するよりも高速にします。 JIT コンパイルされていない P のランタイムの部分は遅くなります (通常ははるかに遅くなります) が、JIT コンパイラが P の「ホット」な部分を正常に識別し、B よりも速く実行する場合、システム全体が全体的に高速に実行される可能性があります。 .

しかし、それは本当に興味深いことではありません。また、その言語 (C) で言語のコンパイラを実装し、既存のコンパイラ (D) でコンパイルし、元のコンパイラが生成するよりも高速なコードを新しいコンパイラ言語で生成することもできます。驚かないことを願っています。D によって発行されるコードの速度は、C でコンパイルされた他のプログラムの実行時間ではなく、C の実行時間にのみ影響することは明らかです。

コンパイルする言語でコンパイラを作成することは何十年も前から行われており (たとえば、GCC は C で作成されています)、実際の質問とはあまり関係がありません。それ自体を使用して言語を JIT コンパイルすることもありません。どちらの場合も、根底にある実行は、検討している言語以外のものです。通常はマシンコード。

しかし、あなたの質問のソースは誤解です。PyPy の Python インタープリターは、実際には Python で実装されていません。PyPy プロジェクトには、RPythonで書かれた Python 用のインタープリターがあります。RPython は Python のサブセットであり、マシン コードに効率的にコンパイルできるように選択されています。言語としての RPython は、型推論と中かっこの代わりにインデントされたブロックを備えた Java に非常に似ています。PyPy プロジェクトには、Python で記述された RPython 用のコンパイラもあり、コンパイルするインタープリターに (ほとんどの場合) JIT コンパイラーを自動的に追加できます。

実際に運用環境で PyPy インタープリターを使用しているときは、RPython ソースからコンパイルされたマシンコード インタープリターを使用しています。これは、CPython インタープリターを使用しているときに、C ソース コードからコンパイルされたマシンコード インタープリターを使用するのと同じです。PyPy インタープリターを別の Python インタープリターの上で実行すると (有効な RPython コードは有効な Python コードでもあるため実行できますが、その逆ではありません)、CPython インタープリターよりも実行速度が非常に遅くなります。

于 2012-02-23T06:38:26.633 に答える
-1

pypy 変換プロセスは CPython で実行されますが、出力は .c ファイル (前回チェックしたときは 19 個のファイル) のリストであり、バイナリ pypy-c にコンパイルされます。実行時に pypy-c は CPython とは何の関係もありません。そのため、より高速になる可能性があります。

于 2012-02-25T18:38:56.760 に答える