Python bayt kodunu derleyen başka programlama dilleri neden yok?


51

Java'da, Java bayt kodunu derleyen ve JVM - Clojure, Groovy ve Scala'da çalıştırabilen, kafamın en üstünde hatırlayabildiğim ana diller olan birden fazla dil var.

Ancak, Python ayrıca Python yorumlayıcısı tarafından çalıştırılmadan önce bytecode'a (.pyc dosyaları) dönüşür. Sadece cahil olabilirim ama neden python bytecode'u derleyen başka programlama dilleri yok?

Sırf hiç kimsenin canını sıkmadığı için mi, yoksa işi zorlaştıran bir tür doğal kısıtlama veya engel var mı?


30
... çünkü GIL ile uğraşmak istemiyorlar mı? ;)
Mason Wheeler

4
İçgüdüleri bana, JVM'nin ne kadar olgun olduğunu, iyi tanımlandığını ve JVM'nin neredeyse tüm platformlarda ya da edinmesi kolay aptalca olduğunu söyledi.
Rig,

4
Ayrıca çoğu JVM'nin python'un tercümanlarından çok daha hızlı olduğundan şüpheleniyorum.
Peter Smith

19
Java bayt kodunu hedefleyerek, bir JVM'nin tüm özelliklerini (güvenlik, performans, taşınabilirlik, ölçeklenebilirlik vb.) Alırsınız. Python bayt kodunu hedeflemek sizi çok fazla almaz.
David Schwartz

3
Python bayt kodu Python yorumlayıcısının sonraki sürümlerinde tanınmıyor. Python bayt koduna uygun bir programlama dilini nasıl uygulayabilir?
Gus,

Yanıtlar:


77

Basit - En son kontrol ettiğimde, Python'un byte kodu da dahil olmak üzere resmi bir özelliği yoktu. CPython spec ve bytecode taşınabilirliği IIRC gerekli değildir. Bu nedenle, belirli bir dil için tasarlanmış hareketli, belgelenmemiş bir hedef.


22
Aslında, bayt kodu biçiminin ayrıntıları genellikle küçük sürümler arasında değişir ve hatta% 99 uyumlu PyPy bile denemez (aslında, kendi bayt kodu yönergelerini ekler).

Not: Python - dil - resmi bir belirtime sahiptir ("PEP'lere bakınız"). 'Python Sanal Makinesi' yok. Bu aslında (örneğin) Java'nın aksine, ikisinin de belirtildiği yer.
Albert

56

Birden fazla JVM dili var, çünkü mevcut Java koduyla çalışacak kod yazmak isteyen yetenekli insanlar vardı, ancak Java yazmak istemiyorlardı .

Görünen o ki, mevcut Python kodu ile çalışmak isteyen programcılar yok, ancak Python bayt kodu yorumlayıcısına başka bir dil verebilecek kadar Python'dan nefret ediyorum.

Buna iki şekilde bakabilirsiniz: Java çok yaygın olduğu için JVM için alternatif diller vardır veya Python bytecode tercümanı için Python'un emmemesi için alternatif diller yoktur.


7
Umarım Java'nın ya da Java'nın Python :-)'dan daha fazla emdiğini ima etmiyorsunuzdur :-)
Giorgio

8
@Giorgio: Groovy, Scala, Clojure, vb. Yaratıcılarının iyileştirme için önemli bir yer olduğunu düşündüklerini ima ediyorum. Python'un berbat olduğunu mu ima ediyorsunuz?
kevin cline

8
Python ile çalıştıktan sonra "düşük emiş faktörü" nin yanlış olacağını söyleyebilirim. Çok yaygın olarak kabul edilen şeyleri övüyor ve bu “kendi” meselesinin fazlasıyla verimsiz. Aslında aptal. Bir sınıf yöntemi nereye ait olduğunu nasıl bilmiyor?
Rig

6
@Rig Şahsen, Python'un yaklaşımının daha zarif olduğunu düşünüyorum. OO, değişken gibi görünen özel bir anahtar kelime istemek yerine, sözdiziminden organik olarak takip eder. Sınıf yöntemlerinin neden nerede olduklarını bilmedikleri için, bunun nedeni Python sınıf tanımlarının sadece kod olması ve bu sınıfın tanımında yer alması nedeniyle ayrıştırılmamasıdır. Herhangi bir yerde yöntemleri tanımlayabilir ve bunları çalışma zamanında bir sınıfa ekleyebilirsiniz. Aslında, aynı işlevi alabilir ve bunu gerçekten de thisparadigma ile işe yaramayacak bir şey olarak çoklu sınıflarda bir yöntem olarak kullanabilirsiniz .
Antimon

6
Bence bu VM'lerin dil değil. JVM, nesil çöp toplayıcısı, JIT vb. İle performans gösteren bir VM'dir. CPython ise referans sayma kullanır ve bir tercümandır. Plataform olarak emen CPython'dur. BTW hyhy var.
PuercoPop

26

CPython'daki GIL gibi teknik eksiklikler var, ancak az sayıda dil yetersizliği var, bu yüzden çalışma zamanı Python topluluğunun satış noktası değil. Tam tersi, GIL / CPython uygulamasındaki memnuniyetsizlik nedeniyle daha fazla arka uç çalışma zamanı seçeneği var.

Java Dili, JVM'den (Java topluluğunda bile) çok daha fazla maligndir.

JVM çoğu çevrede oldukça iyi kabul edilir; bu nedenle, farklı / daha iyi dil önleri arzusu, son derece optimize edilmiş arka uç JVM'nin faydalarıyla sona ermektedir.


10

Mason Wheeler'ın haklı olduğunu söylüyorum. Bu, çoğunlukla eşzamanlılığı çok dikenli bir sorun haline getiren Global Tercüman Kilidi ile ilgili bir sorundur. Eşzamanlılık gerçekten çok iyi karşılaştırmalı olarak yapan diğer VM'ler olduğu için, bunun için dil geliştirmek mantıklıdır. Ayrıca Python son zamanlarda büyük bir dil değişimine sahipti ve kütüphanelerin çoğu zaman zaman uyumluluğu hafif bir kabus olarak yakalamadı. Mesela, vizyon çalışması için PIL kullandığım için Python 2.7 ya da daha düşük bir kod vermem gerekiyor. Bu, özellikle ikinci durumda akılda dil birlikte çalışarak tasarlanan JVM veya CLI kurulumlarında durum böyle değil.

Biraz daha araştırma yaptım ve görünüşe göre aslında sadece bir tane değil iki tane GIL var. Diğer kontroller İthalat .


1
"GIL free" Python wiki'de "CPython programcılarının IronPython ile ilgilenebileceği sebepler" bölümünde belirtilen teknik nedenlerden biridir .
yannis,

1
@YannisRizos: Kesinlikle .NET çerçevesine erişim tamamen önemsiz değildir. Tabii ki, CPython kullanıcılarının bu konuda tamamen ilgisiz olma ihtimali var.
Robert Harvey

@RobertHarvey Ninja bunu düzenledi. “Süslü yeni oyuncaklara erişmeyi” teknik bir sebep olarak düşünmeme rağmen (oyuncakların harika olmadığını düşünerek), wiki ayrıca IronPython'un genişletilmesinin daha kolay olduğunu belirtiyor.
yannis,

8

Diğer cevaplar çok mantıklı geliyor, ama aslında Python'u derleyen diller var. Bir iradenin olduğu yerde...

Bu diller hakkında hiçbir şey bilmiyorum, ancak kaynak kodlarını Python AST'lere dönüştürerek ve Python'un ağaçları bytecode ile derlemesine izin vererek, diğer cevaplarda belirtilen sorunlardan kaçınmaya çalışıyor gibi görünüyorlar.

Yorumlara dayanarak, şu anda Python VM'yi kullanan üç alternatif dil biliyoruz (buraya başkalarını eklemek için çekinmeyin):

  • Mochi Fonksiyonel programlama ve aktör tarzı programlama için kendini dinamik olarak yazılmış bir programlama dili olarak tanımlar .
  • Hy : Kendisini Python'a gömülü bir Lisp lehçesi olarak tanımlar .
  • dg : Kendisini CPython bayt kodunu derleyen (teknik olarak) basit bir dil olarak tanımlar .

2
Ayrıca HyLang'dan bahsetmeye değer
ideasman42 11

1
Ve dg .
hakatashi,

6

Diğer bir sebep ise JVM'nin yüksek düzeyde optimize edilmiş, iyi gelişmiş ve son derece eksiksiz bir ekosistem olmasıdır. Kendi başına, diğer derlenmiş dillerden herhangi biriyle son derece iyi rekabet eder. (Bunun en iyi genel amaçlı VM olduğunu söyleyemem , ancak kariyerimi bu konuda kesinlikle banka ettim.) Bu nedenle JVM'ye, bytecode yazma yetkisi dışında erişebilmek kendi başına arzu edilir.

Ancak, Python VM iyidir, ancak (Python'a karşı hiçbir şey) bazı ciddi eksiklikleri vardır. Python çalışma ortamı dilin dinamik yapısına iyi uyum sağlar, ancak bellek kullanımı, genel kilitleme veya iş parçacığı modeli hakkında bilgi edindiğinizde sizi gerçekten şaşırtabilir.

Başa baş karşılaştırmalarda, JVM tipik olarak Python VM'den iki kat daha hızlıdır. JVM (şaşırtıcı bir şekilde) gerçekleştirdiği "sıcak" optimizasyonlara dayanarak doğal olarak derlenmiş kodlarla bile rekabet eder. Ve bu daha sofistike iplik işleme vb. Sayılmaz.

Python'u seviyorum, gerçekten söylüyorum ve söylemekten nefret ediyorum, ama bazen performans beni dişlerime atıyor - aksi halde niye numpy veya scipy gibi kritik Python kütüphanelerinin tekrar C koduna düşmesi gerekiyor?

Başka bir deyişle, Python'u çeken insanlar , dili sevdikleri için yaparlar . Ancak, tercihlerinize göre yepyeni bir dil yazmak istiyorsanız, JVM'ye derlemekten çok daha iyi bir durumdasınız, çünkü yeni kendine özgü diliniz mevcut olan en iyi (belki de en iyi) işletim ortamlarından birinde başlayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.