Merhabalar… Bugünkü yazımızda C programlama dilini incelemeye çalışacağız. C programlama dili birçok konu başlığına ve detaylı bir yapıya sahip. Okunabilirliği ve anlam verimliliğini sağlamak için birkaç makale ile konuyu sizlere aktarma düşüncesindeyim.
Özellikle bilgisayar bilimleri ve programlama ile haşır neşir olan kişilerin oldukça aşina olduğu C programlama dili, başlangıç aşamasında öğrenilmesi çokça tavsiye edilen dillerden biridir. Bu durumun gerekçelerine değinmeden önce C programlama dilinin ve diğer dillerin işlevleri, tarihçeleri hakkında kısa bilgi almak için Programlama Dilleri başlıklı yazımı okumanızı tavsiye ederim.
C dilini anlatacağımız makale dizisinin başlangıcı olan yazımıza C programlama dilinin avantajlarından bahsederek başlayalım.
C Programlama Dilinin Avantajları
Ortaya çıkışı üzerinden uzun yıllar geçmiş olmasına rağmen C programlama dili, günümüzde hala popülerliğini sürdürüyor. Yaygın olarak kullanılmasının birçok sebebi var. Başlıca sebepler olarak C dilinin verimli bir dil olması ve programlamacıya dil kontrolü sağlaması gösterilebilir. Bunun yanında C dilinin kendisinden sonra ortaya çıkan C++, Java ve Python gibi diğer birçok dilin geliştirilmesinde kullanılmış olması programlama dünyasında yaygın olarak bilinmesini ve kullanılmasını sağladı.
C programlama dili, mikrodenetleyicilerin programlanmasında, masaüstü programlarının geliştirilmesinde, işletim sistemlerinin üretiminde ve daha birçok platformda kullanılabilir. Bunun yanında C programlama dili orta seviyeli bir dil olduğu için üretilen kodların rahatlıkla okunabilmesine olanak sağlar.
Başlangıçta kod yazımında bir miktar zorlanılsa da ilerleyen zamanlarda C dilinin programlamacıya, yapısı itibariyle özgür ve esnek bir yazılım ortamı sağladığı fark edilecektir. Bu durumun sebebi ise C dilinin çok yönlülüğü ve minimum komutlarla maksimum kontrolü sağlamasıdır.
C programlama dilinde kod yazmak kısa zaman içinde kolaylaşır çünkü genel olarak aşina olduğumuz İngilizce temel komutlar kullanılır. C dilinin bilgisayar tarafından anlaşılabilmesi için belli başlı derleyiciler kullanılır. C dilini LİNUX, UNİX ve MAC OS X gibi işletim sistemlerinde çalıştırabilen birden fazla ve derleyiciye ücretsiz olarak ulaşabilirsiniz. Eclipse, DEV C++, CodeBlocks, Visual Studio günümüzde popüler olarak kullanılan derleyicilere örnek gösterilebilir.
C Programlama Dilinin İçeriği
C dilinin işlevini basit olarak şu şekilde tanımlayabiliriz: “Bilgisayar yoluyla çözmek istediğimiz bir problemi, bilgisayarın anlayacağı dile (1-0) dönüştürmek yani problemi bilgisayara, bilgisayarın dilinde anlatabilmek için kullandığımız tercüman.” Bu tanımdaki tercüman C dilidir. Kullandığımız dil yoluyla işlemciye, Web tarayıcısına ya da diğer bilgisayar bileşenlerine komut verebilir, böylece yapmak istediğimiz işlemleri gerçekleştirebiliriz.
C dili 1970’lerin başında Bell Laboratuvarına geliştirildi. İlk olarak Ken Thompson ve Dennis Ritchie’nin çalışmalarında kullanıldı. O yıllarda programcılar UNIX işletim sistemi ile yaptıkları çalışmalardan daha iyi verim alabilmek için daha kullanışlı talimatlar sistemine yani programlama diline ihtiyaç duyuyorlardı. Doğrudan doğruya bir bilgisayarın donanımına bağlı derleyiciler hata ayıklamak için uzun bir zamana ihtiyaç duyuyordu ve kullanımı da zordu.
Thompson’ın yüksek seviyeli bir dil üretmek için yaptığı ilk girişim, BCPL sistem programlama dilini desteklemesi amacıyla ürettiği B diliydi. Bell Laboratuvarı, PDP-11 model bir UNIX sistemi tedarik ettikten sonra iyi bir programlama diline ihtiyaçları daha da arttı. Dolayısıyla Thopmson, ihtiyacı giderebilmek için B dilini elden geçirerek C dilini üretti (1972). 1973 yılına gelindiğinde C dili artık UNIX sistemini yeniden yazabilecek kadar yenilikçi, istikrarlı ve kullanışlı durumdaydı.

Diğer taraftan C dili, Bell Laboratuvarının dışında etkili bir şekilde kullanılabilirdi. Bunun içinse diğer kullanıcıların C dilinin ayrıntılarına dair bilgi edinmesi gerekiyordu. Dolayısıyla C dilinin nasıl kullanılacağını açıklayan bir kaynağa ihtiyaç olduğu kararına varıldı.
Bunun ardından 1978 yılında, Brian Kernighan ve Dennis Ritchie’nin birlikte hazırladığı “C Programlama Dili” adlı kitap yayımlandı ve C programlaması için programlamacıların kullanacağı muhteşem bir kaynak oldu. C programcıları tarafından “Beyaz Kitap” ve “K&R” olarak adlandırılan bu kitap, C dilinin kutsal kitabı olarak da bilinmektedir.
Programlamacıların C dilini kullanırken kendi isteklerine göre yazım türleri geliştirmeleri istenen bir şey değildi. Bu durum düzensizliğe ve programlamacıların birbirleri arasında kurdukları iletişimde kopukluğa ve anlaşılmazlığa sebep olabilirdi. Bu nedenle 1980’li yıllarda C dilinin standartlarını belirlemek için çalışmalar yapıldı.
Amerikan Ulusal Standartlar Enstitüsü (ANSI) tarafında C için oluşturulan X3.159-1989 kodlu standart, 1989 yılında kabul edildi ve resmîleşti. Bunu ISO / IEC 9899: 1990 koduyla C dilinin standartlarını kabul eden Uluslararası Standardizasyon Örgütü (ISO) takip etti. Bu gibi standartların ve yenilemelerin bir arada olduğu bilgileri “ANSI C” ve “ISO C” olarak adlandırılan C89’da inceleyebilirsiniz.
C dilinin UNIX geliştirmelerinde kullanımı 1980’li yıllarda işletim sistemlerinin yaygınlaşmasında oldukça etkili oldu ve bu sadece başlangıçtı.
Daha sonrasında C dili, kurumsal ya da bireysel birçok alanda kullanıldı fakat programcılar tarafından zamanla zahmetli olduğu düşünüldüğü için birtakım yeni geliştirmelere gidildi. Bu gelişmeler sonucunda diğer yazılarımızda yer vereceğimiz C++ ve Java gibi programlama dilleri ortaya çıktı. C hakkında genel bir bilgi verdikten sonra biraz da C dilinin çalışma sistemi üzerine konuşabiliriz.
C Kodunu Düzenleme ve Derleme İşlemi
C programlama dilinde hazırlanan bir kodun çalıştırılabilmesi için IDE dediğimiz derleyicilerin kullanılması gerekir. Derleyici kodda hata olup olmadığını kontrol eder ve hatasız görünüyorsa çalıştırılabilir bir dosya oluşturur. Bu yöntemle kod, derleyici vasıtasıyla bilgisayarın algılayabileceği, yürütebileceği bir dosyaya dönüştürülmüş olur. Yürütülebilir bir dosya bilgisayarın çalıştırabileceği dosya manasına gelir.
Kod, Windows’ta Not Defteri, Mac’te TextEdit ve Linux’ta Nano gibi herhangi bir metin düzenleyicide hazırlanabilir, kontrol edilebilir. Ancak daha profesyonel çalışmaları daha kolay bir şekilde yapabilmek için derleyici kullanmanızı tavsiye ederiz.
C kodunu hazırlamadan önce kullanım açısından uygun olduğunu düşündüğünüz bir derleyici bulmalısınız. Mac OS X ya da Linux kullanıyorsanız işletim sisteminin gerektirdiği bazı geliştirme araç yazılımlarını yükleyebilir böylece bilgisayarınızda bir C derleyicisi oluşturabilirsiniz. Bu gibi derleyiciler komut satırı aracı olarak kullanılır yani derleyicinizi genellikle bir terminal penceresindeki komut isteminden çalıştırabilirsiniz. Bu C derleyicilerinin çalışma komutları için “cc”, “gcc” ve bazı komut satırı seçenekleri örnek olarak gösterilebilir.
Microsoft Windows kullanıyorsanız veya yukarıda bahsettiğimiz komut satırı yerine grafiksel bir kullanıcı arabirimi kullanmayı tercih ederseniz, C programlama dilini derleyebileceğiniz tümleşik bir geliştirme ortamı (IDE) kullanabilirsiniz.
Yukarıda bahsettiğimiz üzere IDE; kodunuzu yazabildiğiniz, derleyebildiğiniz, test edebildiğiniz ve hataları hızlıca ayıklayabildiğiniz tek arabirimdir. Yazımızın başında verdiğimiz örnek IDE’leri, kullanacağınız yazılım diline göre internet üzerinden araştırabilir ve size en uygun olanı seçerek kodlamaya başlayabilirsiniz.
Derleyiciler üzerinde durduktan sonra basit bir C kodunu gözden geçirebiliriz. Kodu gözden geçirirken derleme sürecine de aşina olacağız. Siz de bu basit programı derleyicinizde çalıştırabilirsiniz. İşte örnek programımız:
1- /*Örnek Program*/
2- #include <stdio.h>
3- int main () {
4- printf ("Merhaba Dünya! \ n");
5- return 0;
6- } Derlendiğinde ve çalıştırıldığında bu program bilgisayara “Merhaba Dünya!” yazdırması komutunu gönderir. Oldukça basit öyle değil mi? Şimdi her satırın ne yaptığına tek tek bakalım:
Satır 1- Bir veya birden fazla satır aralığında yorum yazmak için ”/* */” komutu kullanılır. Bu komut derleyici tarafından göz ardı edilir ve işleme alınmaz. Yani çıktı ekranında gözükmez.
Satır 2- İnclude, “Ekle-Dâhil Et” manasına gelir. “#include” komutu derleyiciye, yazmış olduğunuz C kodu için diğer kaynaklara, özellikle de yaygın olarak yeniden kullanılabilir talimatlar içeren dosyalardan oluşan kütüphanelere bakmasını ve ihtiyaca göre kullanması söyler. Bir kullanıcıdan girdi almak ve ekrana çıktı vermek için kullanılan standart bir C kütüphanesine referansta bulunur. (Burada referansta bulunan kütüphane: stdio.h) Kütüphane konusunu ilerleyen kısımlarda detaylı bir şekilde inceleyeceğiz.
Satır 3- Bu satır bir fonksiyon tanımının kullanıldığı ilk satırdır. Her C programlamacısının, bir işlevi veya program çalıştırıldığında bilgisayarın yapmasının istenildiği bir şeyi temsil eden bir kod bloğu vardır. Bu kod bloğu işlev sahibi bir fonksiyon ile başlar. Bu kısımdaki başlangıç fonksiyonu “main” fonksiyonudur.
Başlangıç fonksiyonu sayesinde fonksiyon içerisinde bulunan komutlar ve diğer fonksiyonlar sınırlanmış ve anlamlandırılmış olur. Böylece bilgisayarın yapmasını istediğimiz işleri bu fonksiyon içine yazarak ona anlamlı bir komut gönderebilmiş oluruz. Gönderdiğimiz anlamlı komut sonucunda da anlamlı bir dönüt alabiliriz.
Bu kısımda fonksiyon öncesinde kullanılan “int”, “İnteger” kelimesinin kısaltılmış halidir ve “Tamsayı” manasına gelir. Bu noktada bize geri dönecek olan sonucun bir tamsayı veri olduğunu anlamak mümkündür. İlerleyen kısımlarda fonksiyon sonunda kullanılan boş parantezlerin “( )” işlevine de değineceğiz.
Satır 3 & 6- Yazmış olduğumuz koddaki fonksiyon içerisinde bulunan talimatlar yukarıda da bahsettiğimiz gibi sınırlar içerisine alınmalıdır. Bu satırlarda görmüş olduğumuz süslü parantezler “{ }” fonksiyon içerisinde yazmış olduğumuz komutları sınırlandırır ve sonrasında yazacağımız komutlarla karışmasını önler, aynı zamanda bilgisayarın, çalıştıracağı kodun hangi fonksiyon altında yazıldığını belirlemesini sağlayarak çalışma hatasını engeller.
Bu kısımda ilk süslü parantezin main fonksiyonundan hemen sonra kullanıldığını görüyoruz. Bazı programcılar yazdıkları kodun daha anlaşılır olması için bu süslü parantezi bir alt satırda da kullanabilir. Bu kullanım kodda herhangi bir sıkıntı yaratmaz. İkinci süslü parantez ise fonksiyon içerisine yazdığımız kodlar tamamlandıktan sonra kullanılır. Süslü parantezlerin kullanılmaması durumunda derleyici hata verecektir.
Satır 4- Bu satırda gördüğünüz “printf” fonksiyonu “stdio.h” kütüphanesi içerisinde yer alan “printf” komutlar dizisine bir işlev çağrısıdır. Bu işlev “stdio.h” kütüphanesinde kodlanmış olup programcının işlev kodunu yeniden yazmamasını sağlayarak kullanım kolaylığı oluşturur. “printf” çağrısı ekrana ne yazdırılacağını söyler. Bu çağrı içerisinde yer alan “\n” bir kaçış dizgisidir ve çıktı olarak gösterilmez. Görevi “Merhaba Dünya!” çıktısı verildikten sonra çıktı ekranında imleci bir alt satıra geçirmektir. Bunun yanında her satırda kullanılan “ ; ” komutu satır işleminin bittiğini belirtir.
Satır 5- Proje içerisinde yazılan kodların sonucu “main” fonksiyonuna bir değer döndürmelidir. Bu değer, 3. Satırda belirttiğimiz üzere bir tam sayı değeri olmalıdır. Yazdığımız kodda ortaya çıkacak sonucun geri dönmesi istediğimiz zaman kodun sonunda “return 0” komutunu kullanırız. Geri dönen değer “dönüş değeri” adını alır. Bir diğer manada dönüş değeri fonksiyon içerisinde yazılan kodların çalıştırılması sonucu ortaya çıkar, yani proje sonucudur.
Tüm bunların ardından yazdığınız programı kaydedebilir ve çalıştırabilirsiniz. Çalıştırdığınızda herhangi bir hata oluşması durumunda derleyiciniz sizi yönlendirecektir. Bu yöntemi kullanırken zorlanmanız halinde kodu tekrar satır satır kontrol ederek hatanızı bulabilirsiniz.
C Dilinde Programlama Kavramları
Bu kısımda C programlama dili kapsamında kullanılan bazı programlama kavramlarına değineceğiz. Bu kavramlar, serinin diğer yazılarında incelenecektir.
Fonksiyon: Fonksiyon, program çalışırken bilgisayarın yapması gereken işleri temsil eden kod bloğudur. Programımız çeşitli fonksiyonları tanımlar ve fonksiyonları diğer fonksiyonların içerisinde çalıştırabilir. Fonksiyonlar birbirleri ile ve kütüphanelerle iletişim halinde çalışırlar.
Değişkenler: Bir program çalıştırıldığında veya çalıştırılmadan önce, fonksiyon içerisinde kullanılacak olan değerleri ve programın çalışması sonucu ortaya çıkacak olan değerleri belli bir değişkene atamak programcıya esneklik ve kolaylık sağlar. Şu şekilde örnek verelim: 7 ve 5 sayısını toplayacaksınız. Bu durumda x=7 ve y=5 şeklinde bir değer ataması yapıp program içerisinde 5+7 yerine x+y ifadesini kullanarak hem karışıklığı engelleyebilir hem de kolaylık sağlayabilirsiniz.
Veri Türleri: Programınız çalıştırıldığında verileri bellekte saklamak ve bu verileri üzerinde işlem yapabilmek için C programlama dilinde tanımlı belli veri türleri vardır. C dilindeki her veri türü, ikili bit veya bayt olarak ölçülen belirli bir boyuta ve bitlerin neyi temsil ettiği hakkında kurallar kümesine sahiptir. İlerleyen kısımlarda C dilinde kullanılmak üzere seçilen veri türlerinin önemi üzerinde duracağız.
İşlemler: C dilinde sayı dizileri üzerinde bazı aritmetik işlemler gerçekleştirilebilir. Bu aritmetik işlemler karakter dizileri üzerinden de yapılabilir. Bu gibi işlemler için C dili belli başlı kütüphanelere ve veri türlerine sahiptir.
Döngüler: Bir programcının yapmak isteyeceği en temel işlerden biri, program çalışırken ortaya çıkan belirli koşullara bağlı olarak bir eylemi birkaç kez tekrarlamaktır. Verilen koşullara göre tekrarlamak için tasarlanmış bir kod bloğuna döngü adı verilir. C dilinde döngüler şu ifadelerle gerçekleştirilir: “While”, “Do-While”, “For”, “If”, “Then”, “Else”, “Switch-Case”…
Veri Yapıları: Programlamacılar, işlemek için çok fazla veriye sahipse ve bu verileri sıralamaları veya arayıp kullanmaları gerekiyorsa genelde bir tür veri yapısına ihtiyaç duyarlar. Bir veri yapısı, aynı veri tipinde birkaç veri öbeğini temsil etmenin yapılandırılmış bir aracıdır. En yaygın veri yapısı, belirli bir büyüklüğün yalnızca dizinlenmiş bir liste içerisinde kullanılmasını sağlayan “dizi”lerdir.
Önişlemci İşlemleri: Bazı durumlarda derleyiciniz üzerinde hazırladığınız kodu çalıştırmadan önce, kodunuzla alakalı bazı işlemler hakkında talimatlar vermek isteyebilirsiniz. Önişlemci işlemleri de sabit değerler üzerinde çalışarak verdiğiniz komutları yerine getirmeyi amaçlar. Bunu yaparken C kütüphaneleri üzerinden elde ettiği kodları kullanır.
Bu gibi kavramların yanında programcıların kullandığı birkaç kavram daha var. Bellek yönetimi, işaretçiler ve dosyalar bu kavramlara örnek verilebilir. Sonraki yazılarda tüm kavramlar üzerinde durulacak.
Programlama üzerine bir çalışmanız yoksa ya da programlamaya yeni başladıysanız bu kavramlar size karmaşık ve zor görünebilir. Ancak zaman ilerledikçe ve kodlama üzerinde pratikler yaptıkça her birinin mantığını anlayıp karmaşadan sıyrılabilirsiniz.
Şimdilik bu kavramlara aşina olmakla yetinmenizi tavsiye ederim. Bir sonraki yazıda bahsettiğimiz kavramları detaylandırarak ne oldukları ve ne yaptıkları üzerinde duracağız. Faydalı olması dileğiyle..
Kaynakça
- C ile Programlama, Programlama Dilleri, Paul-Harvey Deitel
- https://computer.howstuffworks.com