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


51

Javaには、JavaバイトコードにコンパイルしてJVMで実行できる複数の言語があります。Clojure、Groovy、およびScalaは、私の頭の中で覚えている主要な言語です。

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

誰も邪魔しないからか、そうするのを難しくする固有の制限や障壁があるのでしょうか?


30
...彼らはGILに対処したくないのですか?;)
メイソン・ウィーラー

4
本能は、JVMがどれだけ成熟していて、明確に指定されており、JVMが事実上すべてのプラットフォーム上にあるか、簡単に取得できるかどうかに大きく関係していることを教えてくれます。
リグ

4
また、ほとんどのJVMはpythonのインタープリターよりもはるかに高速であると思われます。
ピータースミス

19
Javaバイトコードを対象とすることで、JVMのすべての機能(セキュリティ、パフォーマンス、移植性、スケーラビリティなど)を利用できます。Pythonバイトコードをターゲットにすることは、あまり得られません。
デビッドシュワルツ

3
Pythonバイトコードは、Pythonインタープリターの以降のバージョンでは認識されません。Pythonバイトコードにコンパイルするプログラミング言語を誰でもどのように実装できますか?
ガス

回答:


77

シンプル-前回チェックしたとき、Pythonにはバイトコードを含む正式な仕様がありませんでした。CPythonが仕様であり、バイトコードの移植性はIIRCを必要としません。したがって、これは特定の言語向けに設計された、文書化されていない移動可能なターゲットです。


22
実際、バイトコード形式の詳細はマイナーバージョン間で変更されることが多く、99%互換性のあるPyPyでさえも試行しません(実際、独自のバイトコード命令を追加します)。

注:Python(言語)には正式な仕様があります(「PEP」を参照)。「Python Virtual Machine」にはありません。これは確かに、両方が指定されている(たとえば)Javaとは異なります。
アルバート

56

既存のJavaコードで動作するコードを書きたいが、Javaを書きたくないという才能のある人々がいたため、複数のJVM言語があります

どうやら、既存のPythonコードを使いたいプログラマーはいないが、Pythonを嫌い、別の言語をPythonバイトコードインタープリターに移植することはできません。

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


7
JavaがPythonよりも吸うことやJavaが吸うことを暗示していないことを願っています:
ジョルジオ

8
@Giorgio:Groovy、Scala、Clojureなどのクリエイターは、かなりの改善の余地があると考えていたことを暗示しています。Pythonが悪いとほのめかしていますか?
ケビンクライン

8
pythonで作業した後、「低吸盤係数」は不正確だと思います。それは一般的に受け入れられているものに負けすぎており、その「自己」全体は非常に非生産的です。実際には愚かです。クラスメソッドは、それが属する場所をどのように知らないのですか?
リグ

6
@Rig個人的には、Pythonのアプローチはよりエレガントだと思います。オブジェクト指向は、変数のように見える特別なキーワードを必要とするのではなく、構文から有機的に続きます。クラスメソッドがどこにあるのかわからないのは、Pythonクラス定義が単なるコードであり、このコードがクラス定義内にあるために権限がないためです。メソッドはどこでも定義でき、実行時にクラスに追加できます。実際、同じ関数を複数のクラスのメソッドとして使用することができますが、これは実際にはthisパラダイムでは機能しません。
アンチモン

6
言語ではなくVMの問題だと思います。JVMは世代別ガベージコレクター、JITなどを備えたパフォーマンスの高いVMです。CPythonは参照カウントを使用し、インタープリターです。プラタフォームとしてひどいのはCPythonです。Btw hyhyが存在します。
プエルコポップ14年

26

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

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

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


10

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

さらに調査を行いましたが、実際には1つだけでなく、実際には2つのGILがあります。他のコントロールはImportsです。


1
「GILフリー」は、Python wikiの「CPythonプログラマーがIronPythonに興味を持つ理由」で言及されている技術的理由の1つです。
ヤニス

1
@YannisRizos:.NETフレームワークへのアクセスは、まったく重要ではありません。もちろん、CPythonユーザーはそのことにまったく関心がない可能性があります。
ロバートハーベイ

@RobertHarvey Ninjaはそれを編集しました。私は「派手な新しいおもちゃへのアクセス」を技術的な理由とは考えていませんが(おもちゃが素晴らしいというわけではありません)、WikiはIronPythonの拡張が簡単だとも言及しています。
ヤニス

8

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

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

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

  • もち関数型プログラミングおよび俳優スタイルのプログラミングのための動的型付けプログラミング言語として自身を説明します
  • HyPythonに組み込まれているLispの方言として自分自身を説明します。
  • dgCPythonバイトコードにコンパイルれる(技術的に)単純な言語として自身を記述します

2
HyLang
ideasman42

1
そしてdg
ハカタシ

6

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

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

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

私はPythonが大好きで、本当に好きですが、それを言うのは嫌いです。しかし、パフォーマンスが歯をたててしまうことがあります。

言い換えれば、Pythonに惹かれている人は、言語が好きだからそうします。ただし、好みに合わせてまったく新しい言語を作成する場合は、JVMにコンパイルする方がはるかに適切です。これは、新しい特異な言語が、利用可能な最高の(主観的に、おそらく最高の)オペレーティング環境の1つで始まるからです。

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