apeescape2.com
  • メイン
  • その他
  • エンジニアリング管理
  • トレンド
  • 投資家と資金調達
技術

なぜこれほど多くのPythonがあるのですか?

Pythonは素晴らしいです。

驚いたことに、これは非常にあいまいなステートメントです。 「Python」とはどういう意味ですか?私はPythonを意味します インターフェース 概要?私はCPythonを意味します 実装 一般的なPython(同様の名前のCythonと混同しないでください)?それともまったく違うことを意味するのでしょうか?たぶん私はJython、IronPython、またはPyPyを斜めに参照しています。あるいは、私は本当に底を打って、RPythonまたはRubyPython(非常に非常に異なるもの)について話しているのかもしれません。

上記のテクノロジーは一般的に名前が付けられ、一般的に参照されていますが、それらのいくつかは完全に異なる目的を果たします(または、少なくとも、完全に異なる方法で動作します)。



Pythonを使用しているときに、これらのツールを多数見つけました。* Ython。しかし、つい最近、私はそれらが何であるか、それらがどのように機能するか、そしてなぜそれらが必要とされるのか(それぞれ独自の方法で)理解するのをやめました。

この投稿では、最初からさまざまなPython実装について説明し、最後にPyPyの完全な紹介を行います。これは、この言語の未来であると私は信じています。

それはすべて、「Python」が実際に何であるかを理解することから始まります。

マシンコードや仮想マシンなどをよく理解している場合は、スキップしてください。

「Pythonは解釈またはコンパイルされていますか?」

これは、Pythonの初心者にとってよくある混乱のポイントです。

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

次に気付くのは、「解釈」と「コンパイル」はのプロパティであるということです。 実装 、インターフェースではありません。

色はどんな感情を呼び起こしますか

したがって、質問自体は適切に表現されていません。

Pythonは解釈またはコンパイルされますか?質問は実際にはうまく定式化されていません。

とは言うものの、最も一般的な実装(CPython:Cで記述され、単に「Python」と呼ばれることが多く、私が何について話しているのかわからない場合は確かに使用しているもの)の場合、答えは次のとおりです。 解釈 、と いくつか コンパイル。 CPython **バイトコードのPythonソースコードをコンパイルしてから*解釈します このバイトコードは、進行するにつれて実行されます。

* 注:これは、従来の意味での「コンパイル」ではありません。通常、「コンパイル」とは、高級言語を使用してそれを機械語に変換することです。しかし、それは特定の「コンパイル」です。

バイトコードと機械語

バイトコードとマシン(またはネイティブ)コードの違いを理解することは非常に重要です。おそらく、次の例で最もよく説明されています。

  • Cはマシンコード用にコンパイルし、マシンコードはプロセッサ上で直接実行されます。各命令は、CPUに物事を移動するように指示します。
  • Javaはバイトコード用にコンパイルされ、プログラムを実行するコンピューターの抽象化であるJava仮想マシン(JVM)で実行されます。その後、各命令は、コンピューターと対話するJVMによって処理されます。

簡単に言えば: マシンコードははるかに高速ですが、バイトコードはより移植性が高く安全です 。

マシンコードはマシンによって異なりますが、バイトコードはすべてのマシンで同じように見えます。誰もがマシンコードが何であるかを言うことができます 最適化 あなたの構成のために。

CPythonに戻ると、ツールチェーンプロセスは次のとおりです。

ゲームのUIとは
  1. CPythonは、Pythonソースコードをバイトコード用にコンパイルします。
  2. このバイトコードは、CPython仮想マシンで実行されます。

初心者は、Pythonが.pycファイルのためにコンパイルされていると想定しています。これにはいくつかの真実があります。.pycファイルはコンパイルされたバイトコードであり、それが解釈されます。したがって、以前にPythonコードを実行したことがあり、.pycファイルを使用できる場合は、バイトコードを再コンパイルする必要がないため、2回目はより高速に実行されます。

代替VM:Jython、IronPythonなど

先に述べたように、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文字列 。

ジャストインタイムコンパイル:PyPyと未来

つまり、Pythonの実装はCで、1つはJavaで、もう1つはC#で記述されています。次の論理的なステップ:... Pythonで書かれたPythonの実装(一般の読者ではない人は、これがやや誤解を招くことに気付くでしょう)。

ここで物事が厄介になる可能性があります。まず、ジャストインタイム(JIT)コンパイルについて説明します。

JIT:なぜそしてどのように

ネイティブマシンコードはバイトコードよりもはるかに高速であることを忘れないでください。 *さて、バイトコードの一部をコンパイルして、それをネイティブコードとして実行できるとしたらどうでしょうか**?バイトコード(つまり、時間)をコンパイルするには一定の価格を支払う必要がありますが、最終結果が速ければ、それは素晴らしいことです!これが、インタプリタとコンパイラの利点を組み合わせたハイブリッド手法であるJITコンパイルの動機です。基本的に、JITはコンパイルを使用してインタープリター型システムを高速化したいと考えています。

たとえば、JITが採用したアプローチは次のとおりです。

  1. 頻繁に実行されるバイトコードを特定します。
  2. ネイティブマシンコード用にコンパイルします。
  3. 結果をキャッシュします。
  4. 同じバイトコードを実行する場合は常に、コンパイル済みのマシンコードを使用して、報酬(つまり、速度の向上)を獲得してください。

これはPyPyが行うことです:それはPythonにJITをもたらします(参照 付録 以前の取り組みについて知るため)。もちろん、他の目標もあります。PyPyは、マルチプラットフォームで、メモリ使用量が軽量で、Stacklessをサポートすることを目指しています。しかし、JITは本当にセールスポイントです。平均して、数回のテストを実行した後、パフォーマンスが1倍向上すると言われています 6.27 。これらのデータの内訳については、のグラフを参照してください。 PyPyスピードセンター :

恒久的な給与計算機との契約

PyPyは理解するのが難しい

PyPyには大きな可能性があり、現時点では 互換性が高い CPythonで(そう Flask、Djangoなどを実行できます。 )。

しかし、PyPyの周りには多くの混乱があります(たとえば、この無意味な提案を参照してください。 PyPyPy… )。私の意見では、これは主にPyPyが実際には2つのものであるためです。

  1. で書かれたPythonインタプリタ RPython (Pythonではありません(私は以前に嘘をつきました))。 RPythonは、静的型付けを使用するPythonのサブセットです。 Pythonでは、「 事実上不可能 」型について厳密に合理化するために(なぜそれほど難しいのですか?まあ、次の事実を考慮してください:

    x = random.choice([1, 'foo'])

    有効なPythonコードになります(クレジット ジェスチャー )。 xのタイプは何ですか?型が厳密に強制されていない場合、変数の型についてどのように合理化できますか?) RPythonを使用すると、ある程度の柔軟性が犠牲になりますが、代わりに、メモリ管理などの合理化がはるかに簡単になり、いくつかの最適化が可能になります。

  2. 複数のターゲットの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自体は絶対に魅力的です。トレースと呼ばれる手法を使用して、 次のように :

  1. インタプリタを実行し、すべてを解釈します(JITを追加せずに)。
  2. インタープリター型コードの簡単なプロファイリングを作成します。
  3. 以前に実行した操作を特定します。
  4. これらのコードビットをマシンコード用にコンパイルします。

詳細については、 この記事 それは非常にアクセスしやすく、非常に興味深いものです。

CFOとは何ですか?

最後に、PyPy RPython-to-Cコンパイラー(または他のターゲットプラットフォーム)を使用して、RPythonに実装されているPyPyインタープリターをコンパイルします。

エンディング

なんでこんなにすごいの?このクレイジーなアイデアを追求する価値があるのはなぜですか?おもう アレックスゲイナー あなたの中でうまく定義されている ブログ :「[PyPyは未来です]なぜなら、[それは]より良い速度と柔軟性を提供し、Pythonの成長に最適なプラットフォームだからです。」

要するに:

  • ネイティブコードのソースコードをコンパイルするので高速です (usando JIT)。
  • 通訳者にJITを追加するため、柔軟性があります 追加の作業はほとんどありません。
  • 独自のRPythonインタープリターを作成できるため、(再び)柔軟性があります 、たとえばCよりも拡張が簡単です(実際、非常に簡単なので、独自の通訳者を作成するためのチュートリアルがあります)。

付録:あなたが聞いたことがあるかもしれない他の名前

  • Python 3000(Py3k) :Python 3.0の代替命名法、著名なPythonリリース、 以前のバージョンと互換性がありません でステージに入った人 2008年 。 Py3kチームはそれがかかるだろうと予測しました 5年 この新しいバージョンが完全に採用されるために。そして、Python開発者の大多数(警告:逸話的な主張)はPython 2.xを使い続けていますが、人々はますますPy3kに気づいています。

  • Cython :C関数を呼び出すためのバインディングを含むPythonのスーパーセット。
    • 目的:PythonコードのC拡張機能を記述できるようにします。
    • 追加することもできます 静的型付け 既存のPythonコードに追加して、コンパイルしてCのようなパフォーマンスを実現できるようにします。
    • これはPyPyに似ていますが、同じではありません。この場合、コンパイラに渡す前にユーザーコードを強制的に入力することになります。 PyPyを使用すると、古い/従来のPythonコードを記述し、コンパイラーが最適化を処理します。

  • ヌンバ :注釈付きPythonコードにJITを追加する「ジャストインタイムに特化したコンパイラ」。基本的に、いくつかのヒントを与えると、コードの一部が高速化されます。 Numbaはディストリビューションの一部として提供されます アナコンダ 、データ分析と管理のためのパッケージのセット。

  • IPython :他の議論とはかなり異なります。 Pythonの計算環境。インタラクティブで、GUIツールキットをサポートし、ブラウザなどで使用します。

  • Psyco : 1 Python拡張モジュール 、およびPythonの最初のJITの取り組みの1つ。だからそれはとしてマークされました 「飼われて殺されていない」 。実際、Psycoの主要な開発者は アーミン・リゴ、現在PyPyで働いています 。

言語バインディング

  • 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のシンプルさを他のフレームワークにもたらすことを目的とした別のツール。

フレームワークJavaScript

  • パジャマ :PythonでWebおよびデスクトップアプリケーションを作成するためのフレームワーク。これには、PythonからJavaScriptへのコンパイラ、一連のウィジェット、およびその他のいくつかのツールが含まれています。

  • ブライトン :Py3kコードをブラウザで実行できるようにするJavaScriptで記述されたPythonVM。


Eduardo Kienetz、メンバーによって翻訳されたコンテンツ トランスブルンコ 、技術翻訳の市場。

Redis Pub / Subでリアルタイムに移行

バックエンド

Redis Pub / Subでリアルタイムに移行
エンタープライズクライアントサービスディレクター、グローバル成長市場

エンタープライズクライアントサービスディレクター、グローバル成長市場

その他

人気の投稿
教師あり機械学習アルゴリズムの調査
教師あり機械学習アルゴリズムの調査
AnsiblePlaybookでElasticStackを自動的に更新する
AnsiblePlaybookでElasticStackを自動的に更新する
マイクロインタラクションによるより良いUX
マイクロインタラクションによるより良いUX
JavaScriptでテスト可能なコードを書く:簡単な概要
JavaScriptでテスト可能なコードを書く:簡単な概要
Railsヘルパーの使用方法:ブートストラップカルーセルのデモンストレーション
Railsヘルパーの使用方法:ブートストラップカルーセルのデモンストレーション
 
生体認証セキュリティ–パスワードなしの認証または流行の鍵?
生体認証セキュリティ–パスワードなしの認証または流行の鍵?
シニアテクニカルリクルーター
シニアテクニカルリクルーター
ScalaとJava:なぜScalaを学ぶ必要があるのですか?
ScalaとJava:なぜScalaを学ぶ必要があるのですか?
ピークフローと線形割り当て問題
ピークフローと線形割り当て問題
図像学の超簡単ガイド
図像学の超簡単ガイド
人気の投稿
  • s法人またはc法人
  • モバイルアプリのプロトタイプテストは手動で行うことができますか、それとも何でしょうか?
  • デザインの多様性の定義の原則
  • cvvと郵便番号でハッキングされたクレジットカード番号
  • ウェブデザインのcmsとは
カテゴリー
プロジェクト管理 デザイナーライフ 人とチーム 計画と予測 アジャイル その他 財務プロセス 製品ライフサイクル 設計プロセス Uxデザイン

© 2021 | 全著作権所有

apeescape2.com