Bir Fincan Kahve ve Programlama-1

C dili aslında fikir olarak BCPL ve B dillerinin bazı eksikliklerinden ilham alınarak geliştirilmiş bir dildir. Bir çok yerden okuduğum kadarıyla C dilinin BCPL ve B dilinden en büyük farkı C dilinde çeşitli veri türlerinin tanımlanabiliyor olmasıymış. C dili yayınlandıktan sonra bakmışlar ki oldukça güzel bir dil. Biz neden unix sistemleri bu dilde yazmıyoruz demişler ve unix işletim sistemlerini C ile yazmaya karar vermişler. Durum hala da böyle olunca C dili hiç bir zaman popülerliğini kaybetmemiş.

C dilini bu kadar kullanışlı yapan şey işletim sistemlerinde oluşabilecek her probleme uygun çözümler sunulabilmesi ve diğer eski dillerin eksikliklerinin bu dilde giderilmiş olmasından kaynaklanıyor. Bu yüzden bir çok donanıma uygun derleyicilerinin olması popülerliğini daha da arttırmış. Ve dil, ANSI standartları ile standartlaştırıldığından her yerde aynı standart kütüphaneleri içeriyor olması bu dili programcılara daha cazip hale getirmiş.

Aslında yazılım, temel düzeyde tamamen donanıma bağımlıdır. Assembly dili gibi makine diline oldukça yakın bir dil hiç kullandınız mı bilmiyorum ama kullananlar bilirler, Assembly dilinin komut setleri, mikro işlemci mimarisiyle beraber geldiğinden, her mikro işlemcinin çok büyük bir oranda farklı Assembly komut setleri vardır. Yani eğer intel x86 mimaride bir Assembly programı yazdıysanız, yazdığınız programın komut setleri, ARM işlemciler için çoğunlukla farklıdır. Bu yüzden bu programı tamamen bir de ARM için yazmanız gerekiyor. Bu durum tabiki oldukça büyük zaman kaybı ve iş yükü demektir. Fakat C dili gibi Assembly dilinin bir üst katmanında bulunan diller standartlaştırıldığından her mikro işlemci mimarisi için aynı C komutları ve standart C kütüphaneleri mevcuttur. Bu yüzden farklı işlemci ve makinalar için programınızı komple baştan yazmanıza gerek kalmaz. Burada yapacağınız tek şey derleyicinizi değiştirmek olacak. Yazdığınız C kodlarını hangi işlemcide çalıştıracaksanız o işlemciye ait C kütüphanelerini ve derleyicisini temin edip programınızı derlemeniz sizi onca işyükü ve zaman kaybından kurtarır. Bu yüzden Unix işletim sistemleri Assembly yerine C de yazılmıştır. C bu anlamda oldukça kullanışlı ve her cihaza entegre olabilen bir dil olduğundan bu dilde yazılan işletim sistemleri de bir çok farklı işlemci ve cihaz için farklı şekilde derlenebilir ya da sistem kodlarına farklı donanım özellikleri entegre edilebilir.

Aslında buradan anlaşıldığı kadarıyla bir C programını derlemek için tek ihtiyacımız olan şey, programınızı çalıştırdığınız cihaza göre hazırlanmış C kütüphaneleri ve bu cihazın işlemci mimarisine uygun bir C derleyicisi. Bunun adı aynı zamanda “toolchain” olarak biliniyor

Bir C/C++ programı kaba taslak dört aşamada derleniyor. Bunlar, Preprocessing(Önişleme), compilation(derleme), assembly(montaj) ve linking(bağlama) aşamalarından oluşuyor.

Preprocessing;

Bu adımda “#” işareti ile başlayan ön işlemci komutları okunup işlenir. Bu komutlar, kendi şematiği ve sözdizimi ile basit bir mocro dilidir. Genellikle programdaki tekrarları azaltmak ve programın fonksiyonalitesini arttırmak ve bazı kod bloklarının koşullu olarak derlenmesini sağlamak için kullanılırlar. Aslında bu macro dili, C programcıları tarafından çok fazlaca kullanılır.

Tüm komutlar işlenmeden önce önişlemci bazı yapılandırma işlemleri yapar. Bu işlemlere yorum satırlarının derlenecek kaynak  kodlarından ayırılmasıda dahildir.

Compilation;

Bu aşamada, önişlemden geçen kaynak kodları, hangi işlemci mimarisi için derleniyorsa o işlemci imarisine ait Assembly Komut setlerine çevrilir. Bu adım aslında C kodunun içerisinde Assembly komutları kullanabilme olanağı sunar. Bazı derleyiciler C kodu arasına Assembly kodunun entegre edilmesini destekler.

Assembly;

Bu adımda ise Assembly komut setine çevrilen C kodları, makine diline ya da obje kodu dediğimiz dosyaya çevrilir. Bu adımdan sonra direk olarak istenilen işlemciyi çalıştırmak için gerekli kodlar üretilmiştir. Mesela derlediğiniz kaynak konuzun ismi “main.c” ise bu dosya bu adımdan sonra “main.o” yani obje dosyasına çevrilir. Bu obje dosyasının içeriği ikilik tabandaki sayılardan oluşur.

Linking;

Makine diline çevrilip obje dosyasına yazılan ikilik tabandaki işlemci komutları, parça parça dosyalara yazıldığından halen bir bütün değildir. Yani “main.c” ve “another.c” isminde ve birbirinin devamı kodları içeren iki dosya derlendiğinde iki farklı obje dosyası oluşur. Bu aşamada bu dosyaların birbirine bağlanması ve bir bütün şekilde çalışması sağlanır. Ya da şu şekilde açalım; “Hello World” yazan bir program yazdığınızda, linker bu aşamada, stdio kütüphanesindeki, printf fonksiyonunun obje kodunu alıp bizim obje kodumuzla link eder. Bu sayede çalıştırılabilir bir program elde edilmiş olur.

Yusuf

Yusuf

Bir Mühendis.

Önerilen makaleler

1 Yorum

  1. Avatar

    bazı web sayfalarında yorum bölümleri var bu çok iyi
    1990 lara kadar yüksek öğrenim kurumlarında genelde asm programları anlatılırdı , bu bence C dilinden çok daha iyi , assembler ile oluşturulmuş projeler C ye göre daha az
    aslında C programınada çok yüksek seviyeli bir dil diyemeyiz C de 50 satır sürerse asm de 100 satır
    bu bir örnektir , gerçi bu programına göre değişir , matamatiksel hesaplama programlarını düşünürsek C diyebiliriz , fakat C programını ve dosya atamalarını herkes öğrenemez farklı yorumlarda var asm yi herkes öğrenemez diyenlerde var , burdan çıkan sonuç herşey kişilerle ilgili bu durumda C kadar asm programlarıda anlatılmalı , hiç olmazsa asm dosyası (analog – usart – rtc vs… aynı ve ayrı dosyalarda bölümler halinde STM32 IAR – KEIL de örnekler verilsin…

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Translate »