CPython, Bytecode ve Python Virtual Machine (PVM)
Python öğrenen çoğu geliştirici şu aşamaya kadar gelir:
x = 10
y = 20
print(x + y)
Enter fullscreen mode Exit fullscreen mode
Kod çalışır, sonuç gelir ve konu kapanır.
Fakat profesyonel seviyede Python geliştiren, performans optimizasyonu yapan veya Python’un iç mimarisini anlamak isteyen bir yazılımcının aşağıdaki üç kavramı çok iyi bilmesi gerekir:
- CPython
- Bytecode
- Python Virtual Machine (PVM)
Bu üçü Python’un çalışma motorunu oluşturur.
Büyük Resim
Bir Python programı çalıştırıldığında süreç şu şekildedir:
Python Source Code
↓
Tokenizer
↓
Parser
↓
AST
↓
Compiler
↓
Bytecode
↓
Python Virtual Machine
↓
CPython Runtime
↓
Operating System
↓
CPU
Enter fullscreen mode Exit fullscreen mode
Buradaki en kritik bölüm:
Bytecode
↓
PVM
Enter fullscreen mode Exit fullscreen mode
çiftidir.
1. CPython Nedir?
Öncelikle çok önemli bir yanlış anlaşılmayı düzeltelim.
Birçok kişi Python’u bir dil zanneder.
Aslında:
Python = Dil Spesifikasyonu
Enter fullscreen mode Exit fullscreen mode
CPython ise:
Python'un en yaygın implementasyonu
Enter fullscreen mode Exit fullscreen mode
dur.
Python Bir Dil Tanımıdır
Nasıl ki:
C#
Java
JavaScript
Enter fullscreen mode Exit fullscreen mode
bir dil tanımıysa,
Python da bir dil tanımıdır.
Bu tanımı çalıştıran farklı motorlar vardır.
Örneğin:
Implementasyon Dil CPython Python PyPy Python Jython Python IronPython Python MicroPython PythonHepsi Python kodu çalıştırır.
Ama iç yapıları farklıdır.
CPython Nedir?
CPython:
C dili ile yazılmış Python yorumlayıcısıdır.
Enter fullscreen mode Exit fullscreen mode
Python.org üzerinden indirdiğiniz standart Python budur.
Örneğin:
python app.py
Enter fullscreen mode Exit fullscreen mode
komutu verdiğinizde çalışan şey CPython’dur.
CPython’ın kaynak kodu yaklaşık:
500.000+ satır C
Enter fullscreen mode Exit fullscreen mode
içerir.
Kaynak kodu:
CPython’ın Görevi
CPython:
x = 10
y = 20
print(x + y)
Enter fullscreen mode Exit fullscreen mode
kodunu alır.
Sonra:
Token
↓
AST
↓
Bytecode
↓
PVM Execution
Enter fullscreen mode Exit fullscreen mode
işlemlerini gerçekleştirir.
CPython İçindeki Bileşenler
Basitleştirilmiş görünüm:
CPython
│
├── Lexer
├── Parser
├── Compiler
├── Bytecode Generator
├── PVM
├── Garbage Collector
├── Memory Manager
└── C API
Enter fullscreen mode Exit fullscreen mode
2. Bytecode Nedir?
Python doğrudan makine koduna çevrilmez.
Java’da olduğu gibi ara bir temsil oluşturulur.
Buna:
Bytecode
Enter fullscreen mode Exit fullscreen mode
denir.
Örnek
Kodumuz:
x = 10
y = 20
z = x + y
Enter fullscreen mode Exit fullscreen mode
olsun.
Python bunu aşağıdakine benzer bytecode’a dönüştürür:
LOAD_CONST 10
STORE_NAME x
LOAD_CONST 20
STORE_NAME y
LOAD_NAME x
LOAD_NAME y
BINARY_ADD
STORE_NAME z
Enter fullscreen mode Exit fullscreen mode
Bytecode’un Amacı
Python’un şu kodu:
x + y
Enter fullscreen mode Exit fullscreen mode
işlemciye doğrudan gönderilemez.
Çünkü CPU şunu anlamaz:
x
+
y
Enter fullscreen mode Exit fullscreen mode
Bu nedenle Python önce bunu standart komutlara dönüştürür.
Bytecode Nasıl Görülür?
Python’da:
import dis
def test():
x = 10
y = 20
return x + y
dis.dis(test)
Enter fullscreen mode Exit fullscreen mode
çıktı:
LOAD_CONST 10
STORE_FAST x
LOAD_CONST 20
STORE_FAST y
LOAD_FAST x
LOAD_FAST y
BINARY_OP +
RETURN_VALUE
Enter fullscreen mode Exit fullscreen mode
şeklinde olur.
.pyc Dosyaları
Python bytecode’u diske de yazabilir.
Örneğin:
main.py
Enter fullscreen mode Exit fullscreen mode
çalıştırıldığında:
__pycache__
Enter fullscreen mode Exit fullscreen mode
oluşur.
İçinde:
main.cpython-313.pyc
Enter fullscreen mode Exit fullscreen mode
benzeri dosyalar vardır.
Bu dosya:
Bytecode
Enter fullscreen mode Exit fullscreen mode
saklar.
Neden Saklanır?
Tekrar derleme maliyetini azaltmak için.
İkinci çalıştırmada:
.py
Enter fullscreen mode Exit fullscreen mode
yerine
.pyc
Enter fullscreen mode Exit fullscreen mode
kullanılabilir.
Bu da açılış süresini azaltır.
Bytecode Makine Kodu Mudur?
Hayır.
En çok karıştırılan konu budur.
Bytecode:
LOAD_FAST
STORE_FAST
BINARY_ADD
Enter fullscreen mode Exit fullscreen mode
gibi komutlardan oluşur.
CPU bunları anlayamaz.
Bu komutları çalıştıracak başka bir sistem gerekir.
İşte burada PVM devreye girer.
3. Python Virtual Machine (PVM)
PVM:
Python Bytecode'unu çalıştıran sanal işlemcidir.
Enter fullscreen mode Exit fullscreen mode
Gerçek CPU ile Karşılaştırma
Gerçek CPU:
MOV
ADD
SUB
MUL
Enter fullscreen mode Exit fullscreen mode
gibi komutlar çalıştırır.
PVM ise:
LOAD_FAST
STORE_FAST
CALL_FUNCTION
BINARY_ADD
Enter fullscreen mode Exit fullscreen mode
çalıştırır.
Mantık
Bytecode:
LOAD_FAST x
LOAD_FAST y
BINARY_ADD
Enter fullscreen mode Exit fullscreen mode
üretmiştir.
PVM bunu okur.
Adım 1
LOAD_FAST x
Enter fullscreen mode Exit fullscreen mode
çalışır.
Stack:
10
Enter fullscreen mode Exit fullscreen mode
Adım 2
LOAD_FAST y
Enter fullscreen mode Exit fullscreen mode
çalışır.
Stack:
20
10
Enter fullscreen mode Exit fullscreen mode
Adım 3
BINARY_ADD
Enter fullscreen mode Exit fullscreen mode
çalışır.
Stack:
30
Enter fullscreen mode Exit fullscreen mode
Bu nedenle PVM’e bazen:
Stack Based Virtual Machine
Enter fullscreen mode Exit fullscreen mode
denir.
Stack Mantığı
Örnek:
3 + 5
Enter fullscreen mode Exit fullscreen mode
Bytecode:
LOAD_CONST 3
LOAD_CONST 5
BINARY_ADD
Enter fullscreen mode Exit fullscreen mode
PVM:
PUSH 3
PUSH 5
ADD
Enter fullscreen mode Exit fullscreen mode
mantığıyla çalışır.
PVM Nerede Çalışır?
Aslında PVM ayrı bir program değildir.
CPython’ın içindedir.
Şöyle düşünün:
CPython
│
├── Compiler
├── Bytecode
└── PVM
Enter fullscreen mode Exit fullscreen mode
Yani:
PVM ⊂ CPython
Enter fullscreen mode Exit fullscreen mode
Python Nesneleri PVM İçinde Nasıl Temsil Edilir?
Örneğin:
x = 10
Enter fullscreen mode Exit fullscreen mode
gördüğümüzde:
“10” doğrudan RAM’e yazılmaz.
CPython şu yapıyı oluşturur:
PyLongObject
Enter fullscreen mode Exit fullscreen mode
Basitleştirilmiş hali:
struct {
reference_count;
type;
value;
}
Enter fullscreen mode Exit fullscreen mode
Yani:
10
Enter fullscreen mode Exit fullscreen mode
aslında bir nesnedir.
BINARY_ADD Gerçekte Ne Yapar?
PVM:
BINARY_ADD
Enter fullscreen mode Exit fullscreen mode
gördüğünde:
CPython içindeki C fonksiyonlarını çağırır.
Örneğin:
PyNumber_Add()
Enter fullscreen mode Exit fullscreen mode
Bu fonksiyon:
10 + 20
Enter fullscreen mode Exit fullscreen mode
mi?
"abc" + "def"
Enter fullscreen mode Exit fullscreen mode
mi?
list1 + list2
Enter fullscreen mode Exit fullscreen mode
mi?
kontrol eder.
Sonra uygun işlemi gerçekleştirir.
Garbage Collector Nerede Devreye Girer?
CPython içinde.
Örneğin:
x = [1,2,3]
Enter fullscreen mode Exit fullscreen mode
oluşturuldu.
Daha sonra:
x = None
Enter fullscreen mode Exit fullscreen mode
oldu.
Referans kalmadığında:
Reference Counting
Enter fullscreen mode Exit fullscreen mode
ve
Garbage Collector
Enter fullscreen mode Exit fullscreen mode
mekanizmaları belleği temizler.
Performans Neden Düşük?
Python’un C veya Rust’tan yavaş olmasının temel nedeni budur.
Çünkü:
x + y
Enter fullscreen mode Exit fullscreen mode
ifadesi:
- Nesne kontrolü
- Tip kontrolü
- Referans yönetimi
- Bytecode yürütme
- PVM yorumlama
gibi birçok katmandan geçer.
C dilinde ise:
int z = x + y;
Enter fullscreen mode Exit fullscreen mode
doğrudan makine koduna çevrilir.
CPython, Bytecode ve PVM İlişkisi
Bütün sistemi tek diyagramda özetlersek:
Python Source Code
│
▼
CPython Parser
│
▼
AST
│
▼
Compiler
│
▼
Bytecode
│
▼
Python Virtual Machine
│
▼
CPython Runtime (C)
│
▼
Operating System
│
▼
CPU
│
▼
Machine Code
Enter fullscreen mode Exit fullscreen mode
Özetle:
- CPython, Python’un C ile yazılmış resmi ve en yaygın yorumlayıcısıdır.
- Bytecode, Python kaynak kodunun CPU’dan önceki ara temsilidir.
- PVM (Python Virtual Machine), bytecode’u yorumlayıp çalıştıran sanal işlemcidir.
- PVM, CPython’ın içinde yer alır ve stack tabanlı çalışır.
- Son aşamada CPython’ın C kodları işletim sistemi ve işlemci üzerinden gerçek makine komutlarını yürütür.
Bu üç yapıyı anladığınızda Python artık yalnızca bir programlama dili değil; derleyici teorisi, sanal makineler, işletim sistemleri ve bilgisayar mimarisinin kesişim noktasında çalışan çok katmanlı bir yürütme platformu olarak görünmeye başlar.
답글 남기기