PythonとCpython


447

PythonとCPython (Jython、IronPython)のこの大騒ぎは何ですか、わかりません:

python.orgはCPythonが次のとおりであることを述べています:

Pythonの「伝統的な」実装(CPythonのニックネーム)

さらに別のスタックオーバーフローの質問では、次のように述べられています。

CPythonは、Pythonのデフォルトのバイトコードインタープリターであり、Cで記述されています。

正直に言って、これらの両方の説明が実際に何を意味するのかわかりませんが、私が思ったのは、CPythonを使用する場合、サンプルのPythonコードを実行すると、C言語にコンパイルされ、Cであるかのように実行されるということです。コード

それでは、CPythonとは正確には何であり、Pythonと比較した場合、どのように異なるのでしょうか。PythonではなくCPythonを使用する必要がありますか。そうであれば、その利点は何ですか。


回答:


689

では、CPythonとは何でしょうか。

CPythonはオリジナルの Python実装です。Python.orgからダウンロードした実装です。人々はそれをCPythonと呼んで、それを後で他のPython実装と区別し、言語エンジンの実装とPython プログラミング言語自体を区別しています。

後者の部分は、混乱の元です。Python-the-language 、Pythonコードを実行するものから分離する必要あります。

CPythonはたまたま Cで実装されています。これは実際には、実装の詳細にすぎません。CPythonはPythonコードをバイトコードに(透過的に)コンパイルし、評価ループでそのバイトコードを解釈します。

CPythonはまた、新しい機能を実装した最初のものです。Python-the-language開発では、CPythonをベースとして使用します。他の実装が続きます。

Jythonなどはどうですか?

JythonIronPython、およびPyPyは、Pythonプログラミング言語の現在の「その他」の実装です。これらはそれぞれJava、C#、RPython(Pythonのサブセット)で実装されています。JythonはPythonコードをJavaバイトコードにコンパイルするため、PythonコードをJVMで実行できます。IronPythonを使用すると、Microsoft CLR上でPythonを実行できます。また、PyPyはPython(のサブセット)に実装されているため、CPythonよりも速くPythonコードを実行できます。:-)

実際にCにコンパイルする

したがって、CPythonはPythonコードをそれ自体でCに変換しませ。代わりに、インタープリターループを実行します。そこプロジェクト行い CへのPythonっぽいコードを変換するには、そのが呼び出されCython。CythonはPython言語にいくつかの拡張機能を追加し、あなたがCの拡張にコードをコンパイルすることができます、コードのプラグことはCPythonインタプリタ。


93
理論的には、Pythonスクリプトは任意の実装を使用して実行でき、スクリプトの実行結果は同じになるはずです。
ダグラスメンディサーバル2013年

3
事実として、また作業しているプロジェクトによっては、いくつかの実装でPythonコードをテストしてプロファイルすることをお勧めします。以前にJava + Jythonプロジェクトに取り組んだことがあるので、開発者はこのプラットフォームでライブラリを十分にテストしていないため、多くの驚きに遭遇する可能性があります。
rahmu 2013年

9
「PyPyはCPythonより速い」と言うのは少し危険だと思います。ここでは正確にその質問には非常に良い答えがあります:stackoverflow.com/questions/18946662/...は
マックスLeske

IronPythonにワクワクしました...それがPython 2.xのみをサポートすることがわかるまで。
ショーンアンダーソン

@SeanAnderson:同じことがJythonにも当てはまります(2015年までの公式リリースは互換性がわずか2.5であり、9年古くなりました。最終的に2.7リリースが2015年にリリースされましたが、それでも3.xリリースの兆候はありません)。
ShadowRanger

90

言語と実装を区別する必要があります。Pythonは言語です。

ウィキペディアによると、「プログラミング言語は、計算またはアルゴリズムの仕様であるプログラムを書くための表記法です」。これは、コードを記述するためのルールと構文にすぎないことを意味します。別に、ほとんどの場合、実際のインタプリタまたはコンパイラであるプログラミング言語の実装があります。

Pythonは言語です。CPythonはCでのPythonの実装です。JythonはJavaでの実装などです。

まとめると、すでにCPythonを使用しています(ここからダウンロードし場合)。


2
Martijn Pietersの投稿「CPythonはPythonコード自体をCに変換しない。代わりにインタープリターループを実行する。Python風のコードをCに変換するプロジェクトがあり、これはCythonと呼ばれる」
Raymondシュノン

2
なぜCpythonにそれほど多くの障害があるのか​​。つまり、Cc ++やCJava、さらにはCSwiftも聞こえません。それとも何か不足していますか?
Suhaib

3
@Suhaib:Javaの世界では、HotSpot、OpenJDK、IBM J9 JDK、Azulなどがあります。通常はより正確です。つまり、「Javaのインストール」は表示されず、「互換性のあるJava 8 JDK、たとえばOracle JDK 8のインストール」が表示されます。JavaScriptの世界では、node.js、V8などがあります。「node.jsをインストールする」のではなく、「JavaScriptをインストールする」のではありませんか?しかし、Pythonの世界では、特定のランタイムではなく言語仕様を参照して、「Python 3.6をインストールする」と言って実行するのが一般的です。
ヘンディイラワン2017

37

CPython、JPython、IronPython、PyPyがどのように異なるのかを理解するのにも同じ問題がありました。

だから、私が説明を始める前に、3つのことをクリアしたいと思います:

  1. Python:これは言語であり、インタプリタ(Pythonコードを受け入れるプログラム)に自分を伝達/表現する方法を記述/説明するだけです。
  2. 実装:それはすべてのインタプリタが、具体的には、書かれていたかについてであるどのような言語にし、何それはやって終わります
  3. バイトコード:これは、「実際の」コンピュータマシンであるハードウェアプロセッサではなく、通常は仮想マシンと呼ばれるプログラムによって処理されるコードです。

CPythonはC言語で書かれた実装です。最終的に、Python固有のバイトコード(スタックマシンベースの命令セット)が生成され、実行されます。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)

  5     >>   20 LOAD_GLOBAL              0 (print)
             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バイトコード形式で他のマシンに移植できるようにするために行われます。これでも混乱する場合は、このWebページをご覧ください

ここでは、CPythonのバイトコードがJythonのように移植可能かどうかを尋ねるかもしれませんが、そうではないと思います。CPythonの実装で生成バイトコードは、コードのさらなる実行のために簡単にそれを作るためにそのインタプリタに対して特異的であった(私は、また、処理の多くの他の通訳で行われるだけで容易にするために、そのような中間バイトコード生成を疑います)。

したがって、Jythonでは、Pythonコードをコンパイルすると、JVMで実行できるJavaバイトコードが生成されます。

同様に、IronPython(C#言語で記述)は、Pythonコードを共通言語ランタイム(CLR)にコンパイルします。これは、Microsoftが開発したJVMと比較して類似したテクノロジーです。


3
詳細な説明はthx !! つまり、CPythonはPythonコードをバイトコードに変換し、バイトコードをマシンコードに変換します。ナットシェルでは、CPythonはコンパイラ(Pythonからバイトコードへ)とPython仮想マシン(バイトコードからマシンコードへ)ですか?.Netと同じように、C#をMSILに変換するC#コンパイラと、MSILからマシンコードに変換するCLRがあります。
rahulaga_dev 2018年

30

この記事では、Pythonの異なる実装の違いについて徹底的に説明します。記事のように:

最初に気づくのは、「Python」がインターフェースであることです。Pythonが何をすべきか、どのように振る舞うべきか(他のインターフェースと同様に)の仕様があります。そして、(他のインターフェースと同様に)複数の実装があります。

2番目に理解すべきことは、「解釈」と「コンパイル」はインターフェースではなく、実装のプロパティであることです。


20

Pythonは言語です。プログラムの作成に使用できる一連のルールです。この言語にはいくつかの実装があります。

どの実装を採用しても、それらはほとんど同じことを実行します。プログラムのテキストを取得して解釈し、その命令を実行します。コードをCやその他の言語にコンパイルするものはありません。

CPythonは、Cで書かれた元の実装です(「CPython」の「C」の部分は、Pythonインタープリター自体の作成に使用された言語を指します)。

Jythonは同じ言語(Python)ですが、Javaを使用して実装されています。

IronPythonインタープリターはC#で作成されました。

PyPy-Pythonで書かれたPythonインタープリターもあります。あなたの選択をしてください:)


8

implementationPythonの実装に使用された言語であり、Pythonコードの実装方法ではありません。CPythonを使用する利点は、Cランタイムを利用できることと、C / C ++と簡単に統合できることです。

したがって、CPythonはもともとを使用して実装されていましたC。PythonがJava(JYthon)または.NETランタイム(IronPython)をてこ入れできるようにした元の実装には、他にも分岐点がありました。

使用する実装によっては、ライブラリの可用性が異なる場合があります。たとえば、JythonではCtypesを使用できないため、ctypesを使用するライブラリはJythonでは機能しません。同様に、Javaクラスを使用する場合、CPythonから直接使用することはできません。接着剤が必要(JEPP)またはJython(PythonのJava実装)を使用する必要がある


4

グローバルインタープリターロックのため、CPythonは実際にはマルチスレッドをサポートしていないことを知っておく必要があります。また、再帰のための最適化メカニズムがなく、他の実装やライブラリが満たそうとする他の多くの制限があります。

あなたは見てとるべきこのページを Pythonのウィキに。

このページのコードスニペットを見てください。インタープリターが何であるかがよくわかります。


17
CPythonはマルチスレッドをサポートしますが、GILは複数のコアまたはCPUの利用を困難にします。これは、マルチスレッドをまったくサポートしないこととはまったく同じではありません。
Martijn Pieters

0

Pythonの元の標準の実装は、通常CPython、他のオプションと比較したいときに呼び出されます(それ以外の場合は単なる「Python」)。この名前は、ポータブルでコーディングされていることに由来していANSI C language codeます。これは、http: //www.python.orgから取得し、ActivePythonおよび Enthoughtディストリビューションで取得するPythonであり、ほとんどのLinuxおよびMac OS Xマシンで自動的に使用されます。マシンにプリインストールされているバージョンのPythonを見つけた場合、それはおそらく CPythonです。会社または組織がより特殊な方法でPythonを使用している場合を除きます。

Pythonを使用してスクリプトJava.NETアプリケーションを作成したり、メリットStacklessPyPy魅力的なものを見つけたい場合を除いて、おそらく標準CPythonシステムを使用する必要があります。これは言語のリファレンス実装であるため、代替システムよりも高速に実行され、最も完全で、最新かつ堅牢な傾向があります。


3
私は失礼なことをするつもりはありませんが、CPythonは絶対に最速で実行されません。
2018年

0

プログラミング言語の実装は、コンピュータプログラムを実行するためのシステムです。

プログラミング言語の実装には、2つの一般的なアプローチがあります。

  • 解釈:インタプリタは、ある言語のプログラムを入力として受け取り、その言語で書かれたアクションをあるマシンで実行します。
  • コンパイル:コンパイラーは、ある言語のプログラムを入力として受け取り、そのプログラムを他の言語に翻訳します。この言語は、別のインタープリターまたは別のコンパイラーへの入力として機能します。

Pythonは、1991年にGuido van Rossumによって作成された、解釈された高水準プログラミング言語です。

CPythonはPythonコンピューティング言語のリファレンスバージョンであり、Guido van Rossumによって作成されたCで書かれています。

Python実装の他のリスト

ソース

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.