CPython, Bytecode ve Python Virtual Machine (PVM)

작성자

카테고리:

← 피드로
DEV Community · Vebende Akademi · 2026-06-15 개발(SW)

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.

원문에서 계속 ↗

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다