web-dev-qa-db-ja.com

Pythonバイトコードにコンパイルする他のプログラミング言語がないのはなぜですか?

Javaでは、Javaバイトコードにコンパイルされ、JVMで実行できる複数の言語があります-Clojure、Groovy、およびScalaは私ができる主なものです私の頭のてっぺんを思い出してください。

ただし、PythonもPythonインタープリターによって実行される前にバイトコード(.pycファイル)に変換されます。私は無知かもしれませんが、なぜそこにないのですか? pythonバイトコードにコンパイルする他のプログラミング言語?

それは誰も気にしなかったからなのか、それともそうすることを難しくしているある種の固有の制限または障壁があるのですか?

51
Michael0x2a

シンプル-前回チェックしたとき、Pythonには、バイトコードを含む正式な仕様がありませんでした。CPythonが仕様であり、バイトコードの移植性はIIRCが不要です。したがって、これは、特定の言語。

78
p_l

既存のJavaコードで動作するコードを記述したいと思った才能のある人がいたため、JVM言語は複数ありますしかし、Javaを記述したくありませんでした

どうやら既存のPythonコードを操作したいプログラマはいないが、Pythonバイトコードインタープリタに別の言語を移植するのに十分なPythonは嫌いだ。

これは2つの方法で見ることができます。JVMにはJavaが広く普及しているために代替言語があるか、PythonバイトコードインタープリターにはPython吸いません。

55
kevin cline

CPythonのGILなどの技術的な欠陥がありますが、認識されているlanguageの欠陥はほとんどないため、ランタイムはPythonコミュニティのセールスポイントではありません。正反対です。 、GIL/CPython実装への不満のため、より多くのバックエンドランタイムオプションがあります。

Java言語は、JVMよりもはるかに悪質です(Javaコミュニティでも)。

JVMはほとんどのサークルでかなりよく評価されています。したがって、高度に最適化されたバックエンドJVMの利点を備えた、異なる/より優れた言語のフロントエンドに対する要望。

26
user7519

私はメイソン・ウィーラーが正しいと言います。これは主に、同時実行性を非常に厄介な問題にするグローバルインタープリターロックの問題です。並行性を非常によく実行する他のVMがあるので、それらの言語を開発することは理にかなっています。また、Pythonは最近大きな言語シフトがあり、多くのライブラリーは互換性を穏やかな悪夢にすることを追いつけていません。たとえば、私はビジョンワークにPILを使用しているため、 Python 2.7以下。これは、特に後者の場合、言語の相互運用を考慮して設計されたJVMまたはCLIのセットアップには当てはまりません。

さらに調査を行ったところ、GILは実際には1つだけでなく2つあるようです。その他のコントロール Imports

10
World Engineer

他の答えは非常に理にかなっていますが、実際にはPythonにコンパイルできる言語があります。意志があるところ...

これらの言語については何も知りませんが、ソースコードをPython ASTにトランスパイルし、Pythonツリーをバイトコードにコンパイルすることで、他の回答で言及されている問題を回避する。

コメントに基づいて、Python VM(他の言語をここに追加してください))を使用する3つの代替言語を現在知っています。

  • Mochi それ自体を関数型プログラミングおよびアクタースタイルプログラミング用の動的型付けプログラミング言語として説明します。
  • Hy :自分自身をPythonに埋め込まれたLISPの方言と記述します。
  • dg :自身をCPythonバイトコードにコンパイルする(技術的に)単純な言語と記述します。
8
Carl Smith

もう1つの理由は、JVMが高度に最適化され、十分に進化し、非常に完全なエコシステムであることです。それ自体で、他のコンパイル済み言語と非常によく競合します。 (私はそれがベスト汎用であるとは言いませんVMそこにありますが、私は確かにそのことに私のキャリアを傾けてきました。)したがって、JVMにアクセスする、それ自体はバイトコードを書くのではなく、望ましいです。

ただし、Python VMは適切ですが、(Pythonに対しては何も)いくつかの重大な欠点があります。Pythonランタイム環境言語の動的な性質によく適合しますが、そのメモリ使用量、グローバルロック、またはスレッドモデルに慣れると、本当に驚くことができます。

直接比較では、JVMは通常、Python VMの2倍の速度です。JVMは(驚くほど)ネイティブでコンパイルされたコードとも、「ホット」な最適化に基づいてうまく競合します。そして、それはより洗練されたスレッド処理などを数えさえしていません。

私はPythonが大好きです。本当に好きです。言いたくないのですが、パフォーマンスが気になってしまうことがあります。そうでなければ、なぜnumpyやscipyのような重要なPythonライブラリがフォールバックする必要があるのでしょうか。 Cコードに?

言い換えれば、Pythonそうする言語が好きなためです。しかし、好みに合わせて新しい言語を書きたい場合は、新しい固有言語は、利用可能な最高の(主観的にはおそらく最高の)動作環境の1つで開始されるため、JVMへのコンパイルのほうがはるかに優れています。

6
Rob