ベストアンサー
CPythonは、Cプログラミング言語で記述されたPythonのリファレンス実装です。他にも多くの実装があり、Cの他の実装も含まれます。ただし、CPythonが最も広く使用されており、他のすべての実装と比較されます。
Pythonは言語仕様です。特定の実装を指定して実装の詳細を参照する場合、それはCPythonバージョンを参照していると合理的に想定されます。
実装を検索できますが、結果が多少混乱する可能性があります。すべての実装が完了しているわけではなく、すべてが「通常の」システムや従来のプログラム実行環境(ターミナルウィンドウやテキストコンソールなど)で実行されているわけでもありません。
たとえば、 MicroPython は、マイクロコントローラーを対象としたCPythonからの派生物です。 Jython はJavaで記述され、JVM(Java仮想マシン)で実行され、ネイティブJavaをインポートして相互運用するための機能(イントロスペクションを含む)が含まれています。 IronPython はMicrosoftのC#で記述されており、.NET FrameworkのCLR(共通言語ランタイム)内で実行することを目的としています。 PyPy はPythonのバージョンで、ほとんどがPythonで記述されていますが、言語の制限されたサブセットを実装し、JIT(Just-In-タイムダイマニック/ランタイムコンパイル)。 (そのサブセットは RPython と呼ばれ、Python以外のものをサポートすることを目的としています。
混乱の意味を理解してください。
JavaScript で記述され、通常のブラウザー(DOM…またはDocumenr)内から実行するように設計されたPythonの実装が少なくとも2つあります。オブジェクトモデル…環境)。それらは Brython と Skulpt です。さらに、 Transcrypt や pyjs aなど、いくつかの異なる「トランスパイラー」またはPythonからJavascriptへのコンパイラがあります。 >-(正式にはPyjamas)そしておそらく RapydScript (PythonとJSのハイブリッドのようなものですが)
ご覧のとおり、主題を深く掘り下げると、さまざまなプロジェクトやツールを「実装」として分類することがますます難しくなります。
たとえば、 Cython は、特別に注釈が付けられたPythonのようなコードを取得し、それをロード可能な(バイナリ/ネイティブ)モジュールにコンパイルするツールです。このモジュールは、Pythonにインポートして、他のネイティブにコンパイルされたインタープリターの拡張機能と同じように使用できます。これは、Pythonコードの選択されたスニペットを、CPythonインターペッターのバイナリ拡張に最適化するためのツールほど、Pythonの「実装」とは見なされていません。 (Jythonで作業している場合は、Javaでコードの一部を書き直し、Jythonの相互運用機能とイントロスペクション機能を使用してそのコードを使用できます。例として)
Numba は、Pythonのサブセットと NumPy コードを LLVM およびLLVMランタイムサポートをPythonインタープリターの実行中のエンジンに統合します。これは、Cythonの特徴的なモジュール/拡張パラダイムというよりもJITのようなものとして説明されています。それでも、それは言語全体の「実装」というよりはツールです。
しかし、 Nuitka を見ると、 Pythonプログラム全体をコンパイルする野心的なプロジェクト。
さらに別のプロジェクト(Pythonの作成者であるGuido van Rossumが取り組んでいるようです)は mypy -オプションの静的型付けといくつかのローカル型推論を備えたPython。これは新しい実装ではありません。これは、Python(オプションの型注釈付き)を処理し、(注釈なしの)PythonをCPythonランタイムエンジン(インタープリター)に戻す一種のフロントエンドのようです。
さらに多くの実装に飛び込みたい場合 PythonImplementations-Python Wiki 。
ここではそれらの多くを取り上げ、それらがどのように関連しているかを説明しようとしたことに注意してください。ある程度まで。そのwikiページは、説明が少なく、死んだプロジェクトや保守されていないプロジェクトへのリンクがいくつかある、手に負えないものです。
回答
CPython、JPythonの理解に同じ問題がありました。 、IronPython、PyPyは互いに異なります。
したがって、説明を始める前に、次の3つのことをクリアしたいと思います。
- Python :これは言語であり、インタプリタ(Pythonコードを受け入れるプログラム)に自分自身を伝える/表現する方法を述べたり説明したりするだけです。
- 実装:インタプリタがどのように記述されたか、具体的にはでどの言語と最終的に何をするか。
- バイトコード:これは、「実際の」コンピュータマシンであるハードウェアプロセッサではなく、通常は仮想マシンと呼ばれるプログラムによって処理されるコードです。
CPythonはC言語で書かれた実装。最終的に、Python固有のバイトコード(スタックマシンベースの命令セット)を生成して実行します。 Pythonコードをバイトコードに変換する理由は、マシン命令のように見える場合はインタープリターを実装する方が簡単だからです。ただし、実行前にバイトコードを生成する必要はありません(ただし、CPythonは生成します)。
CPythonのバイトコードを確認したい場合は、次のことができます。方法は次のとおりです。
>>> def f(x, y): # line 1
... print("Hello") # line 2
... if x: # line 3
... y += x # line 4
... print(x, y) # line 5
... return x+y # line 6
... # line 7
>>> import dis # line 8
>>> dis.dis(f) # line 9
2 0 LOAD\_GLOBAL 0 (print)
2 LOAD\_CONST 1 ("Hello")
4 CALL\_FUNCTION 1
6 POP\_TOP
3 8 LOAD\_FAST 0 (x)
10 POP\_JUMP\_IF\_FALSE 20
4 12 LOAD\_FAST 1 (y)
14 LOAD\_FAST 0 (x)
16 INPLACE\_ADD
18 STORE\_FAST 1 (y)
22 LOAD\_FAST 0 (x)
24 LOAD\_FAST 1 (y)
26 CALL\_FUNCTION 2
28 POP\_TOP
6 30 LOAD\_FAST 0 (x)
32 LOAD\_FAST 1 (y)
34 BINARY\_ADD
36 RETURN\_VALUE
では、上記のコードを見てみましょう。 1行目から6行目は関数定義です。 8行目では、CPython(インタープリター)によって生成された中間Pythonバイトコード(または、Pythonバイトコードのディスアセンブラー)を表示するために使用できる「dis」モジュールをインポートします。
注:このコードへのリンクを#python IRCチャネルから取得しました: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
次に、Javaで記述されてJavaバイトコードを生成するJythonがあります。 Javaバイトコードは、Java仮想マシン(JVM)の実装であるJavaランタイム環境で実行されます。これが紛らわしい場合は、Javaがどのように機能するかについての手がかりがないのではないかと思います。簡単に言うと、Java(コンパイラではなく言語)コードはJavaコンパイラによって取得され、JREを使用してのみ実行できるファイル(Javaバイトコード)を出力します。これは、Javaコードがコンパイルされると、JREでのみ実行できるJavaバイトコード形式で他のマシンに移植できるようにするために行われます。それでも混乱する場合は、このウェブページをご覧ください。
ここで、CPythonかどうかを尋ねることができます。 ” ■バイトコードはJythonのように移植可能ですが、そうではないと思います。CPython実装で生成されたバイトコードは、コードのさらなる実行を容易にするために、そのインタープリターに固有のものでした(私もこのような中間バイトコードの生成は、他の多くのインタープリターで処理を簡単にするために行われていると思われます)上記のコードのようにバイトコードを実行するのが簡単であるかどうか疑問に思っている場合(9行目から最後まで) )、次に、これを考えてください。スタック(データ構造)があり、バイトコードのすべての行がそれに応じてスタックを変更するスタック操作を実行します。この変更されたスタックは、コードの最終出力を生成するためにCPython(インタープリター)によって使用されます。
したがって、Jythonでは、Pythonコードをコンパイルすると、JVMで実行できるJavaバイトコードになります。
同様に、IronPyt hon(C#言語で記述)は、Pythonコードを共通言語ランタイム(CLR)にコンパイルします。これは、Microsoftが開発したJVMと同様のテクノロジです。