Ben bile CPython, JPython, IronPython, PyPy birbirinden nasıl farklı olduğunu anlamak aynı sorun vardı.
Bu yüzden, açıklamaya başlamadan önce üç şeyi temizlemeye hazırım:
- Python : Bu bir dildir, yalnızca yorumlayıcıya (python kodunuzu kabul eden program) nasıl aktarılacağını / ifade edileceğini belirtir / açıklar.
- Uygulama : Her şey, tercümanın özellikle hangi dilde ve sonuçta ne şekilde yazıldığı ile ilgilidir .
- Bayt kodu: "Gerçek" bilgisayar makinesi, donanım işlemcisi yerine genellikle sanal makine olarak adlandırılan bir program tarafından işlenen koddur.
CPython C dilinde yazılmış bir uygulamadır. Python'a özgü bytecode (yığın-makine tabanlı talimat seti) üretir ve bunu yürütür. Python kodunu bir bayt koduna dönüştürmenin nedeni, makine talimatları gibi görünüyorsa bir tercüman uygulamanın daha kolay olmasıdır. Ancak, Python kodunun yürütülmesinden önce bir bayt kodu üretmek gerekli değildir (ancak CPython üretir).
CPython'un bayt koduna bakmak isterseniz, bunu yapabilirsiniz. Bunu nasıl yapabileceğiniz aşağıda açıklanmıştır:
>>> def f(x, y): # line 1
... print("Hello") # line 2
... if x: # line 3
... y += x # line 4
... print(x, y) # line 5
... return x+y # line 6
... # line 7
>>> import dis # line 8
>>> dis.dis(f) # line 9
2 0 LOAD_GLOBAL 0 (print)
2 LOAD_CONST 1 ('Hello')
4 CALL_FUNCTION 1
6 POP_TOP
3 8 LOAD_FAST 0 (x)
10 POP_JUMP_IF_FALSE 20
4 12 LOAD_FAST 1 (y)
14 LOAD_FAST 0 (x)
16 INPLACE_ADD
18 STORE_FAST 1 (y)
5 >> 20 LOAD_GLOBAL 0 (print)
22 LOAD_FAST 0 (x)
24 LOAD_FAST 1 (y)
26 CALL_FUNCTION 2
28 POP_TOP
6 30 LOAD_FAST 0 (x)
32 LOAD_FAST 1 (y)
34 BINARY_ADD
36 RETURN_VALUE
Şimdi yukarıdaki koda bir göz atalım. 1'den 6'ya kadar olan hatlar bir fonksiyon tanımıdır. 8. satırda, CPython (yorumlayıcı) tarafından oluşturulan ara Python bayt kodunu (veya Python bayt kodu için sökücü) görüntüleyebileceğiniz 'dis' modülünü içe aktarıyoruz.
NOT : Bu kodun bağlantısını #python IRC kanalından aldım: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
Ve sonra, Java ile yazılmış ve Java bayt kodu üreten Nython var. Java bayt kodu, Java Sanal Makinesi'nin (JVM) bir uygulaması olan Java Runtime Environment üzerinde çalışır. Bu kafa karıştırıcı ise, Java'nın nasıl çalıştığı hakkında hiçbir fikriniz olmadığından şüpheleniyorum. Layman terimleriyle, Java (derleyici değil dil) kodu Java derleyicisi tarafından alınır ve yalnızca JRE kullanılarak çalıştırılabilen bir dosya (Java bayt kodu) çıkarır. Bu, Java kodu derlendikten sonra, yalnızca JRE tarafından çalıştırılabilen Java bayt kodu biçimindeki diğer makinelere taşınabilir. Bu hala kafa karıştırıcıysa, buna bir göz atmak isteyebilirsiniz web sayfasına .
Burada, CPython'un bayt kodunun Jython gibi taşınabilir olup olmadığını sorabilirsiniz, sanmıyorum. CPython uygulanmasında üretilen bayt kodu daha sonraki kod yürütülmesi için kolay bunu yapmak için o tercüman özgü idi (Ben de işleme diğer birçok tercüman yapılır sadece kolaylığı için, bu tür ara baytkodu üretimini şüpheli).
Yani, Jython'da, Python kodunuzu derlediğinizde, bir JVM'de çalıştırılabilen Java bayt kodu ile sonuçlanırsınız.
Benzer şekilde, IronPython (C # dilinde yazılmış), Python kodunuzu Microsoft tarafından geliştirilen JVM ile karşılaştırıldığında benzer bir teknoloji olan Ortak Dil Çalışma Zamanı'na (CLR) derler.