Python'un neden bir derleyiciye ihtiyacı yok?


29

Sadece merak ediyorum (şimdi bir derleyiciye ihtiyaç duyan C ++ ile başladım) neden Python'un derleyiciye ihtiyacı yok?

Ben sadece kodu girip, bir çalıştırıcı olarak kaydetiyorum ve çalıştırıyorum. C ++ 'da, bu eğlenceli şeyleri inşa etmem gerekiyor.


4
Python sadece birçok uygulamayı içeren bir dildir. Demir Python, C # ve C ++ ile aynı şekilde derlenir ve bunun gibi başka uygulamalar da olabilir.
Meslek

1
C # ve C ++ aynı şekilde derlenmedi - her ikisinin de sonunda makine talimatı olarak sona erdiğini iddia etseniz de, bunu yaparsanız BASIC'in de aynı şekilde derlendiğini söyleyebilirsiniz.
gbjbaanb

7
gbjbaanb ama sonra yine İngilizce derlenmedi ve bir cümlenin semantik analizi iki eşit geçerli sonuç verebilir ve yukarıda "demir python tam C # ve C ++ derlenir" olarak derlendi
Rune FS

Python kodunuzu yazmak için hangi platformu / yazılımı kullanıyorsunuz? Bir .py dosyası yazarsanız, yürütülebilir bir dosya değildir. Hala bir kaynak kod dosyasıdır. Komut satırından python.py dosyasını yorumlamak için komut kullanıyorsunuz ya da IDLE ya da Eclipse kullanıyorsanız IDE sizin için yapıyor.
Rick Henderson

Yanıtlar:


68

Python'un bir derleyicisi var! Sadece fark etmiyorsunuz çünkü otomatik olarak çalışıyor. Yine de orada olduğunu söyleyebilirsiniz: bakın .pyc(veya .pyooptimize edici açıksa) sizin için modüller için oluşturulan dosyalara bakın import.

Ayrıca, yerel makinenin kodunu derlemez. Bunun yerine, sanal bir makine tarafından kullanılan bir bayt kodunu derler. Sanal makinenin kendisi derlenmiş bir programdır. Bu Java'nın nasıl çalıştığına çok benziyor; Öyle ki, aslında, Java Sanal Makinesi'nin bayt kodunu derleyen bir Python varyantı ( Jython ) var! Microsoft'un CLR'sini (.NET tarafından kullanılan) derleyen IronPython da var. (Normal Python bayt kodu derleyicisine bazen bu alternatiflerden ayırmak için CPython denir.)

Dilin eksik olduğu için C ++ 'ın derleme işlemini göstermesi gerekiyor; Bağlayıcınızın programınızı oluşturmak için bilmesi gereken her şeyi belirtmez, ayrıca derleme seçeneklerini de taşınabilir şekilde belirleyemez (bazı derleyiciler kullanmanıza izin verir #pragma, ancak bu standart değildir). Bu yüzden işin geri kalanını makefiles ve muhtemelen auto cehennem (autoconf / automake / libtool) ile yapmanız gerekiyor. Bu gerçekten sadece C'nin nasıl yapıldığına dair bir giriştir. Ve C bunu böyle yaptı çünkü derleyiciyi basitleştirdi, bu da çok popüler olmasının temel nedenlerinden biriydi (herkes 80'lerde basit bir C derleyicisi atabilirdi).


Derleyicinin veya bağlayıcının çalışmasını etkileyebilecek, ancak C veya C ++ 'ın sözdiziminde belirtilmeyen bazı şeyler:

  • bağımlılık çözünürlüğü
  • dış kütüphane gereksinimleri (bağımlılık sırası dahil)
  • iyileştirici seviyesi
  • uyarı ayarları
  • dil özellikleri
  • linker eşlemeleri (hangi programın final programında nereye gittiği)
  • hedef mimarisi

Bunlardan bazıları tespit edilebilir, ancak belirtilemezler; örneğin, hangi C ++ 'nın kullanımda olduğunu tespit edebilirim __cplusplus, ancak kodun kendi kodunda kullanılan C ++ 98'in kendisi olduğunu belirtemem; Makefile'daki derleyiciye bir bayrak olarak göndermem veya bir diyalogda bir ayar yapmam gerekiyor.

Derleyicide otomatik olarak bağımlılık kayıtları üreten bir "bağımlılık çözünürlük" sistemi olduğunu düşünebilirsiniz, ancak bu kayıtlar yalnızca belirli bir kaynak dosyanın hangi başlık dosyalarını kullandığını söyler. Yürütülebilir bir programa bağlanmak için hangi ek kaynak kod modüllerinin gerekli olduğunu gösteremezler, çünkü C veya C ++ 'da verilen bir başlık dosyasının başka bir kaynak kod modülünün arabirim tanımı olduğunu göstermek için standart bir yol yoktur. Birden fazla yerde görünmesini istediğiniz satırları seçin, böylece kendinizi tekrar etmeyin. Dosya adlandırma kurallarında gelenekler vardır, ancak bunlar derleyici ve bağlayıcı tarafından bilinmez veya uygulanmaz.

Bunlardan birkaçı kullanılarak ayarlanabilir #pragma, ancak bu standart değildir ve standarttan bahsediyordum. Bütün bunlar olabilir standart belirtilebilir, ancak geriye dönük uyumluluk yararına olmamıştır. Hakim bilgelik, dosya dosyalarının ve IDE'lerin kırılmadığı, bu yüzden onları düzeltmeyin.

Python, tüm bu dilde işler. Örneğin, importaçık bir modül bağımlılığı belirtir, bağımlılık ağacını belirtir ve modüller başlık ve kaynak dosyalara bölünmez (yani arayüz ve uygulama).


3
Python'un C uygulaması CPython , Cython ise farklı bir şey.
Greg Hewgill

4
C'nin makine koduna göre derlenmesinin diğer nedenleri, yüceltilmiş bir düzenleyiciden biraz daha fazla olmasıydı, çünkü bytecode tercümanları sahip oldukları donanımda teknik olarak olanaksızdı ve en önemli görevlerden biri bir işletim sistemi çekirdeği yazmaktı.
tdammers

2
@BillyONeal c / c ++ 'da bir programcı olarak belirli bir şekilde bir şeyler yapmak zorunda olduğunuz (her şeyi aynı blob'a doldurur veya her şeyi aynı blob'a atarsınız), sadece işinizi ve derleyicinizi VM ile birlikte yapın. Gerisini halleder
Rune FS

3
"C ++, dilin kendisi eksik olduğu için derleme sürecini göstermeli" Er, ne ??
Monica ile Hafiflik Yarışları,

3
Bundan hemen sonra kısmı okudun , değil mi? "Bağlayıcınızın programınızı oluşturmak için bilmesi gereken her şeyi belirtmez, ayrıca derleme seçeneklerini de taşınabilir şekilde belirtemez." Sadece inşa edemez herhangi bir derleyici besleyerek C ++ dosya; derleme bayrakları gibi meta veriler sağlamanız, yollar vb. eklemeniz gerekir. Bu meta veriler standart tarafından belirtilmez ve taşınabilir değildir; bu nedenle make, cmake, Visual Studio veya benzeri şeylere sürüklemek zorundayız. İşi bitir. Bu yüzden standardın derleme ünitesinde olduğu gibi bazı şeyleri program çapında belirtmesi gerekir.
Mike DeSimone

7

Python yorumlanmış bir dildir. Bu, bilgisayarınızda Python kodunu okuyan bir yazılım olduğu ve "talimatları" makineye gönderdiği anlamına gelir. Yorumlanmış dillerde Wikipedia makalesi ilgi olabilir.

C ++ gibi bir dil (derlenmiş bir dil) derlendiğinde, çalıştırıldığında doğrudan donanım tarafından okunması için makine koduna dönüştürüldüğü anlamına gelir. Derlenmiş dillerde Wikipedia makalesi ilginç bir kontrast sağlayabilir.


21
Yorumlanmış veya derlenmiş bir dil diye bir şey yoktur. Dil, soyut bir matematiksel kurallar kümesidir. Bir dil derlenmedi veya yorumlanmadı. Bir dil sadece olduğunu . Derleme ve yorumlama, derleyici veya tercümanın özellikleridir (duh!), Dil değil. Her dil bir derleyici ile uygulanabilir ve her dil bir tercüman ile uygulanabilir. Çoğu dil, uygulamaları hem derledi hem de yorumladı. C ++ için tercümanlar ve Python için derleyiciler var. (Aslında, şu anda mevcut olan tüm Python uygulamalarının derleyicileri vardır.)
Jörg W Mittag

4
Modern yüksek performanslı dil uygulamalarının çoğu, maksimum performans için bir tercümanı ve bir derleyiciyi (hatta birkaç derleyiciyi) birleştirir. Aslında, herhangi bir programın tercüman olmadan çalıştırılması imkansızdır . Ne de olsa, bir derleyici sadece bir programı bir dilden diğer bir dile çeviren bir programdır. Ancak bir noktada , bir tercüman tarafından yapılan (silikonda uygulanabilecek veya uygulanmayacak olan) programı çalıştırmak zorundasınız .
Jörg W Mittag

10
@ JörgWMittag: Teknik olarak haklısın. Ancak, çoğu dil, yorumlanmış bir bağlam veya tam derleme için tasarlanmıştır. GW BASIC veya Common Lisp için bir tercüman yazmak, örneğin C ++ veya C #; Python etkileşimli bir ortam olmadan satış noktalarının çoğunu kaybeder; PHP için bir derleyici yazmak oldukça zor ve derlenmiş bir çalıştırıcının eval () ve benzer yapılar nedeniyle tüm PHP tercümanını içermesi gerektiği için muhtemelen çok verimsiz - bir böyle derleyicinin hile yapacağını iddia edebilir.
tdammers

2
Tdammers, evet. "Derlenmiş dili", "genellikle derlenmiş dil" demek için makul ölçüde kullanabiliriz. Ancak bu, PHP, Java, Python, Lua ve C # öğelerinin bytecode için derleyiciler olarak uygulandığı noktasını gözden kaçırıyor. Bu dillerin hepsi ayrıca JIT’ler için de uygulandı. Gerçekten de, bu dillerden bazılarını derlenmiş ve bazıları da aynı uygulama stratejisine sahip oldukları için yorumlayamazsınız.
Winston Ewert

2
@BillyONeal, en azından python için doğru değil. Python bayt kodunu dağıtabilir ve kaynak olmadan çalıştırabilirsiniz. Ancak bir derleyici olmadan python dağıtamazsınız.
Winston Ewert

5

Derlenmiş tüm dillerin yüzünde bir düzenleme-derleme-link-run döngüsü yoktur.

Karşılaştığınız şey bir C ++ özelliği (veya en azından C ++ uygulamaları) sınırlaması.

Herhangi bir şey yapmak için, kodunuzu dosyalara kaydetmeli ve bağlama adı verilen bir işlemle yekpare bir görüntü oluşturmalısınız.

Özellikle, derleme ve yorumlama arasındaki ayırımla karıştırılan bu yekpare bağlantı sürecidir.

Bazı diller, bütün bunları, çok daha dinamik bir şekilde, sakar monolitik bağlama basamağını ortadan kaldırarak değil, makine koduna derlemeyi elimine ederek yapar. Kaynak, hala nesne dosyalarına derlenir, ancak bunlar, yekpare bir yürütülebilir dosyaya bağlanmak yerine çalışma zamanı görüntüsüne yüklenir.

"Bu modülü yeniden yükle" diyorsunuz ve bazı mod anahtarlarına bağlı olarak kaynağı yüklüyor ve yorumluyor veya derliyor.

Linux çekirdek programlaması, C'de çalışmanıza rağmen bu lezzetin bir kısmına sahiptir. Bir modülü yeniden derleyebilir ve yükleyip boşaltabilirsiniz. Tabii ki, hala bazı çalıştırılabilir şeyler ürettiğinizi biliyorsunuz ve yine de bazı manuel adımlarla karmaşık bir derleme sistemi tarafından yönetiliyor. Fakat gerçek şu ki, sonunda sadece bu küçük modülü indirip yeniden yükleyebilirsiniz ve tüm çekirdeği yeniden başlatmak zorunda kalmazsınız.

Bazı diller bundan daha iyi taneli bir modülerleşmeye sahiptir ve bina ve yükleme çalışma süreleri içinde yapılır, bu yüzden daha sorunsuzdur.


2

ilk sorudan ne tür bir sapma ... Bahsetmediğim bir nokta, bir python programının kaynağının kullandığınız ve dağıttığınız, kullanıcı perspektifinden program olduğu anlamına gelir. İşleri iyi tanımlanmamış kategorilerde basitleştirme eğilimindeyiz.

Derlenmiş programlar genellikle makine kodunun bağımsız dosyaları olarak kabul edilir. (kuşkusuz sıklıkla, belirli işletim sistemleriyle ilişkili dinamik bağlantı kitaplıklarına bağlantılar içeren). Bu dedi ki ... derlenmiş ya da yorumlanmış olarak tarif edilebilecek çoğu programlama dilinin çeşitliliği var.

Python bir derleyiciye ihtiyaç duymaz, çünkü oluşturulan makine kodunu kolayca erişebileceğiniz veya dağıtabileceğiniz bir biçimde kaydetmeden kodu derleyen ve çalıştıran bir uygulamaya (tercüman adı verilir) dayanır.


1

Tüm programlama dilleri insan kavramlarından hedef makine koduna çevrilmesini gerektirir. Assembly dili bile makine koduna çevrilmelidir. Bu çeviri genellikle aşağıdaki aşamalarda gerçekleşir:

Faz 1: Analiz ve çeviri (ayrıştırma) bir ara koda dönüştürülür. Aşama 2: Ara kodun, harici referanslar için yer tutucularla hedef makine koduna çevrilmesi. Aşama 3: Dış referansların ve paketlemenin makinede çalıştırılabilir bir programda çözülmesi.

Bu çeviriye genellikle ön derleme ve "Tam zamanında" (JIT) veya çalışma zamanı derleme denir.

C, C ++, COBOL, Fortran, Pascal (hepsi değil) ve Assembly gibi diller tercüman gerektirmeden doğrudan çalıştırma sistemi tarafından yürütülebilen önceden derlenmiş dillerdir.

Java, BASIC, C # ve Python gibi diller yorumlanır. Hepsi, 1. Aşama'da yaratılan ara kodu kullanır, ancak bazen onu makine koduna nasıl çevirdikleri konusunda farklılık gösterir. En basit formlar, beklenen işi yapan makine kodu rutinlerini yürütmek için bu ara kodu kullanır. Diğerleri ara kodu makine koduna kadar derler ve çalışma zamanı sırasında harici bağımlılık düzeltmesini yapar. Derlendikten sonra derhal çalıştırılabilir. Aynı zamanda, makine kodu, daha sonra tekrar işleve ihtiyaç duyulduğunda tekrar kullanılabilecek, önceden derlenmiş, yeniden kullanılabilir makine kodu önbelleğinde saklanır. Bir işlev önceden önbelleğe alınmışsa, tercümanın tekrar derlemesi gerekmez.

Modern üst düzey dillerin çoğu, yorumlanmış (JIT) kategorisine girer. Önceden derlenmiş C & C ++ gibi daha eski diller.

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.