Python neden hem derleyiciye hem de tercümana ihtiyaç duyuyor?


9

Java'nın hem derleyiciye hem de tercümana ihtiyacı olduğunu anlayabiliyorum. Kaynak kodunu bayt koduna derler ve ardından bir sanal makine (Windows'ta, Linux'ta, Android'de vb.) Bu bayt kodunu mevcut mimari için makine koduna çevirir.

Peki neden Python'un hem derleyiciye hem de tercümana ihtiyacı var? Python platformdan bağımsız olmadığından, neden yalnızca yorumu kullanmıyorsunuz? Bildiğim kadarıyla, herhangi bir Windows veya Linux makinesinde herhangi bir değişiklik yapmadan bir Python programını (bayt koduyla derlenmiş) çalıştıramazsınız. Yoksa yanılıyor muyum?


Yanlış olabilirsiniz. Python yerine Lua kullanıyorsanız yanlış olur.
Basile Starynkevitch

Yanıtlar:


13

Bildiğim kadarıyla, herhangi bir Python programını (bayt koduyla derlenmiş), pencerelerde veya linux'da değişiklik yapmadan yürütemezsiniz.

Yanlışsın. Python bayt kodu çapraz platformdur. Bkz. Python bayt kodu sürümüne bağlı mı? Platforma bağlı mı? Overflow üzerinde. Ancak, sürümler arasında uyumlu değildir. Python 2.6, Python 2.5 dosyalarını yürütemez. Bu nedenle çapraz platform halindeyken, dağıtım biçimi olarak genellikle kullanışlı değildir.

Ama neden Python'un hem derleyiciye hem de tercümana ihtiyacı var?

Hız. Sıkı yorum yavaştır. Hemen hemen her "yorumlanan" dil, kaynak kodunu bir tür dahili temsilde derler, böylece kodu tekrar tekrar ayrıştırmak zorunda kalmaz. Python'un durumunda, bu dahili gösterimi diske kaydeder, böylece kodun bir sonraki gereksiniminde ayrıştırma / derleme işlemini atlayabilir.


7

Java'nın hem derleyiciye hem de tercümana ihtiyacı olduğunu anlayabiliyorum.

Öyle değil. Java Dil Spesifikasyonu'nda Java'nın bir derleyici olması gerektiğini söyleyen hiçbir şey yoktur. Java Dil Spesifikasyonu'nda Java'nın bir tercümana sahip olması gerektiğini söyleyen hiçbir şey yoktur.

Tercüman, derleyici veya ikisinin bir kombinasyonunun kullanılıp kullanılmayacağı tamamen uygulayıcının takdirine bırakılmıştır.

Aslında, orada olan Java için GNU Compiler örneğin makine koduna düz derlemek Java uygulamaları, gcj. Teknik açıdan bakıldığında, Oracle OpenJDK Java derleyicisi ayrıca makine kodunu, özellikle JVM bayt kodunu derler. Şimdi diyebilirsiniz ki, bir dakika, bu makine kodu değil! Ancak, x86 makine kodu için yazılım tercümanları vardır ve JVM bayt kodunu çalıştırabilen donanım CPU'ları vardır, bu yüzden birini "yerel" ve diğerini değil yapan nedir?

JVM bayt kodunun, tıpkı x86 makine kodunda olduğu gibi Java Dil Spesifikasyonu'nun dışında olduğunu unutmayın.

ve ardından bir sanal makine (Windows'ta, Linux'ta, Android'de vb.) bu bayt kodunu mevcut mimari için makine koduna çevirir.

Yine, bu tamamen uygulayıcıya bağlıdır.

Orijinal Sun JVM asla tercüme etmedi, her zaman yorumladı. Geçerli Oracle OpenJDK JVM yorumlar ve yalnızca sık sık çalıştırılan parçalar derlenir. Maxine Research VM her zaman JIT'i derler. Excelsior.JET uygulaması önceden bir kez derlenir. IKVM.NET JVM, CIL bayt kodunu derler. Android Runtime, kurulum sırasında önceden bir kez derler. (Ayrıca, Android Çalışma Zamanı JVM bayt kodunu anlamıyor, tamamen farklı bir dil olan Dalvik bayt kodunu kullanıyor.)

Peki neden Python'un hem derleyiciye hem de tercümana ihtiyacı var?

Yine öyle değil. Python Dil Spesifikasyonu'nda Python'un bir derleyici olması gerektiğini söyleyen hiçbir şey yoktur. Python Dil Spesifikasyonu'nda Python'un bir tercümana sahip olması gerektiğini söyleyen hiçbir şey yoktur.

Aslında, Python'un asla yorumlanmadığını unutmayın. Mevcut tüm Python uygulamaları her zaman Python'u farklı bir dile derler. Bu dil daha sonra yorumlanabilir veya yorumlanmayabilir, ancak bu dil Python'dan farklı bir dildir. Python yorumlanmaz.

neden sadece yorumu kullanmıyorsunuz?

Çünkü Python makineler tarafından kolayca yorumlanacak şekilde tasarlanmamıştır. İnsanlar tarafından kolayca yorumlanacak şekilde tasarlanmıştır. OTOH, CPython bayt kodu olduğunu kolayca makineler tarafından okunabilecek tarzda dizayn. Bu nedenle, insanlar için tasarlanmış bir dilde kod yazmak ve makineler için tasarlanmış bir dilde yorumlamak mantıklıdır ve birinden diğerine geçmek için derlemeniz gerekir.

Bildiğim kadarıyla, herhangi bir Windows veya Linux makinesinde herhangi bir değişiklik yapmadan bir Python programını (bayt koduyla derlenmiş) çalıştıramazsınız.

Evet yapabilirsin. CPython VM, PyPy, Jython ve IronPython gibi hem Windows hem de Linux için kullanılabilir.


Dillerin derlenmesi veya yorumlanması gerekmez. Diller sadece vardır . Aslında, bir dil herhangi bir tercüman veya derleyici olmadan mükemmel bir şekilde var olabilir ! Örneğin, 1930'larda tasarladığı Konrad Zuse'un Plankalkül'ü yaşamı boyunca hiç uygulanmadı. Hala içinde programlar yazabiliyordunuz, bu programları analiz edebiliyordunuz, nedenleri, onlarla ilgili özellikleri ispat edebiliyordunuz… sadece uygulayamadınız. (Aslında, bu bile yanlış: elbette onları kafanızda veya kalem ve kağıtla çalıştırabilirsiniz.)

Şimdi, bir dilin herhangi bir özel uygulaması bir derleyici (veya birden çok derleyici), bir tercüman veya herhangi bir kombinasyon kullanabilir. Ancak bu dilin değil uygulamanın bir özelliğidir . Her dil bir derleyici ile uygulanabilir ve her dil bir tercüman ile uygulanabilir.

Ancak, bir programı tercüman olmadan çalıştıramayacağınızı unutmayın. Derleyici bir programı bir dilden diğerine çevirir. Ama bu kadar. Şimdi aynı programa sahipsiniz, sadece farklı bir dilde. Programın bir sonucunu elde etmenin tek yolu programı yorumlamaktır . Bazen, dil son derece basit bir ikili makine dilidir ve yorumlayıcı aslında silikonda sabit kodlanmıştır (ve buna "CPU" diyoruz), ancak bu hala yorumdur.

Tercümanları, JIT derleyicilerini ve AOT derleyicilerini birleştirmenin farklılıkları ve farklı yollarını açıklayan bu cevabımla ve AOT derleyicisi ile JIT derleyicisi arasındaki farklarla ilgilenen bu cevabı da ilginizi çekebilir .


3
Zamanlarının çoğunu soruyu cevaplamak yerine bilgiçlikle geçiren cevaplar beni üzüyor.
Winston Ewert

3

Bayt kodunun bir dağıtım biçimi olarak uygun olmadığı doğrudur, ancak bu işe yaramaz olduğu anlamına gelmez. Belirli bir makinede başlatma süresini iyileştirmenin yanı sıra, ilk çalıştırmadan sonra, bayt kodunu yorumlamak da bir AST'yi veya tanrı yasaklı, satır satır yorumlamaktan çok daha basittir.

Bayt kodu, kodun daha düşük düzeyli, daha düzenli, daha kompakt (hem anlamsal olarak hem de bellek düzeni açısından) bir temsilidir. İşlem sırası zaten belirtilmiş, yerel değişken adları daha basit bir biçime (tamsayı indeksleri) çözümlenmiştir. Takip etmek için karmaşık bir sözdizimi yok, sadece basit bir talimat peş peşe. Buna ek olarak, daha az durum gereklidir: satır satır yorumlama için temel olarak tüm ayrıştırıcıyı etrafınızda tutmanız gerekir ve bir AST yorumlayıcısı ağaç yığınıyla çağrı yığınını patlatırken bir bayt kod yorumlayıcısının geçici değerler için sadece küçük bir yıla ihtiyacı vardır. ve yerliler.

Bu ve diğer faktörler baytkod yorumlayıcıları diğer tercümanlara göre önemli ölçüde daha hızlı hale getirmeyi gerektirir.

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.