Python Yorumlanıyor mu veya Derlendi mi?


76

Bu sadece yorumlanmış ve derlenmiş diller hakkında okurken bir merak ediyorum.

Kaynak kod yürütme noktasında bir tercüman tarafından işlendiğinden, Ruby'nin bir tercüman dili olduğuna şüphe yok.
Aksine, C derlenmiş bir dildir, çünkü ilk önce kaynak kodunu makineye göre derlemek ve daha sonra çalıştırmak gerekir. Bu sonuç çok daha hızlı işlemdir.

Şimdi Python'a geliyor :

  • İçe aktarıldığında bir python kodu ( somefile.py ) aynı dizinde bir dosya ( somefile.pyc ) oluşturur . Diyelim ki ithalat bir python kabuğu veya django modülünde yapıldı. İçe aktarmadan sonra, kodu biraz değiştiririm ve hala eski kodu çalıştırdığını bulmak için içe aktarılan işlevleri tekrar yürütürüm. Bu, * .pyc dosyalarının, bir C dosyasının derlenmesinden sonra oluşturulan çalıştırılabilir dosyaya benzer şekilde derlenmiş python dosyaları olduğunu gösterir, ancak * .pyc dosyasını doğrudan yürütemiyorum.
  • Python dosyası (somefile.py) doğrudan çalıştırıldığında (./somefile.py veya python somefile.py) .pyc dosyası oluşturulmaz ve yorumlanan davranışı belirten kod çalıştırılır.

Bunlar, bir python kodunun, doğrudan çalıştırıldığında yorumlanırken bir .pyc oluşturmak için yeni bir işlemde alındığında derlendiğini göstermektedir.

Peki hangi dil dili olarak düşünmeliyim? Yorumlanan veya Derlenmiş? Ve etkinliği, yorumlanmış ve derlenmiş dillerle nasıl karşılaştırılır?

Wiki'nin Sözlü Dilleri sayfasına göre, Sanal Makine Koduna derlenmiş bir dil olarak listelenmiştir, bunun anlamı ne?


1
Ruby'nin tercüme edilmiş bir dil olup olmadığı konusunda ne zaman şüphe vardır? Derlendiğinde. :) macruby.org
mipadi

8
Hiçbir modern dilin tam anlamıyla yorumlanmadığına dikkat etmek önemlidir. Hemen hemen hepsi bytecode için derler.
Winston Ewert

@ Winston Ewert: bravo! Applesoft Basic (1980'lerde) byte kodu derlendi. Bu durumda "modern", yaşam hafızasında her bir tercüman dili, bazı temel Dartmouth Temel uygulamaları olmakla birlikte, tek istisna olan anlamına gelir.
S.Lott

6
>> Aksine, C derlenmiş bir dildir << root.cern.ch/drupal/content/cint
igouy

3
@ S.Lott: Applesoft ve '80'lerdeki BASIC tercümanlarının "bytecode derlemesi" yaptığı tokenizasyon sürecine çağrı yapmak biraz rahatsız edicidir. Evet, kullanıcı tarafından girilen program kodu, ayrılmış bir kelime başına bir bayt olan sıkıştırılmış bir biçimde bellekte saklandı, ancak siz yazana kadar hiçbir şey yapılmadı RUN. Lexing adımını uygulayan ve ardından programın her çalıştırılışında yeniden düzeltilmesi gereken bir belirteç akışı çıkaran bir derleyiciniz varmış gibiydi. javacLexing, ayrıştırma ve optimizasyon içeren , modern bytecode derlemesi gibi değil .
dodgethesteamroller

Yanıtlar:


80

Dillerin yorumlanmadığını veya derlenmediğini, daha ziyade dil uygulamalarının kodu yorumladığını veya derlediğini not etmek önemlidir . Ruby'nin "tercüme edilmiş bir dil" olduğunu not ettiniz, ancak Ruby a MacRuby'yi derleyebilirsiniz , bu yüzden her zaman tercüme edilmiş bir dil değildir.

Hemen hemen her Python uygulaması tercümandan (derleyici yerine) oluşur. .pycGördüğünüz dosyaları (Java'nın benzer Python sanal makine için bayt kodu olan .classdosyalar). Yerel bir makine mimarisi için bir C derleyicisi tarafından üretilen makine kodu ile aynı değildirler. Bununla birlikte, bazı Python uygulamaları, Python byte kodunu yerel makine kodunda derleyecek tam zamanında bir derleyiciden oluşur .

(Python için herhangi bir yerel makine derleyicisi bilmediğim için "hemen hemen her" derim, ancak hiçbirinin hiçbir yerde olmadığını iddia etmek istemiyorum.)


Tanımınıza bağlı olarak, Python için yerel makine derleyicileri bulunmaktadır. Bazıları yalnızca bir python alt kümesini derler. Diğerleri ise tüm pythonları uygularlar ancak python API'sini C'de gerçekleştiremediği işlemleri gerçekleştirmek için kullanırlar.
Winston Ewert

Aslında Python'un “yarı derlenmiş” dediğim şey olduğunu ya da tam olarak derlenebileceğini düşünüyorum. Yarı-derlenmiş olarak, genellikle Python Sanal Makinesi tarafından kullanılan 'ara dil' .pyc dosyasına derlendiğinden, genellikle kodu daha hızlı yapan bu 'yarı-derlenmiş' biçiminden çalıştırıldığı anlamına gelir. yorumlanan kodun düz çalışma zamanı yorumu. İlginçtir, yarı derlenmiş kod bazen yerel derlenmiş kodlardan daha hızlı olabilir (örneğin, C # genellikle C ++ 'dan daha hızlıdır).
Chris Halcrow

5
Cython, Python kodunu C olarak derler, böylece paylaşılan bir nesne olarak derlenebilir.
greyfade

Bayt kodunu ve makine kodunu bu şekilde ayırt etmek oldukça keyfidir. Java derlenir: javac derleyicisi, sanal bir makinede (örn. Etkin nokta) veya doğrudan donanımla (örneğin Jazelle uzantılı ARM işlemcilerde) yürütülebilen düşük seviyeli talimatlar içeren sınıf dosyaları üretir. Bildiğim kadarıyla, benzer bir işlemci mimarisinin doğrudan python vm komutlarını uygulamak için tasarlanmamasının teknik bir nedeni yoktur.
Jules

@Jules Tesadüfen, Jython kodu aslında py kaynağını değiştirene kadar yeniden kullanıldığına inandığım .class dosyalarında derlenmiştir.
JimmyJames,

35

Python yorumlanan bayt kodu altına düşecek. .pykaynak kodu ilk olarak bayt koduna göre derlenir .pyc. Bu bayt kodu yorumlanabilir (resmi CPython) veya JIT derlenmiş (PyPy). Python kaynak kodu ( .py), IronPython (.Net) veya Jython (JVM) gibi farklı byte kodlarıyla da derlenebilir. Python dilinin birçok uygulaması vardır. Resmi olan, yorumlanan bayt kodudur. JIT derlenmiş uygulamaları da bayt kodu vardır.

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


bilgi için teşekkür ederim.
crodjer

1
Verdiğim bağlantı açıkça bunların dil uygulamalarındaki hatalı ölçütler olduğunu gösteriyor . Yürütme performansı hakkında çok endişeleniyorsanız, Python tercih ettiğiniz dil olmamalıdır. Hala karşılaştırmak istiyorsanız, benzer dilleri karşılaştırın. Bayt kodu olarak yorumlanan resmi CPython, JIT tarafından derlenen Ruby ile karşılaştırılabilir veya daha hızlıdır.
aufather

1
@ jase21 - "2006 için planlarım, Psyco'da uygulanan teknikleri PyPy'ye taşımak. PyPy, daha esnek bir JIT uzmanlığı oluşturmamızı, denemeleri daha kolay ve genel giderlerinin gelişmesiyle senkronize olmak zorunda kalmamızı sağlayacak. Python dili. " psyco.sourceforge.net/introduction.html
igouy

1
@ jase21 - "python kodlarını C sayaç parçalarından daha hızlı çalıştırır" - Bunun için sadece sözünüzü mü almamız gerekiyor?
igouy

3
Cevaptaki bağlantı koptu.
Basilevs,

11

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

Bir derleyici (en geniş anlamıyla) bir tercümandır . A programını B programına çevirir ve daha sonra bir makine M kullanarak çalıştırılmasını sağlar.

Bir tercüman (en geniş anlamıyla) bir uygulayıcıdır . Program A'yı çalıştıran bir makine M'dir. Genellikle bu tanımların dışında tutsak da fiziksel makineleri (veya fiziksel olanlar gibi çalışan fiziksel olmayan makineleri). Fakat teorik açıdan bakıldığında, bu ayrım biraz keyfi.


Örneğin, al re.compile. Bir regex'i bir ara forma "derler" ve bu ara forma yorumlanır / değerlendirilir / uygulanır.


Sonunda, hangi seviye soyutlamadan bahsettiğinize ve neye değer verdiğinize bağlıdır. İnsanlar "derlenmiş" veya "yorumlanmış" derler ki sürecin en ilginç kısımlarının geniş tanımlarıdır, ama gerçekten her program bir şekilde veya başka bir şekilde derlenir (tercüme edilir) ve yorumlanır (yürütülür).

CPython (Python dilinin en popüler uygulaması) kod çalıştırmak için çoğunlukla ilginçtir. Dolayısıyla CPython tipik olarak yorumlandığı gibi tanımlanır. Bu gevşek bir etiket olmasına rağmen.


7

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

Bazı sanal makineler ilk kez sanal makine kodunu 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ı işlem yapılmasını sağlayacaktır.

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


5

Python çalışma zamanı, sanal bir makinede özel nesne kodunu (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 depolanır, böylece programın bir sonraki çalıştırılmasında yeniden kullanılabilir.

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.