Derleyici ve Yorumlayıcı: Kaynak Kod Nasıl Çalışır Hâle Gelir
Sözlük

Derleyici ve Yorumlayıcı: Kaynak Kod Nasıl Çalışır Hâle Gelir

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 4 dk okuma

Derleyici (compiler) ve yorumlayıcı (interpreter) kavramlarının ne olduğunu, nasıl çalıştığını, farklarını ve JIT gibi karma yaklaşımları örnekle öğrenin.

Derleyici ve yorumlayıcı nedir?

Programlama dilinde yazılan kaynak kodu, bilgisayarın doğrudan çalıştıramayacağı insan okunur bir metindir. Bu metni çalıştırılabilir hâle getirmenin temel yolları derleme ve yorumlamadır.

Derleyici (compiler), kaynak kodun tamamını çalışmadan önce okur ve hedef biçime çevirir. Hedef, işlemcinin doğrudan anladığı makine kodu olabileceği gibi bir sanal makinenin anladığı bayt kodu da olabilir. Çeviri bir kez yapılır, sonra üretilen çıktı çalıştırılır.

Yorumlayıcı (interpreter), kaynak kodu okur ve çalışırken, ifade ifade ya da komut komut yürütür. Ayrı bir çıktı dosyası üretmesi gerekmez. Kod her çalıştırıldığında yorumlayıcı tarafından yeniden okunur ve işlenir.

Bir derleyici hangi aşamalardan geçer?

Derleyiciler dil işleme hattı denen sıralı aşamalarla çalışır:

  • Sözcüksel analiz: kaynak metin, anlamlı parçalara (belirteçlere) ayrılır. Anahtar sözcükler, değişken adları, sayılar ve işleçler birbirinden ayrılır.
  • Ayrıştırma (parsing): belirteçler dilin dilbilgisi kurallarına göre incelenir ve yapıya dönüştürülür. Sonuç genellikle soyut sözdizim ağacıdır (AST); ifadelerin ve komutların iç içe yapısını temsil eder.
  • Semantik analiz: ağacın anlamsal olarak doğru olup olmadığı denetlenir. Tanımlanmamış değişken kullanımı ya da uyumsuz tip kullanımı burada yakalanır.
  • Ara temsil ve optimizasyon: kod, hedeften bağımsız bir ara biçime çevrilir ve daha verimli hâle getirilir.
  • Kod üretimi: hedef makine koduna ya da bayt koduna dönüşüm yapılır.

Hata yönetimi bu aşamaların hepsine yayılır: iyi bir derleyici, hatayı bulmakla kalmaz, hatanın yerini ve nedenini anlaşılır biçimde bildirir.

Yorumlayıcı nasıl çalışır?

Yorumlayıcının işlevi, kaynak kodu yürütmektir. En basit biçimde yorumlayıcı da önce kaynağı belirteçlere ayırır ve soyut sözdizim ağacını kurar; ardından bu ağacı dolaşarak her düğümü çalıştırır. Bir toplama düğümü gelince alt düğümlerin değerlerini hesaplar ve toplar.

Daha gelişmiş yorumlayıcılar önce kaynağı bayt koduna çevirir, sonra bir sanal makine bu bayt kodunu adım adım yürütür. Bu yaklaşım ağaç dolaşmaktan genelde daha hızlıdır. Değerlendirme ve çalışma zamanı kısmı, yani değişkenlerin ortamda tutulması, fonksiyon çağrılarının yürütülmesi ve bellek yönetimi, yorumlayıcının merkezindeki işlerdir.

Derleyici ve yorumlayıcı arasındaki farklar

Ölçüt: Çalışma zamanı. Derleyici: önce çevirir, sonra çıktıyı çalıştırır. Yorumlayıcı: kaynağı çalışırken işler.

Ölçüt: Hız. Derleyici: derlenmiş kod genellikle daha hızlı çalışır, çünkü çeviri ve optimizasyon önceden yapılmıştır. Yorumlayıcı: her çalıştırmada ek yük bulunur.

Ölçüt: Hata yakalama. Derleyici: birçok hata çalıştırmadan önce, derleme sırasında yakalanır. Yorumlayıcı: bazı hatalar yalnızca o satır çalıştığında ortaya çıkar.

Ölçüt: Geliştirme döngüsü. Derleyici: değişiklik sonrası yeniden derleme gerekir. Yorumlayıcı: kodu değiştirip hemen çalıştırmak ve etkileşimli denemek kolaydır.

Ölçüt: Taşınabilirlik. Derleyici: makine kodu hedef işlemciye özgüdür; farklı platform için yeniden derlenir. Yorumlayıcı: aynı kaynak, yorumlayıcının bulunduğu her platformda çalışır.

Bu ayrım kabaca doğrudur ama gerçekte sınırlar bulanıktır.

Gerçekte birçok sistem karmadır: bayt kodu ve JIT

Bir dilin kendisi derlemeli ya da yorumlamalı değildir; bu, dilin uygulamasının özelliğidir. Aynı dil için hem derleyici hem yorumlayıcı yazılabilir.

Java kaynak kodu bayt koduna derlenir, Java sanal makinesi bu bayt kodunu çalıştırır. Python kaynağı önce bayt koduna çevirir, ardından sanal makine yürütür; yani yorumlayıcı da bir derleme adımı içerir. JavaScript motorları ise çalışırken sık çalışan kod parçalarını makine koduna çeviren JIT (tam zamanında derleme) tekniğini kullanır. Böylece yorumlayıcının esnekliği, derlemenin hızıyla birleştirilir. Go ve Rust gibi dillerde ise kod doğrudan makine koduna derlenir.

Örneğin x artı y ifadesi için derleyici, bu ifadeyi önce belirteçlere ayırır, ağaç kurar, tiplerin uyumunu denetler ve toplama komutunu üretir. Yorumlayıcı aynı ifade için ağacı dolaşır ve toplamı o anda hesaplar. Sonuç aynıdır, fark işin ne zaman ve nasıl yapıldığındadır.

Yaygın yanlışlar ve Mindset bağlamı

Yaygın yanlışlar: • "Yorumlayıcı her zaman yavaştır." JIT ve bayt kodu sayesinde fark küçülebilir; performansı belirleyen çok sayıda etken vardır. • "Python yorumlanan, Java derlenen bir dildir." Her ikisi de bayt kodu ve sanal makine kullanır; ayrım yüzeysel bir basitleştirmedir. • "Derleyici sadece makine koduna çevirir." Derleyiciler bir dili başka bir dile de çevirebilir; JavaScript'e derlenen diller bunun örneğidir. • Derleme hatası ile çalışma zamanı hatasını karıştırmak. Birincisi kod çalışmadan önce yakalanır, ikincisi çalışırken ortaya çıkar.

Mindset kataloğundaki Derleyici ve Yorumlayıcı Tasarımı Temelleri eğitiminin modül başlıkları şunlardır: dil işleme hattına genel bakış, sözcüksel analiz, dilbilgisi ve ayrıştırma, soyut sözdizim ağacı ve hata yönetimi, semantik analiz ve tip denetimi, değerlendirme ve çalışma zamanı.

İlgili Mindset programı

Derleyici ve Yorumlayıcı Tasarımı Temelleri

Sık sorulanlar

Sık sorulan sorular

Python derlemeli mi yorumlamalı mı?

Python kaynak kodu önce bayt koduna çevrilir, sonra Python sanal makinesi bu bayt kodunu yürütür. Bu nedenle genelde yorumlanan bir dil olarak anılsa da bir derleme adımı içerir. Dil ile uygulama farklı kavramlardır; Python için farklı uygulamalar da bulunur.

JIT derleyici nedir?

JIT, tam zamanında derleme anlamına gelir. Program çalışırken sık kullanılan kod parçaları tespit edilir ve makine koduna çevrilir. Böylece yorumlayıcının esnekliği ile derlemenin hızı birleştirilir. Java sanal makinesi ve JavaScript motorlarında yaygın olarak kullanılan bir tekniktir.

Derlenen kod neden daha hızlıdır?

Derleme sırasında kodun tamamı görülebildiği için optimizasyon yapılabilir ve çeviri maliyeti çalıştırmadan önce ödenir. Yorumlayıcıda ise her çalıştırmada okuma ve çözümleme yükü olur. Yine de modern yorumlayıcıların JIT gibi teknikleri bu farkı azaltabilir.

Kendi programlama dilini yazmak için neleri öğrenmek gerekir?

Sözcüksel analiz, dilbilgisi ve ayrıştırma, soyut sözdizim ağacı, semantik analiz ve tip denetimi, değerlendirme ve çalışma zamanı konuları temeldir. Küçük bir ifade hesaplayıcısından başlayıp değişkenler, koşullar ve fonksiyonlarla genişletmek yaygın öğrenme yoludur.

Derleyici ve Yorumlayıcı Nedir? Aralarındaki Fark