Pythonは素晴らしいです。
驚いたことに、これは非常にあいまいなステートメントです。 「Python」とはどういう意味ですか?私はPythonを意味します インターフェース 概要?私はCPythonを意味します 実装 一般的なPython(同様の名前のCythonと混同しないでください)?それともまったく違うことを意味するのでしょうか?たぶん私はJython、IronPython、またはPyPyを斜めに参照しています。あるいは、私は本当に底を打って、RPythonまたはRubyPython(非常に非常に異なるもの)について話しているのかもしれません。
上記のテクノロジーは一般的に名前が付けられ、一般的に参照されていますが、それらのいくつかは完全に異なる目的を果たします(または、少なくとも、完全に異なる方法で動作します)。
Pythonを使用しているときに、これらのツールを多数見つけました。* Ython。しかし、つい最近、私はそれらが何であるか、それらがどのように機能するか、そしてなぜそれらが必要とされるのか(それぞれ独自の方法で)理解するのをやめました。
この投稿では、最初からさまざまなPython実装について説明し、最後にPyPyの完全な紹介を行います。これは、この言語の未来であると私は信じています。
それはすべて、「Python」が実際に何であるかを理解することから始まります。
マシンコードや仮想マシンなどをよく理解している場合は、スキップしてください。
これは、Pythonの初心者にとってよくある混乱のポイントです。
最初に気付くのは、「Python」がインターフェースであるということです。あります 仕様 Pythonが何をすべきか、そしてどのように すべき (他のインターフェースと同様に)動作します。そして、複数あります 実装 (他のインターフェースと同様)。
次に気付くのは、「解釈」と「コンパイル」はのプロパティであるということです。 実装 、インターフェースではありません。
色はどんな感情を呼び起こしますか
したがって、質問自体は適切に表現されていません。
Pythonは解釈またはコンパイルされますか?質問は実際にはうまく定式化されていません。とは言うものの、最も一般的な実装(CPython:Cで記述され、単に「Python」と呼ばれることが多く、私が何について話しているのかわからない場合は確かに使用しているもの)の場合、答えは次のとおりです。 解釈 、と いくつか コンパイル。 CPython **バイトコードのPythonソースコードをコンパイルしてから*解釈します このバイトコードは、進行するにつれて実行されます。
* 注:これは、従来の意味での「コンパイル」ではありません。通常、「コンパイル」とは、高級言語を使用してそれを機械語に変換することです。しかし、それは特定の「コンパイル」です。
バイトコードとマシン(またはネイティブ)コードの違いを理解することは非常に重要です。おそらく、次の例で最もよく説明されています。
簡単に言えば: マシンコードははるかに高速ですが、バイトコードはより移植性が高く安全です 。
マシンコードはマシンによって異なりますが、バイトコードはすべてのマシンで同じように見えます。誰もがマシンコードが何であるかを言うことができます 最適化 あなたの構成のために。
CPythonに戻ると、ツールチェーンプロセスは次のとおりです。
ゲームのUIとは
初心者は、Pythonが.pycファイルのためにコンパイルされていると想定しています。これにはいくつかの真実があります。.pycファイルはコンパイルされたバイトコードであり、それが解釈されます。したがって、以前にPythonコードを実行したことがあり、.pycファイルを使用できる場合は、バイトコードを再コンパイルする必要がないため、2回目はより高速に実行されます。
先に述べたように、Pythonにはいくつかの実装があります。繰り返しますが、前述したように、最も一般的なのはCPythonです。このPython実装はCで記述されており、「標準」実装と見なされます。
しかし、代替案はどうですか?最も顕著なものの1つは Jython 、JVMを使用するJavaで記述されたPython実装。 CPythonはCPythonVMで実行するバイトコードを生成しますが、Jythonは生成します バイトコードJava JVMで実行します(これは、Javaプログラムをコンパイルするときに生成されるものと同じです)。
「なぜ別の実装を使用するのですか?」と尋ねることができます。まあ、1つの理由は、これらが さまざまな実装がさまざまなテクノロジースタックでうまく機能します 。
CPythonを使用すると、PythonコードのC拡張機能を非常に簡単に記述できます。これは、最終的にC. Jythonインタープリターによって実行されるためです。一方、他のJavaプログラムでの作業が非常に簡単になります。任意のJavaクラスをインポートできます。追加の労力なしで、Jythonプログラム内からJavaクラスを呼び出して使用することによって。 (注:それを間近で考えていない場合、これはクレイジーです。私たちは、さまざまな異なる言語を混合して、それらすべてを同じ物質にコンパイルできるようになっています。注: Rostin 、FortranとCコードを混合するプログラムはしばらく前から存在しています。したがって、もちろん、これは必ずしも新しいものではありません。しかし、それでもかっこいいです。)
例として、これは有効なJythonコードです。
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_51 >>> from java.util import HashSet >>> s = HashSet(5) >>> s.add('Foo') >>> s.add('Bar') >>> s [Foo, Bar]
IronPython もう1つの人気のあるPython実装であり、完全にC#で記述され、.NETスタックに焦点を当てています。特に、.NET仮想マシンと呼ばれるもので実行されます。 共通言語ランタイム(CLR) Microsoftから、JVMに匹敵します。
あなたはそれを言うことができます Jython:Java :: IronPython:C# 。それらは同じそれぞれのVMで実行され、IronPythonコードからC#クラスをインポートし、JythonコードからJavaクラスをインポートすることができます。
CPython以外のPython実装に触れることなく、生き残ることは完全に可能です。ただし、切り替えによって得られるメリットはいくつかあり、そのほとんどはテクノロジースタックに依存しています。多くのJVMベースの言語を使用していますか? Jythonはあなたのためになることができます。 .NETスタックのすべて?たぶんあなたはIronPythonを試すべきです(そしてたぶんあなたはすでに試しました)。
ちなみに、これは別の実装を使用する理由ではありませんが、これらの実装は、Pythonソースコードの処理方法に加えて、動作が異なることに注意してください。ただし、これらの違いは通常は小さく、これらの実装が活発に開発されているため、時間の経過とともに解消または出現します。たとえば、IronPython デフォルトでUnicode文字列を使用します ;ただし、CPythonは ASCIIで標準化 バージョン2.xの場合(非ASCII文字のUnicodeEncodeErrorで失敗)、ただしサポート 3.xのデフォルトのUnicode文字列 。
つまり、Pythonの実装はCで、1つはJavaで、もう1つはC#で記述されています。次の論理的なステップ:... Pythonで書かれたPythonの実装(一般の読者ではない人は、これがやや誤解を招くことに気付くでしょう)。
ここで物事が厄介になる可能性があります。まず、ジャストインタイム(JIT)コンパイルについて説明します。
ネイティブマシンコードはバイトコードよりもはるかに高速であることを忘れないでください。 *さて、バイトコードの一部をコンパイルして、それをネイティブコードとして実行できるとしたらどうでしょうか**?バイトコード(つまり、時間)をコンパイルするには一定の価格を支払う必要がありますが、最終結果が速ければ、それは素晴らしいことです!これが、インタプリタとコンパイラの利点を組み合わせたハイブリッド手法であるJITコンパイルの動機です。基本的に、JITはコンパイルを使用してインタープリター型システムを高速化したいと考えています。
たとえば、JITが採用したアプローチは次のとおりです。
これはPyPyが行うことです:それはPythonにJITをもたらします(参照 付録 以前の取り組みについて知るため)。もちろん、他の目標もあります。PyPyは、マルチプラットフォームで、メモリ使用量が軽量で、Stacklessをサポートすることを目指しています。しかし、JITは本当にセールスポイントです。平均して、数回のテストを実行した後、パフォーマンスが1倍向上すると言われています 6.27 。これらのデータの内訳については、のグラフを参照してください。 PyPyスピードセンター :
恒久的な給与計算機との契約
PyPyには大きな可能性があり、現時点では 互換性が高い CPythonで(そう Flask、Djangoなどを実行できます。 )。
しかし、PyPyの周りには多くの混乱があります(たとえば、この無意味な提案を参照してください。 PyPyPy… )。私の意見では、これは主にPyPyが実際には2つのものであるためです。
で書かれたPythonインタプリタ RPython (Pythonではありません(私は以前に嘘をつきました))。 RPythonは、静的型付けを使用するPythonのサブセットです。 Pythonでは、「 事実上不可能 」型について厳密に合理化するために(なぜそれほど難しいのですか?まあ、次の事実を考慮してください:
x = random.choice([1, 'foo'])
有効なPythonコードになります(クレジット ジェスチャー )。 xのタイプは何ですか?型が厳密に強制されていない場合、変数の型についてどのように合理化できますか?) RPythonを使用すると、ある程度の柔軟性が犠牲になりますが、代わりに、メモリ管理などの合理化がはるかに簡単になり、いくつかの最適化が可能になります。
複数のターゲットのRPythonコードをコンパイルし、JITを追加するコンパイラ。デフォルトのプラットフォームはC、つまりRPython-to-Cコンパイラですが、JVMなどをターゲットにすることもできます。
わかりやすくするために、これらをPyPy(1)およびPyPy(2)と呼びます。
なぜこれら2つのものが必要なのですか、そしてなぜ1つの屋根の下にあるのですか?このように考えてください。PyPy(1)はRPythonで書かれたインタープリターです。次に、ユーザーのPythonコードを取得し、バイトコードにコンパイルします。しかし、インタプリタ自体(RPythonで記述)を実行するには、別のPython実装でインタプリタを解釈する必要があります。
まあ、私たちはただ CPythonを使用する インタプリタを実行します。しかし、これはそれほど速くはありません。
代わりに、PyPy(2)(RPythonツールチェーンと呼ばれる)を使用して、PyPyインタープリターを別のプラットフォーム(C、JVM、CLIなど)のコードにコンパイルし、JITも追加するという考え方です。 。それは魔法です:PyPyはJITをインタプリタに動的に追加し、独自のコンパイラを生成します! 注:繰り返しになりますが、これはおかしなことです。インタープリターをコンパイルし、別の独立した別個のコンパイラーを追加しています。
最終的に、結果はPythonソースコードを解釈し、JIT最適化を活用する独立した実行可能ファイルになります。それが私たちが望んでいたすべてです!たくさんありますが、おそらくこの図が役立つでしょう:
繰り返しになりますが、PyPyの本当の美しさは、JITを気にせずにRPythonでさまざまなPythonインタープリターを自分で作成できることです(いくつかのヒントを除く)。 PyPyは、次を使用してJITを実装します。 ツールチェイン/ PyPy(2)からRPython。
実際、私たちがさらに抽象的であれば、理論的には任意の言語のインタープリターを作成し、それをPyPyに提供して、特定の言語のJITを受け取ることができます。これは、PyPyが、解釈する言語の詳細ではなく、インタープリター自体の最適化に重点を置いているためです。
c corp vs scorp課税理論的には、任意の言語のインタープリターを作成し、それをPyPyに提供して、特定の言語のJITを受け取ることができます。
簡単な余談として、JIT自体は絶対に魅力的です。トレースと呼ばれる手法を使用して、 次のように :
詳細については、 この記事 それは非常にアクセスしやすく、非常に興味深いものです。
CFOとは何ですか?
最後に、PyPy RPython-to-Cコンパイラー(または他のターゲットプラットフォーム)を使用して、RPythonに実装されているPyPyインタープリターをコンパイルします。
なんでこんなにすごいの?このクレイジーなアイデアを追求する価値があるのはなぜですか?おもう アレックスゲイナー あなたの中でうまく定義されている ブログ :「[PyPyは未来です]なぜなら、[それは]より良い速度と柔軟性を提供し、Pythonの成長に最適なプラットフォームだからです。」
要するに:
Python 3000(Py3k) :Python 3.0の代替命名法、著名なPythonリリース、 以前のバージョンと互換性がありません でステージに入った人 2008年 。 Py3kチームはそれがかかるだろうと予測しました 5年 この新しいバージョンが完全に採用されるために。そして、Python開発者の大多数(警告:逸話的な主張)はPython 2.xを使い続けていますが、人々はますますPy3kに気づいています。
ヌンバ :注釈付きPythonコードにJITを追加する「ジャストインタイムに特化したコンパイラ」。基本的に、いくつかのヒントを与えると、コードの一部が高速化されます。 Numbaはディストリビューションの一部として提供されます アナコンダ 、データ分析と管理のためのパッケージのセット。
IPython :他の議論とはかなり異なります。 Pythonの計算環境。インタラクティブで、GUIツールキットをサポートし、ブラウザなどで使用します。
RubyPython :RubyとPythonVM間のブリッジ。 PythonコードをRubyコードに埋め込むことができます。 Pythonの開始位置と停止位置を定義し、RubyPythonがVM間のデータを調整します。
PyObjc :PythonとObjective-Cの間の言語バインディング、それらの間のブリッジとして機能します。これは、PythonコードからObjective-Cライブラリ(OS Xアプリケーションを作成するために必要なすべてのものを含む)を使用でき、Objective-CコードからPythonモジュールを使用できることを意味します。この場合、Objective-CのサブセットであるCでCPythonを作成すると便利です。
PyQt :PyObjcはOS X GUIコンポーネントのバインディングを提供しますが、PyQtはQtアプリケーションフレームワークに対して同じことを行い、豊富なグラフィカルインターフェイスの作成、SQLデータベースへのアクセスなどを可能にします。 Pythonのシンプルさを他のフレームワークにもたらすことを目的とした別のツール。
パジャマ :PythonでWebおよびデスクトップアプリケーションを作成するためのフレームワーク。これには、PythonからJavaScriptへのコンパイラ、一連のウィジェット、およびその他のいくつかのツールが含まれています。
ブライトン :Py3kコードをブラウザで実行できるようにするJavaScriptで記述されたPythonVM。
Eduardo Kienetz、メンバーによって翻訳されたコンテンツ トランスブルンコ 、技術翻訳の市場。