Neden yerel makine kodunda bir python derleyicisi yok?


25

Anladığım kadarıyla, derlenmiş diller ve python arasındaki hız farkının nedeni, ilk önce yerel makinenin kodunu tümüyle derler, python ise python byte kodunu derler ve PVM tarafından yorumlanır. Bu şekilde python kodlarının çoklu işletim sisteminde (en azından çoğu durumda) kullanılabildiğini görüyorum, ancak neden anlamıyorum, neden geleneksel derleyicilerle aynı şekilde derleyen python için ek (ve isteğe bağlı) bir derleyici yok? . Bu, programcının seçmesi için ayrılacaktır, ki bu onlar için daha önemlidir; yerel makinede çoklu platform çalıştırılabilirliği veya performansı. Genel olarak; neden hem derlenmiş hem de yorumlanmış gibi davranabilecek diller yok?


4
Orada olduğunu . Derlenmiş veya GHCi aracılığıyla yorumlandığı gibi Haskell da davranabilir
toasted_flakes

C ++ tercümanlara da sahiptir . Muhtemelen tonlarca başka dilin de uygulaması vardır.
Claudio

2
Aslında, IronPythong seçerek ( ironpython.net ) ve "NGen" kullanarak üretilen IL kod derleme ( msdn.microsoft.com/de-de/library/6t9t5wcf%28v=vs.110%29.aspx ) vardır olan bir yol Python'u yerel makine koduna derlemek için. Bu alet zincirini test ettiğimden değil.
Doktor Brown

10
Bir Python-yerel derleyiciler yazabilir. Python'a benzeyen ancak çok daha kısıtlı bir dil uygulanmadıkları sürece, performansı gerçekten önemli bir marjla iyileştirmedikleri için ilginç değillerdir. Ben daha önce başka bir yerde açıklandığı neden.

Yanıtlar:


29

Hayır. Python ve C ++ gibi diller arasında hız farklılıklarının olmasının nedeni, statik olarak yazılmış dillerin derleyiciye programın yapısı ve hem hesaplamaları hem de hafıza erişimini optimize etmesini sağlayan verileri hakkında bilgi vermesidir. C ++ bu değişkenin int türünde olduğunu bildiğinden, program çalıştırılmadan önce bile bu değişkeni değiştirmenin en uygun yolunu belirleyebilir. Öte yandan Python'da çalışma zamanı, yorumlayıcı tarafından satıra ulaşılana kadar değişkende hangi değerin bulunduğunu bilmiyor. Bu, C ++ 'da, derleyicinin, yapının boyutunu ve derleme sırasındaki alanlarının her yerini kolayca hafızaya alabildiği yapılar için son derece önemlidir. Bu, verilerin nasıl kullanılabileceğini tahmin etmede muazzam bir güç sağlar ve bu öngörülere göre optimize edilmesini sağlar.

Python gibi dilleri etkin bir şekilde derlemek için yapmanız gerekenler:

  1. Programın yürütülmesi sırasında veri yapısının statik olduğundan emin olun. Bu problemli çünkü Python'un değerlendirmesi ve metasınıfları var. Her ikisi de programın yapısını program girişine göre değiştirmeyi mümkün kılar. Bu Python'a bu kadar etkileyici güç veren şeylerden biri.
  2. Tüm değişkenlerin tiplerini, yapılarını ve sınıflarını kaynak kodun kendisinden öğrenin. Bir dereceye kadar mümkün olsa da, statik tip sistem ve algoritma o kadar karmaşık olacaktı ki, kullanılabilir bir şekilde uygulanması neredeyse imkansız olacaktı. Dilin bir alt kümesinde bunu yapabilirsin, ancak kesinlikle tüm dil özellikleri için değil.

6
Sorunun zorlaştığını , ancak imkansız olmadığını belirtmekte fayda var . sbcl aynı zamanda dinamik olan evalve derleyici yazarları üzecek bir sürü başka şeyi de içeren Common Lisp'i derler . Bu, gcc seviyesine değil, ancak kesinlikle CPython'un tercümanından daha hızlı.
Daniel Gratzer

3
@ jozefg Etkili derleme dedim. Sadece derleme değil. Python da yerel kod üreten Cython derleyicisine sahiptir. Mesele şu ki, derleyiciler statik olarak yazılmış diller için derleyicilerin yapabileceği optimizasyonların bile bir kısmını yapmıyor. Performansı karşılaştırdığınızda, derlenmiş C ++ ile karşılaştırınız ve Python'u yorumlamamıştır.
Euphoric

2
Aslında, sbcl'nin neler yapabildiğine şaşıracaksınız. Benchmarklar oyunu Java kadar hızlı, neredeyse GHC kadar hızlı ve 1x - 10x C arasında çalıştığını gösteriyor. Evet, dinamik tipler derlemeyi bir dereceye kadar engeller, fakat düşündüğünüz kadar değil.
Daniel Gratzer

3
Yorumlanmış piton hızını derlenmiş piton ile karşılaştırmak kendi başına ilginçtir. "C ++ kullan" demeyi kes. Belki de Python ile yazılmış bir kodunuz zaten vardır. Belki kod python ile yazmak daha kolaydır. Kimin umrunda. Önemsediğim şey 1.5x hızda (her ne ise). Bu büyük bir fark yaratabilir.
Thomas Eding

3
Başka bir deyişle, derlemek istiyorsanız, C ++ veya Pascal gibi ayarlanmış başka bir dil seçin.
Please_Dont_Bully_Me_SO_Lords

0

İki kavram, Python'un yerel makine koduna göre derlenmiş "neden" derlenmiş C veya diğer yaygın derlenmiş diller kadar hızlı çalışamadığını anlamamıza yardımcı olabilir. Bunlara erken bağlama ve geç bağlama adı verilir.

Python uzmanı olmadığımı söyleyerek başlamalıyım ve bu siteye tesadüfen geldim. Ama bu siteyi seviyorum.

Buradaki başka bir cevapta da belirtildiği gibi, C ++ derleyicisi program hakkında çok şey bilir ve belirli veri yapıları için hangi işlemlerin kullanılacağına ilişkin kararlar alabilir. Bir örnek olarak, iki tamsayı değişkeninin birlikte eklenmesi gerekiyorsa, derleyici, bunların yerel tamsayılar olduğunu bilir, örneğin 32 bit genişliğindedir ve bunları bir "ADD" komutu ile ekleyebilir. Böylece ADD komutunu kodun içine derler. Kilitlendi ve program çalışırken değiştirilemez. Bu erken bağlayıcıdır.

Öte yandan Python gibi bir dilde, programın farklı türden verileri karmaşık şekillerde bir araya getirmesini bekleyebiliriz. Şimdi derleyici 2 değişkenimizin tamsayı, kayan nokta, dizge veya liste olup olmadığını bilmiyor. Bu nedenle, çalışma zamanında bu bilgiyi belirleyen ve program çalışırken doğru işlemi seçen kodu derlemesi gerekir. Bu geç bağlayıcıdır ve program çalışırken bu ekstra işi yapmak için bir performans artışı olacağını anlayabiliriz. Bu seçenekleri Python gibi bir dilde açık tutmak için ödediğiniz ücret ancak maksimum çalışma süresi esnekliği sağlar.


-4

Bunun Python özelliklerinin kendisiyle ilgisi olduğunu düşünüyorum, C # ile makine kodunu derleyememenizin aynı nedeni. Dil özellikleri, dilin niteliği nedeniyle mümkün olsa bile, programlarınızı gerçekten sıkıcı hale getirir. Neden sadece C dilini öğrenmiyorsun? C ++ 'dan çok daha kolay ve Python'dan biraz daha gelişmiş ancak yine de ulaşılabilir.


5
C # doğrudan makine koduna gidebilir: Ortak Orta Dil: Zamanın Önünde Derleme - "CLI uyumlu yürütme ortamları, kaldırılarak daha hızlı çalışmasını sağlamak için bir montajın Zamanında Derleme (AOT) yapma seçeneği de sunar Çalışma zamanında JIT işlemi. .NET Framework'te, AOT gerçekleştiren Yerel Görüntü Üreticisi (NGEN) adında özel bir araç var. Mono'da AOT yapma seçeneği de var. "
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.