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 .