Python Kodundan Makine Diline (0 ve 1'lere) Yolculuk
Bir yazılım geliştiricisinin yazdığı Python kodu ile işlemcinin çalıştırdığı makine kodu arasında oldukça uzun ve katmanlı bir süreç vardır. Bu süreci anlamak, sadece Python'u değil, modern bilgisayar mimarisini de anlamanızı sağlar.
Aşağıdaki örnek üzerinden ilerleyelim:
x = 10
y = 20
z = x + y
print(z)
Bir geliştirici açısından son derece basit görünen bu kodun arkasında milyonlarca transistorun çalıştığı çok karmaşık bir mekanizma vardır.
1. Kaynak Kod (Source Code)
İlk aşama geliştiricinin yazdığı metindir.
x = 10
y = 20
z = x + y
print(z)
Bu aşamada dosya aslında düz bir metindir.
Dosya içerisinde saklanan şeyler:
x
=
1
0
gibi karakterlerdir.
Bilgisayar dosyayı şu şekilde saklar:
| Karakter | ASCII |
|---|---|
| x | 120 |
| = | 61 |
| 1 | 49 |
| 0 | 48 |
Disk üzerinde bunlar binary olarak tutulur:
01111000
00111101
00110001
00110000
Henüz burada Python çalışmamaktadır.
Sadece metin vardır.
2. Python Interpreter'ın Dosyayı Okuması
Python çalıştırıldığında:
python app.py
önce dosyayı belleğe yükler.
RAM içerisinde artık:
x = 10
y = 20
z = x + y
satırları bulunmaktadır.
3. Lexical Analysis (Tokenization)
Python yorumlayıcısı metni parçalamaya başlar.
Örneğin:
z = x + y
şu tokenlara ayrılır:
IDENTIFIER(z)
ASSIGN(=)
IDENTIFIER(x)
PLUS(+)
IDENTIFIER(y)
Bu aşamada Python:
"Bu karakterlerin anlamı nedir?"
sorusunu cevaplamaya çalışır.
4. Parsing
Tokenlar artık bir ağaca dönüştürülür.
Buna AST denir.
AST:
Assignment
├── Variable(z)
└── Add
├── Variable(x)
└── Variable(y)
Artık Python:
z = x + y
ifadesinin ne yapmak istediğini anlamıştır.
5. Bytecode Üretimi
Python doğrudan makine koduna çevrilmez.
Önce Bytecode oluşturulur.
CPython'da:
z = x + y
yaklaşık olarak:
LOAD_NAME x
LOAD_NAME y
BINARY_ADD
STORE_NAME z
haline gelir.
6. Bytecode Nedir?
Bytecode:
LOAD_NAME
LOAD_NAME
BINARY_ADD
STORE_NAME
gibi işlem komutlarından oluşur.
Makine dili değildir.
Python Sanal Makinesi (PVM) için hazırlanmıştır.
Java'daki JVM mantığına benzer.
7. Python Virtual Machine (PVM)
PVM bytecode'u çalıştırmaya başlar.
Örneğin:
LOAD_NAME x
geldiğinde:
x = 10
değerini bulur.
Stack'e koyar.
STACK
-----
10
Ardından:
LOAD_NAME y
çalışır.
STACK
-----
20
10
8. Toplama İşlemi
Şimdi:
BINARY_ADD
çalışacaktır.
Stack'ten:
20
10
çekilir.
Toplanır.
Sonuç:
30
Stack'e geri yazılır.
STACK
-----
30
9. İşlemcinin Anlayacağı Komutlar
Buraya kadar hala gerçek CPU komutları çalışmadı.
Şimdi Python Runtime içerisinde yazılmış C kodları çalışır.
Örneğin CPython içerisinde:
PyNumber_Add()
çağrılır.
Bu fonksiyon derlenmiş C kodudur.
Artık işletim sistemi üzerinden gerçek işlemci komutlarına dönüşmeye başlar.
10. C Kodundan Assembly'ye
Örneğin:
int z = x + y;
derlendiğinde:
MOV EAX, 10
MOV EBX, 20
ADD EAX, EBX
oluşabilir.
Assembly artık işlemciye çok yakındır.
11. Assembly'den Makine Koduna
Assembler bunu binary'ye çevirir.
Örneğin:
ADD EAX, EBX
x86 işlemcide:
00000001 11011000
şeklinde temsil edilebilir.
Artık tamamen 0 ve 1'lerden oluşmaktadır.
12. CPU Komutu Alır
CPU sürekli şu döngüyü çalıştırır:
FETCH
DECODE
EXECUTE
FETCH
Komut RAM'den alınır.
00000001 11011000
DECODE
CPU komutun anlamını çözer.
ADD EAX, EBX
EXECUTE
ALU devreleri toplama işlemini yapar.
10 + 20
sonucu:
30
olur.
13. Peki 0 ve 1 Gerçekte Nedir?
Çoğu kişinin düşündüğü gibi bilgisayar içinde:
0
1
0
1
karakterleri dolaşmaz.
Gerçekte elektrik seviyeleri vardır.
Örneğin:
| Voltaj | Anlam |
|---|---|
| 0V | 0 |
| 5V | 1 |
veya modern işlemcilerde:
| Voltaj |
|---|
| 0.8V |
| 1.1V |
gibi seviyeler kullanılır.
14. Transistor Seviyesi
İşlemcinin içinde milyarlarca transistor vardır.
Bir transistor:
Açık
Kapalı
durumlarına sahiptir.
Bu da:
1
0
olarak yorumlanır.
Örneğin:
AND Kapısı
A B | Çıkış
-----------
0 0 | 0
0 1 | 0
1 0 | 0
1 1 | 1
15. Toplama Devresi (Adder)
CPU içindeki toplama işlemi aslında mantık kapılarından oluşur.
Yarım Toplayıcı:
A ----\
XOR ---- SUM
B ----/
A ----\
AND ---- CARRY
B ----/
Milyarlarca transistor birlikte çalışarak:
10 + 20
hesabını gerçekleştirir.
16. Sonuç Ekrana Nasıl Geliyor?
print(z)
çalışınca:
Python Runtime
↓
İşletim Sistemi API
↓
Konsol Driver
↓
GPU / Ekran Kartı
↓
Monitör
↓
Piksel
↓
Işık
şeklinde ilerler.
Sonunda monitörde:
30
görürüz.
Katmanların Tamamı
Python Kodu
↓
Tokenizer
↓
Parser
↓
AST
↓
Bytecode
↓
Python Virtual Machine
↓
CPython (C Kodu)
↓
Assembly
↓
Machine Code
↓
CPU Instruction
↓
Logic Gates
↓
Transistors
↓
Elektrik Sinyalleri
↓
0 ve 1
Aslında geliştiricinin yazdığı:
print("Merhaba Dünya")
satırı, görünürde tek satır olsa da arka planda yüzlerce katman geçerek milyarlarca transistorun koordineli çalışmasıyla ekrana ulaşır. Modern bilgisayar biliminin en etkileyici taraflarından biri, insanların okuyabildiği yüksek seviyeli bir dilin sonunda elektrik akımlarına dönüşmesi ve tekrar anlamlı bilgi olarak kullanıcıya geri dönmesidir.
Top comments (0)