Derleyici Nedir? Kaynak Koddan Çalışan Programa
Derleyici, bir programlama dilinde yazılmış kaynak kodu analiz ederek hedef dile veya işlemciye uygun çıktıya dönüştüren yazılımdır. Bu çıktı doğrudan makine kodu olabileceği gibi Java bytecode gibi ara bir biçim de olabilir; çalıştırılabilir programın oluşmasında bağlayıcı gibi başka araçlar da görev alabilir.
Bu yazıda (7)
- ›Kaynak kod, hedef kod ve çalıştırılabilir dosya aynı şey değildir
- ›Derleyicinin kodu işlerken izlediği dört kontrol noktası
- ›Derleme, bağlama ve çalıştırma hatalarını ayırma
- ›Derleyici ile yorumlayıcı farkı: hızdan önce çalışma modeline bakın
- ›Platform bağımlılığı, taşınabilirlik ve optimizasyonun sınırı
- ›Çözümlü örnekler: bir kod parçası hangi aşamada sorun çıkarır?
- ›Sık yapılan hatalar ve karıştırılan sınır durumları
Derleyici Nedir? Kaynak Koddan Çalışan Programa
Bilgisayar programları, insanların yazdığı kaynak kod ile işlemcinin yürüttüğü talimatlar arasında birkaç dönüşüm aşamasından geçer. Programcı; değişken, koşul, döngü ve fonksiyon gibi kavramlarla çalışır. İşlemci ise belirli bir komut kümesine uygun düşük seviyeli talimatları yürütür. Derleyici, bu iki düzey arasında yalnızca kelime çevirisi yapan basit bir araç değildir: kodun yapısını inceler, kurallara uyup uymadığını denetler, anlam ilişkilerini kontrol eder ve hedef platforma uygun çıktı üretir.
Bu nedenle bir dosyanın derleyici tarafından işlenmesi ile programın tamamının çalışır hâle gelmesi aynı olay değildir. Kaynak dosyalar önce nesne dosyalarına veya başka bir ara çıktıya dönüştürülebilir; ardından bağlayıcı, bu parçaları ve gerekli kütüphaneleri birleştirerek çalıştırılabilir bir dosya oluşturabilir. Kullanılan dilin ve araç zincirinin tasarımına göre süreç değişir. Aşağıdaki rehber, derleyicinin görevini bu ayrımları koruyarak açıklar.
Kaynak kod, hedef kod ve çalıştırılabilir dosya aynı şey değildir
Kaynak kod, programcının C, C++ veya başka bir dilin kurallarıyla yazdığı insan tarafından okunabilir metindir. Örneğin toplam = a + b ifadesi, programcının amacını açıklar; ancak işlemcinin bu ifadeyi doğrudan anlayabilmesi için hedef komutlara dönüştürülmesi gerekir.
Derleyicinin ürettiği sonuç her zaman doğrudan işlemcinin makine kodu olmak zorunda değildir. Bazı araç zincirleri işlemciye özgü makine kodu üretirken bazıları ara kod üretir. Java derleyicisinin ürettiği bytecode, Java Sanal Makinesi tarafından yürütülen ara bir biçime örnektir. Dolayısıyla derleyici = her zaman doğrudan 0 ve 1 üretir ifadesi aşırı basitleştirmedir.
Bir başka önemli ayrım da nesne dosyası ile çalıştırılabilir dosya arasındadır. Birden fazla kaynak dosya ayrı ayrı derlenip nesne dosyalarına dönüştürülebilir. Bağlayıcı (linker), sembolleri çözer ve statik kütüphaneleri çıktıya dahil edebilir; dinamik kütüphanelerde ise gerekli bağımlılıkları kaydederek bunların çalışma zamanında yüklenmesini sağlayabilir. Bu yüzden derleme hatası ile bağlama hatası aynı aşamada oluşmaz.
Kavramsal zincir şöyledir: kaynak kod → derleyici çıktısı → bağlama işlemi → çalıştırılabilir program. Her projede bu zincirin bütün basamakları aynı biçimde görünmeyebilir; kullanılan dil, işletim sistemi ve geliştirme araçları sonucu değiştirir.
Derleyicinin kodu işlerken izlediği dört kontrol noktası
Derleme süreci tek bir kontrolden oluşmaz. Ayrıntılar derleyiciye göre değişse de öğretim açısından dört aşama yararlıdır.
İlk aşama, karakter dizisinin anlamlı parçalara ayrılmasıdır. Buna sözcüksel analiz denir. sayi = 12 ifadesinde sayi, atama işareti ve 12 ayrı belirteçler olarak ele alınır. İkinci aşamada bu parçaların dilin sözdizimine uygun bir yapıda olup olmadığı incelenir. Eksik parantez veya yanlış yerleştirilmiş bir noktalı virgül gibi sorunlar burada ortaya çıkabilir.
Üçüncü aşama anlamsal kontroldür. Kod sözdizimi bakımından düzgün görünse bile tür uyumsuzluğu, tanımlanmamış değişken veya uygun olmayan fonksiyon çağrısı bulunabilir. Örneğin bir derleyici, sayı bekleyen bir işlemde metin türündeki değerin kullanılmasını dil kurallarına göre reddedebilir ya da dönüşüm gerektiren bir uyarı verebilir. Sonuç, dilin kurallarına ve derleyici seçeneklerine bağlıdır.
Dördüncü aşamada derleyici, iç gösterimi hedef koda dönüştürür ve uygun gördüğü iyileştirmeleri yapabilir. Optimizasyonun amacı performansı artırmak, kod boyutunu azaltmak veya bellek kullanımını düşürmek olabilir. Ancak optimizasyon, programın mantıksal sonucunu değiştirecek serbest bir yeniden yazım değildir; dilin gözlemlenebilir davranış kurallarına uyması gerekir. Optimizasyon düzeyi ve elde edilen sonuç kullanılan derleyiciye, seçeneklere ve hedef işlemciye bağlıdır.
Bu aşamalar, çalışma zamanında ortaya çıkan her hatayı yakalayamaz. Örneğin kod kurallara uygun olduğu hâlde dosya bulunamaması, sıfıra bölme veya yanlış kullanıcı girdisi gibi sorunlar program yürütülürken ortaya çıkabilir.
Derleme, bağlama ve çalıştırma hatalarını ayırma
Hatanın hangi aşamada oluştuğunu bilmek, çözüm yolunu doğrudan etkiler. Derleme hatası, kaynak kodun dil kurallarına veya derleyicinin beklediği tür ilişkilerine uymamasıyla ilgilidir. Eksik bir parantez, yanlış yazılmış anahtar sözcük veya tanımsız bir ad buna örnek olabilir. Bu durumda genellikle kaynak koddaki ilgili bölüm düzeltilmeden sonraki aşamaya geçilemez.
Bağlama hatası, kaynak dosyalar derlenmiş olsa bile programın ihtiyaç duyduğu sembolün veya kütüphane işlevinin birleştirme sırasında bulunamamasıyla ilişkilidir. Örneğin bir fonksiyonun bildirimi görüldüğü hâlde gerçek tanımı projeye eklenmemişse bağlayıcı, çağrının hedefini çözemeyebilir.
Çalışma zamanı hatası ise program oluşturulduktan sonra yürütme sırasında meydana gelir. Geçersiz bir bellek erişimi, dosyanın bulunamaması veya beklenmeyen bir girdinin işlenememesi bu sınıfa girebilir. Bunlar derleyicinin hiç kontrol edemeyeceği sorunlar değildir; bazıları uyarılar veya statik analiz araçlarıyla önceden yakalanabilir. Ancak derlenmiş olması, programın bütün girdiler için doğru davranacağını garanti etmez.
Mantık hatası daha da farklıdır: Program hata mesajı vermeden çalışır, fakat yanlış sonuç üretir. Bir döngünün sınırını bir eksik belirlemek veya toplam yerine çarpma yapmak bu duruma örnektir. Derleyici çoğu mantık hatasının programcının niyetine aykırı olduğunu bilemez. Bu nedenle test, hata ayıklama ve kod incelemesi derleme sürecinin yerine geçmez; onu tamamlar.
Derleyici ile yorumlayıcı farkı: hızdan önce çalışma modeline bakın
Derleyici ve yorumlayıcı, kaynak kodun yürütülmesini sağlayan farklı yaklaşımlardır; ancak bunları biri bütünüyle çevirir, diğeri her zaman satır satır çevirir diye kesin bir ikiliye indirgemek doğru değildir. Derleyici önceden bir hedef çıktı üretmeye odaklanır. Yorumlayıcı ise kaynak kodu veya ara gösterimi çalışma sırasında değerlendirip yürütür. Gerçek sistemlerde bu iki yaklaşım birlikte de kullanılabilir.
Derlenmiş hedef kod, çeviri işleminin çalışma anından önce yapılması sayesinde tekrar tekrar çalıştırılırken aynı çeviriyi yeniden gerektirmeyebilir. Bu, özellikle yürütme maliyetinin önemli olduğu uygulamalarda avantaj sağlayabilir. Buna karşılık toplam performans yalnızca derleyici kullanılıp kullanılmamasına bağlı değildir; algoritma, giriş verisi, donanım, bellek erişimi ve çalışma zamanı sistemi de etkilidir.
Yorumlayıcı yaklaşım, kaynak kodda değişiklik yapıp daha doğrudan deneme yapmayı kolaylaştırabilir. Ancak bu, yorumlayıcıyla çalışan her dilin yavaş veya derleyiciyle çalışan her dilin hızlı olduğu anlamına gelmez. Python ve JavaScript gibi diller farklı uygulamalarda yorumlama, bytecode ve çalışma anında derleme tekniklerini birlikte kullanabilir. Java da kaynak koddan bytecode üreterek sanal makine üzerinde çalışır. Bu nedenle karşılaştırma yapılırken dil adı yerine belirli çalışma ortamına ve kullanılan araç zincirine bakılmalıdır.
Ayrıntılı karşılaştırma için yorumlayıcı nedir yazısına, programlamanın daha geniş çerçevesi için programlama nedir yazısına geçilebilir.
Platform bağımlılığı, taşınabilirlik ve optimizasyonun sınırı
Bir kaynak kodun farklı işletim sistemlerinde veya işlemcilerde çalışabilmesi ile derleyici çıktısının taşınabilir olması aynı şey değildir. İşlemci komut seti, işletim sistemi arayüzleri, kütüphaneler ve derleyici seçenekleri farklı olabilir. Bu nedenle aynı kaynak kod çoğu zaman her hedef platform için yeniden derlenir veya platforma uygun başka bir çalışma ortamına ihtiyaç duyar.
Derleyici optimizasyonu da bu hedefe göre şekillenir. Hedef işlemcinin desteklediği talimatlar, bellek modeli ve derleme seçenekleri üretilen kodu etkileyebilir. -O gibi bir seçenek kullanılması tek başına belirli bir hız artışını garanti etmez; gerçek sonuç ölçümle değerlendirilmelidir. Ayrıca daha yüksek optimizasyon, hata ayıklama sırasında kaynak satırları ile makine talimatları arasındaki ilişkiyi daha karmaşık hâle getirebilir.
Derlenmiş dosyanın kaynak koddan daha zor okunması, kaynak kodun gizlendiği veya güvenliğin garanti edildiği anlamına gelmez. Tersine mühendislik, hata ayıklama sembolleri ve kullanılan platforma ilişkin araçlar çıktının incelenmesini mümkün kılabilir. Derleyicinin temel görevi kodu dönüştürmektir; gizlilik ve güvenlik için ayrıca erişim denetimi, güvenli tasarım, imzalama ve test gibi önlemler gerekir.
Bu ayrım sınav sorularında önemlidir: derleyici farklı platformlarda çalışmayı sağlar ifadesi ancak kaynak kodun ilgili platform için uygun biçimde derlenmesi veya taşınabilir bir ara çalışma ortamı kullanılması koşuluyla anlamlıdır.
Çözümlü örnekler: bir kod parçası hangi aşamada sorun çıkarır?
Örnek 1 — Derleme hatasını ayırt etme
Verilenler:
int sayi = 10;
int sonuc = sayi + ;
Çözüm adımları:
- İlk satırda
sayiadlı tamsayı değişkenine 10 değeri atanır. - İkinci satırda atama işaretinin sağında
sayi +ifadesi bulunur. - Toplama işlemi için
+işaretinin sağında bir ifade veya değer bulunması gerekir. - Operatörün eksik operandla bırakılması sözdizimsel yapıyı bozar.
- Bu nedenle sorun çalışma zamanında değil, derleme aşamasında bildirilir.
Sonuç: Program, bu satır düzeltilmeden derlenemez. Olası düzeltme int sonuc = sayi + 5; gibi eksik değeri tamamlamaktır. Buradaki temel ipucu, işlemcinin yanlış sonuç üretmesinden önce kodun dilbilgisi yapısının kurulamadığıdır.
Örnek 2 — Derleme ile çalışma zamanı sorununu ayırt etme
Verilenler:
int pay = 10;
int payda = 0;
int sonuc = pay / payda;
Çözüm adımları:
- Değişken bildirimleri ve atamalar, kullanılan dilin kurallarına uygunsa derleyici bu kodu sözdizimi bakımından kabul edebilir.
sonuchesaplanırken payda değeri 0'dır.- Tamsayı bölmesinde sıfıra bölme, matematiksel olarak tanımsız bir durumdur.
- Kullanılan dile göre sonuç değişir: Örneğin Java ve Python'da çalışma zamanı istisnası oluşur; JavaScript'te sayı türüyle yapılan bölmede
Infinityoluşabilir. C ve C++'ta tamsayı sıfıra bölme tanımsız davranıştır. Değer derleme zamanında kesin olarak biliniyorsa bazı diller veya derleyiciler derleme aşamasında da tanı koyabilir.
Sonuç: Kod derlendi demek, kod her girişte güvenle çalışır demek değildir. Sınav sorusunda hata türünü belirlemek için hatanın kaynak kod kurallarını mı, sembollerin bağlanmasını mı, yoksa yürütme anındaki değerleri mi ilgilendirdiğine bakılır.
Örnek 3 — Bağlama aşamasını ayırt etme
Verilenler: Bir dosyada yazdir(); çağrısı yapılmış, fakat bu fonksiyonun tanımı projeye eklenmemiştir.
Çözüm adımları:
- Çağrının yazımı dil kurallarına uygun olabilir.
- Derleyici, fonksiyon adını ve çağrı biçimini kabul edebilir.
- Program oluşturulurken bağlayıcı,
yazdirişlevinin gerçek kodunu arar. - Tanım veya gerekli kütüphane bulunamazsa sembol çözülemez.
Sonuç: Sorun sözdizimi değil, bağlama sürecindeki eksik tanım veya kütüphane bağlantısıdır.
Sık yapılan hatalar ve karıştırılan sınır durumları
-
Derleyici her zaman doğrudan makine kodu üretirdemek: Yanlıştır. Hedef çıktı makine kodu, nesne kodu veya bir ara gösterim olabilir. -
Derlenen programda hata kalmazdemek: Yanlıştır. Derleme; belirli sözdizimi, tür ve anlam kontrollerini yapar. Çalışma zamanı ve mantık hataları ayrıca test edilmelidir. -
Yorumlayıcı kodu kesinlikle satır satır çalıştırırdemek: Aşırı basitleştirmedir. Modern çalışma ortamlarında bytecode, önbellekleme ve çalışma anında derleme gibi karma modeller bulunabilir. -
Derleyici ile bağlayıcıyı aynı araç sanmak: Bazı geliştirme komutları ikisini tek komutla çalıştırabilir; görevleri yine farklıdır. Derleyici kaynak birimini dönüştürür, bağlayıcı farklı çıktıları ve kütüphaneleri birleştirir.
-
Sözdizimi hatası ile mantık hatasını karıştırmak: Eksik parantez derleme aşamasında yakalanabilir; yanlış hesaplama ise program başarıyla çalışsa bile fark edilmeyebilir.
-
Optimizasyonu otomatik hız garantisi saymak: Optimizasyon hedefi ve sonucu derleyici seçeneklerine, programa ve donanıma bağlıdır. Ölçüm yapılmadan belirli bir hız kazanımı söylenemez.
-
Derlenmiş çıktıyı güvenlik koruması kabul etmek: Çıktının okunması zorlaşabilir, fakat bu tek başına kaynak kodu veya algoritmayı gizlemez. Güvenlik ayrı bir tasarım konusudur.
-
Bir dilin tek bir çalışma yöntemi olduğunu düşünmek: Bir dilin farklı uygulamaları farklı derleyici, sanal makine veya çalışma zamanı teknikleri kullanabilir. Bu nedenle soruda verilen özel araç zincirinin tanımına öncelik verilmelidir.
Basitleştirilmiş süreç: kaynak kod → sözcüksel analiz → sözdizimi/anlam kontrolü → hedef veya ara kod → bağlama → çalıştırılabilir çıktı. Genel bir çalışma maliyeti sezgisi olarak toplam süre yazılabilir; bu eşitlik performans karşılaştırması için kesin bir model değil, aşamaları ayırmak için kullanılan basit bir gösterimdir.
Bir kafenin sipariş sistemi somut bir benzetme sunar: Garsonun mutfağa yazdığı sipariş kaynak koda, mutfağın kullandığı standart fiş biçimi hedef koda benzer. Sipariş formunda eksik ürün adı varsa bu derleme hatası gibidir; fişte yazan ürün stokta yoksa bağlama veya kaynak bulma sorunu oluşur; yemek hazırlanırken müşterinin alerjisi gibi özel bir durum ortaya çıkarsa bu çalışma zamanı kontrolüne benzer. Formun kabul edilmesi, yemeğin doğru hazırlanacağını tek başına garanti etmez; süreçteki sonraki kontroller de gerekir.
TYT/AYT bilişim veya programlama sorularında önce dönüşümün ne zaman yapıldığına bakın: program çalışmadan önce hedef çıktı üretme vurgusu derleyiciyi, çalışma sırasında değerlendirme vurgusu yorumlayıcı yaklaşımı işaret eder. Tek seferde, satır satır, çalıştırılabilir dosya, makine dili gibi ifadeleri tek başına yeterli saymayın; bytecode, sanal makine, bağlayıcı ve çalışma zamanı ayrıntıları verilmişse cevabı bu koşullara göre daraltın. Derleme hatası için kaynak kod kurallarına, bağlama hatası için eksik sembol veya kütüphaneye, çalışma zamanı hatası için yürütme anındaki değerlere odaklanın.
Sık sorulan sorular
Derleyici yalnızca C ve C++ gibi dillerde mi kullanılır?
Hayır. Derleyici kavramı, kaynak kodu başka bir hedef gösterime dönüştüren araçlar için kullanılır. Hedef doğrudan makine kodu olabileceği gibi Java bytecode gibi ara bir biçim de olabilir. Bir dilin çalışma modelini belirlemek için o dilin somut uygulamasına ve araç zincirine bakmak gerekir.
Derleme ile bağlama arasındaki fark nedir?
Derleme, kaynak dosyanın hedef veya ara koda dönüştürülmesidir. Bağlama ise farklı derlenmiş parçaları ve gereken kütüphaneleri birleştirerek dış sembolleri çözmeye çalışır. Bu nedenle kaynak kod kurallara uygun olsa bile bağlama aşamasında eksik fonksiyon veya kütüphane hatası oluşabilir.
Derleyici optimizasyonu neyi değiştirir?
Optimizasyon, programın kurallara göre gözlemlenebilir davranışını korumayı amaçlayarak hedef kodun hız, kod boyutu veya kaynak kullanımı bakımından iyileştirilmesini hedefler. Sonuç derleyiciye, seçeneklere, hedef işlemciye ve programa bağlıdır; belirli bir hız artışı garanti edilmez.
Derlenmiş kod neden her zaman yorumlanan koddan hızlı kabul edilmez?
Önceden hedef koda dönüştürme, çalışma anındaki çeviri maliyetini azaltabilir; ancak performans algoritmaya, veri miktarına, donanıma ve çalışma zamanı sistemine de bağlıdır. Ayrıca yorumlayıcı tabanlı sistemler de bytecode veya çalışma anında derleme kullanabilir. Bu nedenle karşılaştırma, genel etiketlerle değil belirli uygulamayla yapılmalıdır.
Bir programın derlenmesi onun doğru çalışacağını kanıtlar mı?
Hayır. Derleme, dil kurallarına ilişkin belirli hataları yakalar. Sıfıra bölme, eksik dosya, beklenmeyen kullanıcı girdisi ve yanlış algoritma gibi sorunlar çalışma zamanı veya mantık hatası olabilir. Programın doğruluğu için test ve hata ayıklama gerekir.
IDE ile derleyici aynı şey midir?
Hayır. IDE; kod yazma, proje yönetimi, hata ayıklama ve çalıştırma gibi araçları bir arada sunan geliştirme ortamıdır. İçinde bir derleyici bulunabilir veya harici bir derleyiciyle iletişim kurabilir. Derleyici ise kaynak kodu dönüştüren özel bileşendir.
- •Derleyici Nedir? (Tanım, Nasıl Çalışır) | Dahilibuiltin.com
- •Derleyici | Tanım ve Gerçeklerbritannica.com
- •DERLEYİCİ(COMPILER) VE YORUMLAYICI ...medium.com