DEV Community

Vebende Akademi
Vebende Akademi

Posted on

CPython, Bytecode ve Python Virtual Machine (PVM)

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:

  1. CPython
  2. Bytecode
  3. 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 Python

Hepsi 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 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:

  1. Nesne kontrolü
  2. Tip kontrolü
  3. Referans yönetimi
  4. Bytecode yürütme
  5. 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.

Top comments (0)