Mengapa tidak ada bahasa pemrograman lain yang mengkompilasi ke bytecode Python?

51

Di Jawa, ada beberapa bahasa yang dikompilasi ke bytecode Java dan dapat berjalan di JVM - Clojure, Groovy, dan Scala menjadi bahasa utama yang dapat saya ingat dari atas kepala saya.

Namun, Python juga berubah menjadi bytecode (file .pyc) sebelum dijalankan oleh penerjemah Python. Saya mungkin hanya bodoh, tetapi mengapa tidak ada bahasa pemrograman lain yang mengkompilasi bytecode python?

Apakah hanya karena tidak ada yang peduli, atau ada semacam pembatasan atau penghalang yang melekat yang membuat hal itu sulit dilakukan?

Michael0x2a
sumber
30
... karena mereka tidak mau berurusan dengan GIL? ;)
Mason Wheeler
4
Naluri akan memberi tahu saya bahwa itu ada hubungannya dengan seberapa matang JVM, ditentukan dengan baik, dan JVM ada di hampir semua platform atau bodoh yang mudah didapat.
Rig
4
Saya curiga juga bahwa sebagian besar JVM jauh lebih cepat daripada penterjemah python.
Peter Smith
19
Dengan menargetkan Java bytecode, Anda mendapatkan semua fitur JVM (keamanan, kinerja, portabilitas, skalabilitas, dan sebagainya). Menargetkan bytecode Python tidak membuat Anda terlalu banyak.
David Schwartz
3
Bytecode Python tidak dikenali oleh versi interpreter Python yang lebih baru. Bagaimana orang dapat mengimplementasikan bahasa pemrograman yang mengkompilasi bytecode Python?
Gus

Jawaban:

77

Sederhana - terakhir kali saya memeriksa, Python tidak memiliki spesifikasi formal, termasuk bytecode-nya. CPython adalah spec, dan portabilitas bytecode adalah IIRC tidak diperlukan. Dengan demikian, ini adalah target bergerak, tidak berdokumen yang dirancang untuk bahasa tertentu.

p_l
sumber
22
Bahkan, detail format bytecode sering berubah di antara versi minor, dan bahkan PyPy yang kompatibel 99% bahkan tidak mencoba (pada kenyataannya, mereka menambahkan instruksi bytecode mereka sendiri).
Catatan: Python - bahasa - memiliki spesifikasi formal (lihat "PEP"). 'Mesin Virtual Python' belum. Ini memang tidak seperti (misalnya) Java, di mana keduanya ditentukan.
Albert
56

Ada beberapa bahasa JVM karena ada orang-orang berbakat yang ingin menulis kode yang akan bekerja dengan kode Java yang ada, tetapi mereka tidak ingin menulis Jawa .

Rupanya tidak ada programmer yang ingin bekerja dengan kode Python yang ada, tetapi membenci Python cukup untuk port bahasa lain ke interteter bytecode Python.

Anda dapat melihat ini dalam dua cara: ada bahasa alternatif untuk JVM karena Java sangat luas, atau tidak ada bahasa alternatif untuk penerjemah bytecode Python karena Python tidak payah.

kevin cline
sumber
7
Saya harap Anda tidak menyiratkan bahwa Java sucks atau Java sucks more than Python :-)
Giorgio
8
@Giorgio: Saya menyiratkan bahwa pencipta Groovy, Scala, Clojure, dll. Berpikir ada ruang yang cukup untuk perbaikan. Apakah Anda menyiratkan bahwa Python menyebalkan?
kevin cline
8
Setelah bekerja dengan python saya akan mengatakan "faktor penghisap rendah" akan tidak akurat. Itu menghasilkan terlalu banyak barang yang diterima secara umum dan bahwa keseluruhan 'diri' itu sangat kontraproduktif. Sebenarnya bodoh. Bagaimana metode kelas tidak tahu di mana tempatnya?
Rig
6
@Rig Secara pribadi, saya pikir pendekatan Python lebih elegan. OO mengikuti secara organik dari sintaks daripada membutuhkan kata kunci khusus yang terlihat seperti variabel. Mengenai mengapa metode kelas tidak tahu di mana mereka berada, itu karena definisi kelas Python hanya kode, dan kode ini tidak di-privleded karena kebetulan berada di dalam definisi kelas. Anda dapat mendefinisikan metode di mana saja dan menambahkannya ke kelas saat runtime. Bahkan, Anda dapat mengambil fungsi yang sama dan menggunakannya sebagai metode di banyak kelas, sesuatu yang tidak akan bekerja dengan thisparadigma.
Antimony
6
Saya pikir ini adalah masalah VM bukan bahasa. JVM adalah VM berkinerja dengan pengumpul sampah generasi, JIT, dll. Sementara CPython menggunakan penghitungan referensi dan merupakan juru bahasa. Ini adalah CPython yang menyebalkan sebagai plataform. Btw hyhy ada.
PuercoPop
26

Ada kekurangan teknis seperti GIL di CPython, tetapi sedikit kekurangan bahasa yang dirasakan , sehingga runtime bukan titik penjualan komunitas Python. Justru sebaliknya, ada lebih banyak opsi runtime backend karena ketidakpuasan dengan implementasi GIL / CPython.

Bahasa Jawa jauh lebih difitnah daripada JVM (bahkan di komunitas Jawa).

JVM cukup dihormati di sebagian besar lingkaran; dengan demikian keinginan untuk front bahasa yang berbeda / lebih baik berakhir dengan manfaat dari JVM back end yang sangat dioptimalkan.


sumber
10

Saya mengatakan bahwa Mason Wheeler benar. Ini sebagian besar masalah dengan Global Interpreter Lock yang membuat concurrency menjadi masalah yang sangat sulit. Karena ada beberapa VM lain yang melakukan konkurensi dengan sangat baik, masuk akal untuk mengembangkan bahasa untuk itu. Python juga telah mengalami pergeseran bahasa baru-baru ini dan banyak perpustakaan belum berhasil menjadikan kompatibilitas sebagai mimpi buruk yang ringan. Misalnya karena saya menggunakan PIL untuk pekerjaan penglihatan, saya harus kode dalam Python 2.7 atau lebih rendah. Ini bukan kasus dengan pengaturan JVM atau CLI yang khususnya dalam kasus yang terakhir dirancang dengan bahasa interop dalam pikiran.

Melakukan penelitian lebih lanjut dan ternyata sebenarnya ada dua GIL bukan hanya satu. Yang lain mengontrol Impor .

Insinyur Dunia
sumber
1
"GIL gratis" adalah salah satu alasan teknis yang disebutkan pada "Alasan bahwa pemrogram CPython mungkin tertarik pada IronPython" di wiki Python .
yannis
1
@YannisRizos: Tentunya akses ke .NET framework tidak sepenuhnya tidak penting. Tentu saja, mungkin saja pengguna CPython mungkin sama sekali tidak tertarik dengan hal itu.
Robert Harvey
@RobertHarvey Ninja mengeditnya. Meskipun saya tidak berpikir "akses ke mainan baru yang mewah" sebagai alasan teknis (bukan karena mainannya tidak bagus), wiki juga menyebutkan bahwa IronPython lebih mudah diperluas.
yannis
8

Jawaban lain sangat masuk akal, tetapi sebenarnya ada bahasa sekarang yang dikompilasi ke Python. Di mana ada kemauan ...

Saya tidak tahu apa-apa tentang bahasa-bahasa ini, tetapi mereka tampaknya bekerja dengan mengubah kode sumber mereka ke Python ASTs dan membiarkan Python mengkompilasi pohon-pohon untuk bytecode, menghindari masalah yang disebutkan dalam jawaban lain.

Berdasarkan komentar, saat ini kami tahu tiga bahasa alternatif yang menggunakan Python VM (jangan ragu menambahkan yang lain di sini):

  • Mochi Menggambarkan dirinya sebagai bahasa pemrograman yang diketik secara dinamis untuk pemrograman fungsional dan pemrograman gaya aktor .
  • Hy : Menjelaskan dirinya sebagai dialek Lisp yang tertanam dalam Python .
  • dg : Menjelaskan dirinya sebagai bahasa sederhana (secara teknis) yang mengkompilasi bytecode CPython .
Carl Smith
sumber
2
Juga layak disebut HyLang
ideasman42
1
Dan dg .
hakatashi
6

Alasan lain adalah bahwa JVM adalah ekosistem yang sangat optimal, berkembang dengan baik, dan sangat lengkap. Sendiri, itu bersaing sangat baik dengan bahasa yang dikompilasi lainnya. (Saya tidak akan mengatakan bahwa itu adalah VM tujuan umum terbaik di luar sana, tetapi saya tentu saja telah membelokkan karier saya untuk hal itu.) Jadi mendapatkan akses ke JVM, singkat dengan menulis bytecode, sangat diinginkan.

Namun, Python VM itu baik, tetapi (tidak ada yang menentang Python) memiliki beberapa kekurangan yang serius. Lingkungan runtime Python sesuai dengan sifat dinamis bahasa dengan baik, tetapi benar-benar dapat mengejutkan Anda ketika Anda terbiasa dengan penggunaan memorinya, penguncian global, atau model threading.

Dalam perbandingan head-to-head, JVM biasanya dua kali lebih cepat dari VM Python. JVM (surprizingly) bahkan bersaing dengan baik dengan kode kompilasi asli, berdasarkan pada optimasi "panas" yang dilakukannya. Dan itu bahkan belum termasuk penanganan benang yang lebih canggih, dll.

Saya suka Python, saya benar-benar melakukannya, dan benci mengatakannya, tetapi kadang-kadang kinerjanya hanya menendang gigi saya - jika tidak, mengapa perpustakaan Python kritis seperti numpy atau scipy harus kembali ke kode C?

Dengan kata lain, orang yang tertarik pada Python melakukannya karena mereka menyukai bahasa tersebut . Tetapi jika Anda ingin menulis bahasa baru yang sesuai dengan preferensi Anda, jauh lebih baik Anda mengkompilasi ke JVM, karena bahasa istimewa baru Anda akan dimulai di salah satu lingkungan operasi terbaik (secara subjektif, mungkin yang terbaik) yang tersedia.

rampok
sumber