Derleyici nedir?
Derleyici, bir programlama dilinde yazılmış kaynak kodu, program çalışmadan önce makine koduna ya da bytecode gibi daha alt seviyeli başka bir biçime çeviren programdır. Çevrilmiş program daha sonra orijinal kaynak olmadan çalışabilir.
Güncellendi: 24 Eylül 2026
- 1print("Hello")
- 2total = 2 + 3
- 3print(total)
- 4print("Done")
Bir kez derle, sonra programı istediğin kadar çalıştır: çalıştırma sayacı artar, derleme sayacı artmaz. Yazım hatasını aç: derleyici programın tamamını reddeder ve hiçbir şey yazdırılmaz.
Bu C programını hello.c olarak kaydet:
#include <stdio.h>
int main(void) {
int price = 4;
printf("Total: %d\n", price * 3);
return 0;
}
Sonra gcc hello.c -o hello yaz. Bir an görünür bir şey olmaz, ardından kaynağının yanında hello adında yeni bir dosya belirir. Bu dosya derleyicinin çıktısıdır: işlemcinin çalıştırabileceği makine kodu. hello.c dosyasını silsen bile ./hello çalışmaya devam eder, çünkü programın ihtiyaç duyduğu her şey zaten çevrilmiştir.
gcc hello.c -o hello
./hello
Total: 12
Derleyici adım adım nasıl çalışır
Derleyici kaynak kodu düz metin olarak okur ve aşama aşama işler. Tek bir satırı ele alalım, total = price * 3:
- Sözcüksel analiz. Metin, dilin "kelimeleri" olan token'lara bölünür:
totaladı,=operatörü,priceadı,*operatörü,3sayısı. Boşluklar ve yorumlar bu aşamada atılır. - Ayrıştırma (parsing). Token'lar yapıyı kaydeden bir sözdizimi ağacına dizilir: değeri
priceile3'ün çarpımı olan bir atama. Dilin dilbilgisine uymayan kod burada bir sözdizimi hatasıyla durur. - Anlamsal analiz. Derleyici anlamı kontrol eder:
pricetanımlanmış mı, tipler uyumlu mu, çağrılan fonksiyon var mı. - Optimizasyon. Program, yaptığı işi değiştirmeden daha hızlı çalışacak ya da daha az bellek kullanacak şekilde yeniden yazılır.
x * 2tek bir kaydırma talimatına dönüşebilir, hiçbir zaman çalışamayacak kod silinir. - Kod üretimi. Derleyici bir hedef için çıktı yazar: x86-64 ya da ARM makine kodu veya bir sanal makine için bytecode.
C ve C++'ta son bir adım olan bağlama (linking), derlenmiş dosyalarını kütüphane koduyla (C standart kütüphanesindeki printf gibi) birleştirip tek bir çalıştırılabilir dosya yapar. gcc bağlayıcıyı senin yerine çalıştırır; hepsinin tek bir komut gibi gelmesinin nedeni budur.
Python ilk iki aşamayı standart modüller olarak sunar, böylece onları gerçek bir girdi üzerinde çalışırken izleyebilirsin:
NAME 'total'
OP '='
NAME 'price'
OP '*'
NUMBER '3'
Assign(
targets=[
Name(id='total', ctx=Store())],
value=BinOp(
left=Name(id='price', ctx=Load()),
op=Mult(),
right=Constant(value=3)))
Derleyicinin geri kalanı bu ağaç üzerinden çalışır. Artık boşluklar ya da satır sonları önemli değildir, yalnızca yapı önemlidir: price ile 3'ün çarpımını total değişkenine ata.
Derleme zamanı: program çalışmadan bulunan hatalar
Derleyici, programın herhangi bir kısmı çalışmadan önce tamamını okuduğu için hataları erkenden reddedebilir. Bu örnekte source içindeki üç print satırından hiçbiri çalışmaz, ilki bile, çünkü Python'un derleyicisi metni çalıştırma başlamadan reddeder:
Rejected before running anything:
'(' was never closed (line 3)
Statik tipli dillerin derleyicileri sözdiziminden fazlasını yakalar. bad.c adlı bir dosyadaki bu C satırı dilbilgisi açısından doğrudur, ama bir tam sayı değişkenine metin koyar:
int count = "five";
GCC 14 ve sonraki sürümler bir hatayla durur:
bad.c:4:17: error: initialization of 'int' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
Aynı hata Python'da ancak o satır çalıştığında ortaya çıkar. Hatayı derleme zamanında yakalamak, büyük ekiplerin derlenen, statik tipli dilleri seçmesinin nedenlerinden biridir. Yine de derleyici her şeyi yakalayamaz: sıfır çıkan bir sayıya bölmek ya da var olmayan bir dosyayı okumak çalışma zamanında yine hata verir.
Derleyici örnekleri
| Derleyici | Okuduğu | Ürettiği |
|---|---|---|
| GCC, Clang | C, C++ | x86-64, ARM ve diğerleri için makine kodu |
| MSVC (Microsoft Visual C++) | C, C++ | Windows çalıştırılabilir dosyaları (.exe, .dll) |
javac | Java | JVM bytecode'u (.class dosyaları) |
rustc | Rust | Makine kodu |
go build | Go | Tek bir çalıştırılabilir dosya |
tsc | TypeScript | JavaScript |
Tablodaki iki satır, makine kodunun tek olası çıktı olmadığını gösterir. javac, Java çalışma zamanı ortamının bir parçası olan Java Sanal Makinesi'nin çalıştırdığı bytecode'u üretir. tsc ise TypeScript'i başka bir yüksek seviyeli dil olan JavaScript'e çevirir; bunu yapan derleyiciye çoğu zaman transpiler denir.
Derlenmiş makine kodu tek bir işlemci ailesine ve tek bir işletim sistemine bağlıdır. x86-64 üzerinde Windows için derlenmiş bir program, Apple M serisi çipli bir Mac'te çalışmaz; aynı kaynağı her hedef için yeniden derlersin.
Derleyici mi yorumlayıcı mı
Bir yorumlayıcı, ayrı bir program dosyası üretmek yerine kaynak kodu doğrudan çalıştırır; Python ve Ruby genellikle böyle çalıştırılır. Modern dil araçlarının çoğu iki fikri birlikte kullanır: CPython dosyanı bytecode'a derler ve sonra onu yorumlar, JVM ve JavaScript'in V8 motoru da sık kullanılan kodu program çalışırken makine koduna derler. Yan yana tam tablo derleyici ve yorumlayıcı farkı sayfasındadır.
Yaygın yanlış inanışlar
- "Derleniyorsa çalışıyordur." Derleyici programın geçerli olup olmadığını kontrol eder, doğru olup olmadığını değil. Mantık hataları ve sıfıra bölme gibi çalışma zamanı hataları arada kaçar.
- "Python derlenmez." CPython her dosyayı çalıştırmadan önce bytecode'a derler.
__pycache__klasörlerindeki.pycdosyaları bu bytecode'dur; programının içe aktardığı modüller için kaydedilir ki bir sonraki çalıştırma bu adımı atlayabilsin. - "Online derleyici bir derleyicidir." Kodunu tarayıcıda çalıştıran siteler onu, tüm araç zincirini (derleyici, bağlayıcı ve programın kendisi) çalıştırıp çıktıyı geri döndüren bir sunucuya gönderir. Derleyici bunun yalnızca bir parçasıdır.
- "Derlenmiş kod her yerde çalışır." Kod, derlendiği işlemci ve işletim sisteminde çalışır. Taşınabilirlik yeniden derlemekten ya da JVM gibi bir sanal makineden gelir.
Sırada ne var
C belgeleri derleyiciyi günlük kullanımda gösterir: C nasıl derlenir ve çalıştırılır sayfası gerçek gcc komutlarıyla ön işleme, derleme, assembly ve bağlama adımlarını anlatır. Kodu çalıştırmanın diğer yolunu görmek için derleyici ve yorumlayıcı farkı sayfasını, ardından program başladıktan sonra onu neyin çevrelediğini anlatan çalışma zamanı ortamı sayfasını oku. Derlenen bir dille pratik yapmak için C kursu iyi bir başlangıçtır.