C Derleyicisi ve Çalışma Prensibi
Derleyici yani compiler olarak bilinen
yapı, yazılan programın kaynak kodunu okuyarak içerisinde yazınsal hatalar ve
mantık hataları olup olmadığını, eğer hatalar var ise programcıya bunu
göstererek düzeltilmesini sağlayan ya da hata yoksa kaynak kodunu makine diline
çeviren bir yazılımdır. Bu yazımızda derleyicilerin yaptığı işleri inceledik ve
sizler için hazırladık.
Derleyici Nedir?
Herhangi bir programlama dilinde
yazılmış olan kaynak kodunu makine koduna çevirebilen yazılımdır. Bunun amacı
ise çalışabilir bir yazılım elde etmektir. Bir örnekle olayı açıklayalım.
0001 01 00 00000000
0011 01 10 00000010
0010 01 00 00000100
---- -- -- ---------
| | | |_________bellek adresi
| | |____________işaret
| |______________sicil
|_________________komut
Burada çevirinin amacı, programcının anladığı kaynak kodundan, işlemcinin dili olan ve anlayabildiği 0 ve 1 den oluşan makine diline çevirebilmektir. (LOAD,ADD ve STORkomutları 0001, 0011 ve 0010 olarak yorumlanır).
C Derleyicisinin Yaptığı İşler
C derleyicisi birden fazla bileşene sahiptir. Derleme
işlemi, bileşenlerin yaptığı işlerden biri olmasına rağmen kütüphanede tüm
yapılan işlerin ismi derleme yani compile olarak adlandırılmaktadır. C
derleyicisini incelediğimizde 4 tane görevi olduğunu görüyoruz:
► Ön İşlem (Preprocess)
► Derleme (Compile)
► Çevirme (Assemble)
► Bağlama (Link)
► Derleme (Compile)
► Çevirme (Assemble)
► Bağlama (Link)
Derleme işlemini anlamak için aşağıdaki
şekle bakarsa:
Hello.c adlı
kaynağımızın olduğunu varsayalım. İlk olarak yazdığımız program ön işlem işini
yapan preprocessor yani ön işlemciye girdirilir. Bundan sonra kodun içinde #
işaretiyle başlayan ön işlemci direktifleri yorumlanır. Hemen bir örnek
verelim:
#define Pİ 3
Bunun sayesinde bir Pİ sabiti
tanımladık ve 3 değerini bu sabite atamış olduk. Derleyici bundan
sonra programda her gördüğü Pİ sabiti yerine 3 değerini
girecektir. Artık sıra compiler dediğimiz derleyicilerde. Bunun görevi ise ön
işlemci tarafından işlenmiş kaynak dosyasındaki, C deyimlerini kodun
çalışacağı mikro işlemcinin kavrayabileceği Assembly diline dönüştürmektir.
Her işlemci farklı Assembly dilini kullanır. Intel işlemciler için derleyicinin
ürettiği Assembly ile Motorola işlemcileri için üretilen aynı değildir.(
Machintosh’lar Motorola işlemcilerin
kullanıyordu.)
Derleme işleminden sonra hello.s adlı
bir dosya oluşmaktadır. Assembly dosyasıda denilebilir. Burada C dilinde
yazılmış Assembly diline dönüştürülmüş hali vardır. Derleme
işlemi sonrasında oluşan hello.s dosyası Assembler (çevirici) adı verilen bileşene sokulur. Bu
bileşen Assembly dilinde yazılmış 0 ve 1’ lerden oluşan makine
diline çevirir. Bu koda nesne kodu denir ve hello.0 adı
verilen dosyaya kaydedilir.
Dosya oluşturmadan önceki son aşama
bağlama (link) aşamasıdır. Bu kısım bağlayıcı adı verilen bir bileşen
tarafından gerçekleştirilir. Bir C programı birden fazla .c
uzantılı kaynak dosyadan oluşabilir. Derleme ve çevirme işlemleri
sonrası her bir kaynak için .o uzantılı kodu dosyası oluşmaktadır. Son
olarak bağlama aşaması da tamamlandığında executable(çalıştırılabilir)
dosyamız oluşmaktadır. Hello.exe artık karşımızda!
1) Ön İşlem
Gcc derleyicisi dahili olarak ön işlemci
barındırmaktadır. C ön işlemcisinin yaptığı 3 görev vardır.
► .c uzantılı kaynak dosyasını inlemek ayrıca bu dosyadan yorumları kaldırmak
► # ile başlayan ön işlemci komutlarını yorumlayarak kaynak dosyasına entegre yapabilmek.
► Bildiğimiz #include ile başlayan kütüphane dosyalarını entegre etmek.
► .c uzantılı kaynak dosyasını inlemek ayrıca bu dosyadan yorumları kaldırmak
► # ile başlayan ön işlemci komutlarını yorumlayarak kaynak dosyasına entegre yapabilmek.
► Bildiğimiz #include ile başlayan kütüphane dosyalarını entegre etmek.
2) Derleme
Derleyicinin asıl olarak iş yaptığı kısımdır. C programlama dilini kullanarak yazdığımız kodları, ilk önce derleme yapılan bilgisayarın mikroişlemcisinin Assembly diline çevirmektir. Çeviri olduktan sonra Assembler yardımıyla uygulamalar rahatlıkla 0 ve 1’lerden oluşan makine diline çevirilir. Derleme sonrasında Assembly kodu işlemciye göre farklılık gösterir. Bunun nedeni ise her işlemcinin kendine özgü Assembly dili vardır.
3) Çevirme
Bu kısımda ise derlemeden sonra .s uzantılı dosyayı Assembler adı verilen bileşene sokulur. Assembly dilindeki kodu 0 ve 1’lerden oluşan makine koduna çevirir ve bu koda nesne kodu adı verilir.
4) Bağlama
Son aşamamız olan bağlama dosya oluşmadan önceki son aşamadır. Bir C programı, birden fazla .c uzantılı kaynak dosyadan oluşabilmektedir. Derleme ve çevirme adımlarından sonra her bir kaynak dosya için .o uzantılı nesne kodu dosyası oluşur. Bağlayıcı bileşenin yaptığı iş .o uzantılı nesne kodlarını ve programda kullanılan kütüphane dosyalarındaki kodlarla sentezleyerek tek bir çalışabilir dosya oluşturmaktır. Printf fonksiyonunu düşünürsek kütüphane fonksiyonu olduğunu bilmekle beraber bu fonksiyonu kullanılan programlar derleme işleminden sonra, printf fonksiyonunun bulunduğu kütüphane dosyası olan stdio.h(standart input output) kütüphanesiyle birleştirilmelidir. Bağlayıcı sonrası çalıştırılabilir dosyalar Windows işletim sistemi için .exe olarak Linux için ise .out uzantılı olurlar.
Yorumlar
Yorum Gönder