it-swarm.dev

Python Yorumlandı mı yoksa Derlendi mi?

Bu sadece yorumlanmış ve derlenmiş diller hakkında okurken merak ettiğim bir şey.

Ruby şüphesiz yorumlanmış bir dildir çünkü kaynak kodu yürütme noktasında bir tercüman tarafından işlenir.
Tam tersine [~ # ~] c [~ # ~] derlenmiş bir dildir, çünkü kaynak kodu derlemek zorundadır önce makineye göre ve sonra çalıştırın. Bu sonuçlar çok daha hızlı yürütülür.

Şimdi Python'a geliyor:

  • A python kod ( somefile.py ) içe aktarıldığında bir dosya oluşturur ( somefile.pyc ). İçe aktarmanın bir python Shell veya Django modülünde) yapıldığını varsayalım. İçe aktarma işleminden sonra kodu biraz değiştiririm ve içe aktarılan işlevleri yine eski kodu çalıştırdığını bulmak için yürütürüm. * .Pyc dosyalarının derlendiğini gösterir python dosyaları yürütülebilir dosyaya benzer) C dosyasının derlenmesinden sonra oluşturulmuş olsa da, doğrudan * .pyc dosyasını yürütemiyorum.
  • python dosyası (somefile.py) doğrudan yürütüldüğünde (./somefile.py veya python somefile.py) .pyc dosyası oluşturulmaz ve kod, yorumlanmış davranışı belirttiği gibi yürütülür.

Bunlar, bir python kodunun, yeni bir işlemde her içe aktarıldığında, doğrudan yürütüldüğünde yorumlanırken bir .pyc oluşturmak için derlendiğini gösterir.

Öyleyse hangi dili kullanmalıyım? Yorumlandı mı Derlendi mi? Verimliliği, yorumlanmış ve derlenmiş dillerle nasıl karşılaştırılır?

Wiki'nin Yorumlanan Diller sayfasına göre, Sanal Makine Koduna derlenmiş bir dil olarak listelenir, bunun anlamı nedir?

82
crodjer

dillerin yorumlanmadığını veya derlenmediğini, aksine dil uygulamalarının kodu yorumladığını veya derlediğini belirtmek gerekir. Ruby ifadesinin "yorumlanmış bir dil" olduğunu belirttiniz, ancak Ruby à la MacRuby , yani her zaman yorumlanmış bir dil.

Hemen hemen her Python uygulaması bir derleyiciden ziyade bir yorumlayıcıdan oluşur. Gördüğünüz .pyc Dosyaları Python sanal makinesi için bayt kodudur (Java'nın .class Dosyalarına benzer). Bunlar, yerel bir makine mimarisi için bir C derleyicisi tarafından üretilen makine koduyla aynı değildir. Bununla birlikte, bazı Python uygulamaları, Python bayt kodunu yerel makine koduna derleyecek bir tam zamanında derleyiciden oluşur.

("Hemen hemen her" diyorum çünkü Python için herhangi bir yerel makine derleyicisi bilmiyorum, ama hiçbir yerde hiçbirinin mevcut olmadığını iddia etmek istemiyorum.)

83
mipadi

Python yorumlanan bayt koduna girecektir. .py kaynak kodu ilk olarak bayt koduna .pyc. Bu bayt kodu yorumlanabilir (resmi CPython) veya JIT derlenebilir (PyPy). Python kaynak kodu (.py) IronPython (.Net) veya Jython (JVM) gibi farklı bayt kodlarına da derlenebilir. Python dilinin birden çok uygulaması vardır. Resmi kod, yorumlanmış bir bayt kodudur. JIT derlenmiş uygulamaları da vardır.

Çeşitli dil uygulamalarının hız karşılaştırmaları için burada deneyebilirsiniz.

36
aufather

Derlenmiş ve yorumlanmış bazı bağlamlarda yardımcı olabilir, ancak teknik anlamda uygulandığında yanlış bir ikiliktir.

Bir derleyici (en geniş anlamda) bir çevirmenidir . A programını B programına çevirir ve ileride bir makine M kullanarak yürütmek için.

Bir tercüman (en geniş anlamıyla) bir yürütücüsüdür . Bu, A programını yürüten bir makine M'dir. Ancak tipik olarak bu tanımlardan fiziksel makineleri (veya fiziksel olanlar gibi hareket eden fiziksel olmayan makineleri) hariç tutuyoruz. Ancak teorik açıdan, bu ayrım biraz keyfi.


Örneğin, re.compile . Bir normal ifadeyi bir ara forma "derler" ve bu ara form yorumlanır/değerlendirilir/yürütülür.


Sonunda, hangi seviyede soyutladığınızdan ve neye önem verdiğinize bağlıdır. İnsanlar sürecin en ilginç kısımlarının geniş tanımları olarak "derlenmiş" veya "yorumlanmış" derler, fakat gerçekten her program bir şekilde derlenir (tercüme edilir) ve yorumlanır (yürütülür).

CPython (Python dilinin en popüler uygulaması) çoğunlukla kod yürütmek için ilginçtir, bu nedenle CPython genellikle yorumlanmış olarak tanımlanır.

11
Paul Draper

Sanal Makine Kodu, orijinal kaynak kodunun (bayt kodu) daha kompakt bir sürümüdür. Makine kodu olmadığı için hala sanal bir makine tarafından yorumlanması gerekiyor. Ayrıştırmak, bir insan tarafından yazılan orijinal koddan daha kolay ve hızlıdır.

Bazı sanal makineler, sanal makine kodunu ilk kez yorumlarken makine kodu üretir (tam zamanında derleme - JIT). Aşağıdaki çağrılar bu makine kodunu doğrudan kullanacak ve bu da daha hızlı yürütmeye neden olacaktır.

Bildiğim kadarıyla Ruby> = 1.9 da Python gibi bir sanal makine kullanıyor.

7

Python çalışma zamanı, sanal bir makinede özel nesne kodu (bayt kodu) çalıştırır.

Derleme işlemi kaynak kodunu nesne koduna dönüştürür.

İşleri hızlandırmak için nesne kodu (veya isterseniz bayt kodu) diskte saklanır, böylece program bir sonraki çalıştırıldığında yeniden kullanılabilir.

5
ykombinator