Yazdığımız Kodlar Nasıl Çalışır? Derleyici Teorisine Kısa Bir Bakış

Yazdığımız Kodlar Nasıl Çalışır? Derleyici Teorisine Kısa Bir Bakış

Herkese uzun bir aradan sonra merhaba. Bu yazıda yazdığımız kodları bilgisayarda çalıştırmak için geçtiği aşamları çok derine inmeden açıklamaya çalışacağım. Okuyacağınız adımlar aslında epey uzun teorisi olduğundan eğer anlamadığınız bir yer olursa yorumlara yazabilir ya da internette araştırma yaparak kolayca ulaşabilirsiniz. Benim bu konuları öğrenirken temel kitabım Prof.Dr. Nejat Yumuşak hocamızın programlama dilleri prensipleridir.

Temeller:

Programlama dilleri tıpkı günlük konuşma dilleri gibi bazı yapı ve kurallara sahiptirler. Örneğin Türkçe dilinde en küçük yapı harftir. Harfler belli kurallar çerçevesinde kelimeleri oluştururlar kelimelerde cümleleri. Mesela Türkçe’de W harfi bulunmaz yani bu harfle ne kelime ne de cümle üretilebilir. Kod derlemeyi 2 aşamada(front-end & back-end) ele alırsak aslında front-end aşaması temel anlamda cümle yapıları ile uğraşır.

1-Lexical Analiz

Token: Kelime ya da harfin bulunduğu grup:

Örneğin:

  • a->harf
  • 1->sayı
  • if->karar yapısı

Bu aşamada hedefimiz kodu alıp token dizisi oluşturmaktır. Örnek kodumuz şöyle;
int a;
a = a + 2;

Analiz ise şöyledir:

int token_int

a token_identifier

; token_special

a token_identifier

= token_assign

a token_identifier

+ token_operator

2 token_int_constant

; token_special

Göreceğiniz gibi her bir parçayı tokenlerine ayırdık. Bu tokenlar bize ileride lazım olacak. Eğer her zaman yukarıda ki gibi başarılı olamadıysak muhtemelen o karakter o dilde mevcut değildir.  Bu aşamada biraz düşünüldüğünde çok fazla olasılık ve ihtimal olduğundan uzun kod parçalarını elle ayıklamak hayli zor olacaktır. Bu problemin çözümünde ise sonlu durum makinaları denilen yapılar kullanılır.

2-Semantik Analiz

Bu aşamda oluşturduğumuz tokenlerin o dilde ki ifadelere göre doğru yazılıp yazılmadığını kontrol ediyoruz. Yani tokenleri yan yana getirerek cümle kuruyoruz.. Bu aşamada kullanılan metod ayrıştırma ağacı kullanmaktır.

EECS665 – Compiler Construction – Drew Davidson

3-Syntax Analiz

2.aşamada oluşturduğumuz ayrıştırma ağacı o dilde anlamlı bir cümle kurulabiliyor mu sorusunun yanıtını arıyoruz. Bu aşamada SDT ve LDT gibi metodlar kullanılır.

4-Ara Kod Üretimi

Şimdiye kadar yapılan tüm testlerden hakkıyla geçtikten sonra ara kod üretilir. Bu kod üzerinde çalışacağı platforma özel koddur assambly değildir. Mesela java programlama dili için .class uzantılı dosyalar bu aşamada oluşturulur.

5-Kod Optimizasyonu

Bu aşama benimde çok az bilgi sahibi olduğum aşama. Kısaca kodlarda en çok çalışan kısımları tespit edip bu kısımları optimize edilmektedir. Dileyen jvm nin bu olayı nasıl çözdüğünü araştırabilir.

6-Assembly Diline Çevrim

Assembly işlemci üzerinde çalışan programlama dilidir. Bu aşamada ara kod assembly koduna çevrilir. Bundan sonra doğrudan 0 ve 1 lere çevrilir ancak bu ara aşamada bizim projemize import ettiğimiz yani dışarıdan kullanıdığım kodlar olabilir. Örneğin java da Scanner sınıfı. İşte bu kodlar da bizim ana kodumuza linker(bağlanır) ve çalıştırılmak üzere hazır edilir(loader).

Do "compiler" and "assembler" correspond to frontend and backend phases of a compiler? - Computer Science Stack Exchange

Bundan sonrası bilgisayar mimarisine girdiğinde daha fazla aşağılara inmeye gerek yok.

İyi Kodlamalar.

1 Comment

Bir Cevap Yazın