web-dev-qa-db-ja.com

PythonとCpython

PythonとCPythonについてのこのすべての煩わしさ (Jython、IronPython) 、わかりません。

python.org はCPythonが以下のものであることを述べています。

Pythonの "伝統的な"実装(CPythonと呼ばれる)

さらに別のスタックオーバーフローの質問

CPythonはPythonのデフォルトのバイトコードインタプリタで、Cで書かれています。

正直に言って、私はこれらの説明の両方が実際に何を意味するのかわからないが、それは私が思ったことだと思った。 私がサンプルPythonコードを実行するときCコードでした

それではCPythonとは正確には何であり、pythonと比較した場合、それはどう違うのでしょうか。おそらく私はPythonよりもCPythonを使用すべきでしょうか。

358
K DawG

それでは、CPythonとは何ですか?

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

後者の部分は、混乱の原因です。 Pythonの言語は、Pythonコードを実行する実行とは別にする必要があります。

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

CPythonは、新機能を最初に実装したものでもあります。 Python言語開発では、ベースとしてCPythonを使用します。他の実装が続きます。

Jythonなどはどうですか?

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

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

CPythonはPythonコードを単独でCにnot変換します。代わりに、インタープリターループを実行します。そこにプロジェクトですdoesはPython風のコードをCに変換し、それは Cython と呼ばれます。 CythonはPython言語にいくつかの拡張機能を追加し、CPythonインタープリターにプラグインするコードをC拡張機能にコンパイルできるようにします。

603
Martijn Pieters

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

Wikipedia によれば、「プログラミング言語はプログラムを書くための表記法であり、それは計算またはアルゴリズムの仕様である」。これは単にコードを書くためのルールと構文だということです。 プログラミング言語の実装があります ほとんどの場合、これは実際のインタープリタまたはコンパイラです。

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

まとめると:あなたはすでにCPythonを使っています( here からダウンロードした場合)。

70
jamylak

この article はPythonの異なる実装の違いを徹底的に説明しています。記事がそれを置くように:

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

2番目に気づくべきことは、「解釈済み」と「コンパイル済み」は、インターフェースではなく実装の特性であるということです。

27
shaktimaan

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」モジュールをインポートします。

_ note _ :#python IRC channelからこのコードへのリンクを取得しました: https://Gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

そして、Jythonがあります。これはJavaで書かれていて、Javaバイトコードを生成することになります。 Javaバイトコードは、Java Virtual Machine(JVM)の実装であるJava Runtime Environment上で動作します。これが紛らわしいならば、私はあなたがJavaがどのように働くかについての手がかりがないと思われます。一般的には、Java(コンパイラではなく言語)コードがJavaコンパイラによって使用され、JREを使用してのみ実行できるファイル(Javaバイトコード)を出力します。これは、Javaコードがいったんコンパイルされると、それをJREでしか実行できないJavaバイトコード形式で他のマシンに移植できるようにするためです。これがまだ混乱しているならば、あなたはこの ウェブページ を見てもらいたいかもしれません。

ここで、あなたはCPythonのバイトコードがJythonのように移植性があるかどうか尋ねるかもしれません、私はそうではないと思います。 CPython実装で生成された バイトコードは、コードのさらなる実行を容易にするためにそのインタープリタに固有のものでした (このような中間バイトコード生成、処理の容易さのためだけに他の多くのインタープリタでも行われます。 ).

そのため、Jythonでは、Pythonコードをコンパイルすると、Javaバイトコードが生成されます。これはJVM上で実行できます。

同様に、IronPython(C#言語で書かれています)は、PythonコードをCommon Language Runtime(CLR)にコンパイルします。これは、Microsoftが開発したJVMと比較して同様のテクノロジです。

25
Vijay Kumar

Pythonは言語です。プログラムを書くために使用できる一連の規則です。この言語にはいくつかの実装があります。

どのような実装を採用しても、ほとんど同じことができます。プログラムのテキストを取得して解釈し、その指示を実行します。それらのどれもあなたのコードをCや他の言語にコンパイルしません。

CPythonはCで書かれたオリジナルの実装です。( "CPython"の "C"部分はPythonインタプリタ自身を書くのに使われた言語を指します。)

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

IronPythonインタプリタはC#で書かれました。

Pythonで書かれたPythonインタプリタ、PyPyもあります。あなたの選んでください:)

19
orlenko

implementationは、Pythonの実装に使用された言語ではなく、Pythonの実装に使用された言語を意味します。 CPythonを使用する利点は、CランタイムとC/C++との統合が容易なことです。

そのためCPythonはもともとCを使って実装されていました。 PythonがJavaの最先端のJava(JYthon)または.NET Runtime(IronPython)を使用できるようにした、元の実装へのフォークは他にもありました。

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

7
Abhijit

Global Interpreter Lock のため、CPythonはマルチスレッドを実際にはサポートしていません。また、再帰のための最適化メカニズムもなく、他の実装やライブラリが満たすことを試みる他の多くの制限があります。

Python wikiで このページ をご覧ください。

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

2
TheEnglishMe

オリジナルの、そして標準的な Python の実装は、他のオプション(そして単なる“ Python”、そうでなければ)と対比させたい場合、通常 CPython と呼ばれます。これが移植可能でコーディングされているという事実 ANSI C language code これは http://www.python.org から取得した ActivePythonEnthought の配布物から入手できるPythonです。あなたのマシンにインストール済みのバージョンのPythonが見つかったのなら、おそらくあなたの会社や組織がより専門的な方法でPythonを使っているのでなければ CPython でしょう。

Pythonで Java または .NET アプリケーションを作成したり、 Stackless または PyPy 説得力のある利点を見つけたいのでなければ、おそらく CPython システムを使用します。 。これは言語の参照実装であるため、最も速く実行され、最も完成され、そして他のシステムよりも最新かつ堅牢である傾向があります。

0

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

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

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

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

CPython は、 Guido van Rossum によって作成されたCで書かれたPythonコンピューティング言語の参照バージョンです。

その他のPythonの実装のリスト

出典

0
Premraj