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.
26.06.2015 tarihli yazı 22609 kez okunmuştur.
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 STOR komutları 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 işlemini anlamak için aşağıdaki şekle bakarsa:► Derleme (Compile)
► Çevirme (Assemble)
► Bağlama (Link)
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şlemcilerini 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!
Şekil 2: Preprocess öncesi
Şekil 3: Preprocess Sonrası
Kodlarımızı incelediğimizde #define PI 3.14 olarak sabitlenmiştir. Ön işlem yapıldıktan sonra her PI görüldüğünde artık PI yerine 3.14 olarak işlem yapılmaktadır.
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.
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.
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.
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.
Şimdi bir cevrehesapla.c programını düşünüp ön işleme kısmını ve sonrasını görelim
► .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.
Şimdi bir cevrehesapla.c programını düşünüp ön işleme kısmını ve sonrasını görelim
Şekil 2: Preprocess öncesi
Şekil 3: Preprocess Sonrası
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.
Kaynak:
►CompileOnline
►Wikipedia
►Codelab
YORUMLAR
Aktif etkinlik bulunmamaktadır.
- Dünyanın En Görkemli 10 Güneş Tarlası
- Dünyanın En Büyük 10 Makinesi
- 2020’nin En İyi 10 Kişisel Robotu
- Programlamaya Erken Yaşta Başlayan 7 Ünlü Bilgisayar Programcısı
- Üretimin Geleceğinde Etkili Olacak 10 Beceri
- Olağan Üstü Tasarıma Sahip 5 Köprü
- Dünyanın En İyi Bilim ve Teknoloji Müzeleri
- En İyi 5 Tıbbi Robot
- Dünyanın En Zengin 10 Mühendisi
- Üretim için 6 Fabrikasyon İşlemi
- DrivePro Yaşam Döngüsü Hizmetleri
- Batarya Testinin Temelleri
- Enerji Yönetiminde Ölçümün Rolü: Verimliliğe Giden Yol
- HVAC Sistemlerinde Kullanılan EC Fan, Sürücü ve EC+ Fan Teknolojisi
- Su İşleme, Dağıtım ve Atık Su Yönetim Tesislerinde Sürücü Kullanımı
- Röle ve Trafo Merkezi Testlerinin Temelleri | Webinar
- Chint Elektrik Temel DIN Ray Ürünleri Tanıtımı
- Sigma Termik Manyetik Şalterler ile Elektrik Devrelerinde Koruma
- Elektrik Panoları ve Üretim Teknikleri
- Teknik Servis | Megger Türkiye
ANKET