AT&T Bell laboratuvarlarında, Ken Thompson ve Dennis Ritchie tarafından UNIX İşletim Sistemi'ni geliştirebilmek amacıyla B dilinden türetilmiş yapısal bir programlama dilidir. Geliştirilme tarihi 1972 olmasına rağmen yaygınlaşması Brian Kernighan ve Dennis M. Ritchie tarafından yayımlanan "C Programlama Dili" kitabından sonra hızlanmıştır. Günümüzde neredeyse tüm işletim sistemlerinin (Microsoft Windows, GNU/Linux, BSD, Minix) yapımında %95'lere varan oranda kullanılmış, hâlen daha sistem, sürücü yazılımı, işletim sistemi modülleri ve hız gereken her yerde kullanılan oldukça yaygın ve sınırları belirsiz oldukça keskin bir dildir. Keskinliği, programcıya sonsuz özgürlüğün yanında çok büyük hatalar yapabilme olanağı sağlamasıdır. Programlamanın gelişim süreciyle beraber programlamanın karmaşıklaşması, gereksinimlerin artması ile uygulama programlarında nesne yönelimliliğin ortaya çıkmasından sonra C programcıları büyük ölçüde nesne yönelimliliği destekleyen C++ diline geçmişlerdir.
C'nin ilk gelişme safhaları 1969 ile 1974 arasında AT&T Bell Laboratuvarları'nda gerçekleşti. Ritchie'ye göre, en yaratıcı devre 1972 idi. Dilin pek çok özelliği "B" adlı bir dilden türediği için, yeni dile "C" adı verildi. B dili yorumlanan bir dildi ve veri tipi desteği yoktu. Yeni donanımların farklı veri tiplerini desteklemesi ve yorumlanan dillerin çalışma zamanında görece yavaş olması sebebi ile C dili tip desteği eklenmiş ve derlenen B olarak geliştirildi.
"B" adının kökeni konusunda ise söylentiler değişik: Ken Thompson B'nin BCPL programlama dilinden türediğini söylemektedir ancak Thompson eşi Bonnie'nin onuruna adını Bon koyduğu bir programlama dili de geliştirmiştir.
1973'e kadar C yeterince güçlü bir hale gelmiş ve ilk başta PDP-11/20 assembly dili ile yazılan UNIX'in çekirdeğinin büyük kısmı C ile yeniden yazılmıştır. Böylece UNIX, çekirdeği bir assembly dili ile yazılmayan ilk işletim sistemlerinden biri olmuştur.
1978'de Ritchie ve Brian Kernighan The C Programming Language (C Programlama Dili) kitabının ilk baskısını yayımladılar.1 C programcıları tarafından "K&R" olarak bilinen bu kitap yıllar boyunca C dilinin gayriresmî standardı olarak kullanıldı. C'nin bu sürümü bugün "K&R C" olarak adlandırılır. Bu kitabın ikinci baskısı ise aşağıda anlatılan ANSI C standardını içerir.2
K&R dilde şu değişiklikleri yaptı:
struct
veri tipleri eklendilong int
veri tipi eklendiunsigned int
veri tipi eklendi=+
operatörü +=
olarak değiştirildiK&R C genellikle tüm C derleyicilerinin desteklemek zorunda olduğu dilin en temel kısmı olarak kabul edilir. Uzun yıllar boyunca, ANSI C'nin kabul edilişinden sonra bile, yüksek taşınabilirlik ( portability) istendiğinde, K&R C, C programcıları tarafından "ortak payda" olarak kabul edilmiştir. Çünkü bazı derleyiciler henüz ANSI C'yi desteklemek üzere güncellenmemişlerdi ve zaten iyi yazılmış bir K&R C programı aynı zamanda ANSI C'yi de destekliyordu.
K&R C'nin yayımlanmasını izleyen yıllar içine dile AT&T'nin derleyicilerinin ve bazı başka bilgisayar üreticileri tarafından desteklenen kimi "gayriresmî" özellikler eklendi. Bunların içinde aşağıdaki özellikler de vardı:
void
fonksiyonlar ve void *
veri tipistruct
ya da union
veri tipi döndüren fonksiyonlarstruct
'ın alan adları için ayrı bir ad alanıstruct
veri tipleri için atamaconst
anahtar
sözcüğüfloat
tipi1970'lerin sonunda C, en çok kullanılan mikrobilgisayar dili olarak BASIC'in önüne geçmeye başladı. 1980'lerde ise, IBM PC ile kullanılmak üzere benimsenmesiyle birlikte popülaritesi iyice artmaya başladı. Aynı zamanda, Bell Laboratuvarları'nda Bjarne Stroustrup ve iş arkadaşları C'ye nesneye yönelim eklemek üzere çalışmaya başlamışlardı. C bugün UNIX dünyasında en çok kullanılan dil olarak kalırken, Stroustrup'un geliştirip C++ adını verdiği dil Microsoft Windows işletim sisteminde en önemli dil oldu.
1983'te Amerikan Ulusal Standartlar Enstitüsü (ANSI) bir C standardı oluşturmak için bir kurul oluşturdu. Uzun ve yorucu bir çalışmadan sonra, bu kurul standardı 1989'da tamamladı ve standart ANSI X3.159-1989 "Programming Language C (C Programlama Dili)" olarak yayımlandı. Dilin bu versiyonu genellikle ANSI C olarak adlandırılır. 1990'da bu standart, küçük değişikliklerle Uluslararası Standartlar Örgütü (ISO) tarafından da benimsenip ISO/IEC 9899:1990 olarak yayımlandı.
ANSI C'yi oluşturmanın amaçlarıdan biri K&R C'yi içeren ve dile sonradan katılan "gayriresmî" özellikleri de dile katan bir standart oluşturmaktı. Kurul fonksiyon prototiplerini ve daha yetenekli bir önişlemciyi de standarda ekledi.
Bugün artık ANSI C neredeyse tüm derleyiciler tarafından desteklenmektedir. Günümüzde yazılmakta olan C programlarının çoğunluğu ANSI C standardına uygun olarak yazılmaktadır. Yalnızca standart C kullanılarak yazılmış bir program, standarda uyumlu her derleyici ile doğru bir biçimde derlenip çalıştırılabilir. Ancak standart olmayan kütüphaneler kullanılarak yazılmış programlar belli bir platform ya da derleyici gerektirebilirler.
ANSI standartlaştırma işleminden sonra C dili uzun bir süre oldukça sabit kaldı ancak C++ gelişmeyi sürdürdü. Buna bağlı olarak, 1990'ların sonunda ISO standardı güncellendi ve 1999'da ISO 9899:1999 olarak yayımlandı. 2000 yılının Mart'ında ise, "C99" olarak bilinen bu standart ANSI tarafından da benimsendi.
C99'un yeni özellikleri şöyle özetlenebilir:
Örneğin for(int i=0; i<10; i++)
deyimi c99 da geçerli iken c89 da
geçerli değildir...
long long int
, boolean
, complex
gibi yeni veri tipleri//
ile başlayan tek satırlık program içi
açıklamalarsnprintf()
gibi yeni kütüphane fonksiyonlarıstdint.h
gibi yeni başlık dosyalarıC99'u bugün GCC ve bazı başka derleyiciler desteklemekteyken, Microsoft ve Borland derleyicilerine C99 desteği eklemekte isteksiz davranmaktadırlar.
Merhaba, dünya örneği ilk olarak The C Programming Language kitabının birinci baskısında kullanıldı ve birçok programlama kitabında kullanılan tanıtıcı örnek haline geldi. Bu örnek terminal ekranına "merhaba, dünya" yazar.
Kitaptaki kodun orijinal hali:
#include <stdio.h>
main()
{
printf("merhaba, dünya\n");
}
Standart olarak onaylanan "merhaba, dünya" versiyonu:
#include <stdio.h>
int main()
{
printf("merhaba, dünya");
return 0;
}
1. satır : Bir önişlemci komutudur ve daha
program derlenmeden önce devreye girerek istenilen değişiklikleri kaynak
dosya üzerinde gerçekleştirir. Bu programda stdio.h
(standart
input-output) başlık dosyasını programa dahil eder. Bu başlık dosyasında
standart giriş-çıkış fonksiyonlarının prototipleri mevcuttur. Burada
programdaki komutun amacı printf
fonskiyonunu programa dahil etmektir.
2. satır : Bu satırda programda işe main
fonksiyonun tanımlanmasıyla
başlanmıştır. main
fonksiyonun C dilinde özel bir amacı vardır.
Programın çalışma zamanında başladığı yer main fonksiyonudur.
3. satır : main
fonksiyonunun başladığı yeri belirtir.
4. satır : Bu satırda "merhaba, dünya" yazısını (karakter dizisini)
ekrana bastırmak için printf
fonksiyonu çağrılır ki bu fonksiyonu 1.
satırdaki stdio.h
başlık dosyası ile programa dahil etmiştik.
5. satır : return
kodu main fonksiyonumuzu 0
geri dönüş değeriyle
sonlandırır.
6. satır : main
fonksiyonunun bittiği yeri belirtir.
C programlama dili, birincil uzantı yöntemi (primary method of
extension) olarak
kütüphaneleri kullanır. C'de
bir kitaplık, tek bir "arşiv" dosyasında bulunan bir dizi işlevdir. Her
kütüphane tipik olarak, bir program tarafından kullanılabilecek
kütüphane içinde bulunan işlevlerin prototiplerini ve bu işlevlerle
kullanılan özel veri türlerinin ve makro sembollerinin bildirimlerini
içeren bir başlık dosyasına sahiptir. Bir
programın kütüphaneyi kullanabilmesi için, kütüphanenin başlık dosyasını
içermesi ve kütüphanenin, çoğu durumda derleyici
bayrakları gerektiren programla bağlantılı
olması gerekir (örneğin, -lm
,"matematik kitaplığını bağla" için
kısayol) .3
En yaygın C kütüphanesi, ISO ve ANSI
C standartları tarafından belirtilen ve her C
uygulamasıyla birlikte gelen C standart
kütüphanesidir (gömülü
sistemler gibi sınırlı ortamları hedefleyen
uygulamalar, standart kütüphanenin yalnızca bir alt kümesini
sağlayabilir). Bu kütüphane, akış giriş ve çıkışını, bellek ayırmayı,
matematiği, karakter dizilerini ve zaman değerlerini destekler. Birkaç
ayrı standart başlık (örneğin, stdio.h
), bu ve diğer standart
kütüphane olanakları için arabirimleri belirtir.
Diğer bir yaygın C kütüphanesi işlevi kümesi, özellikle Unix ve Unix benzeri sistemler için hedeflenen uygulamalar tarafından kullanılanlardır, özellikle çekirdeğe bir arabirim sağlayan işlevlerdir. Bu işlevler, POSIX ve Single UNIX Spesifikasyonu gibi çeşitli standartlarda detaylandırılmıştır.
Birçok program C ile yazıldığından, çok çeşitli başka kütüphaneler de mevcuttur. kütüphaneler genellikle C ile yazılır çünkü C derleyicileri verimli nesne kodu üretir; programcılar daha sonra rutinlerin Java, Perl ve Python gibi daha yüksek seviyeli dillerden kullanılabilmesi için kütüphaneye arayüzler oluşturur.4
Dosya girişi ve çıkışı(G/Ç), C dilinin bir parçası değildir, bunun
yerine kitaplıklar (C standart kitaplığı gibi) ve bunlarla ilişkili
başlık dosyaları (örneğin stdio.h
) tarafından işlenir. Dosya işleme,
genellikle akışlar aracılığıyla çalışan yüksek
seviyeli girdi ve çıktılar aracılığıyla gerçekleştirilir. Bu açıdan bir
stream, cihazlardan bağımsız bir veri akışı iken, bir dosya somut bir
cihazdır. Üst düzey giriş ve çıkış, bir akışın bir dosyayla
ilişkilendirilmesi yoluyla yapılır. C standart kitaplığında, son hedefe
gönderilmeden önce verileri depolamak için geçici olarak bir
arabellek (bir bellek alanı veya queue)
kullanılır. Bu, örneğin sabit sürücü
veya yarıiletken sürücü gibi daha yavaş
aygıtları beklemek için harcanan süreyi azaltır. Düşük seviyeli giriş ve
çıkış işlevleri, standart C kitaplığının bir parçası değildir, ancak
genellikle "çıplak metal"(bare metal) programlamanın (çoğu gömülü
programlama gibi herhangi bir işletim
sisteminden bağımsız programlama)
parçasıdır. Birkaç istisna dışında, uygulamalar düşük seviyeli girdi ve
çıktı içerir.
C programcılarının tanımsız davranışa veya muhtemelen hatalı ifadelere sahip, derleyici tarafından sağlanandan daha büyük bir titizlikle ifadeleri bulmasına ve düzeltmesine yardımcı olmak için bir dizi araç geliştirilmiştir. Tool lint, diğerlerine yol açan ilk türdü.
Otomatik kaynak kodu checking ve auditing herhangi bir dilde faydalıdır ve C için Lint gibi bu tür birçok araç vardır. Yaygın bir uygulama, bir program ilk yazıldığında şüpheli kodu algılamak için Lint kullanmaktır. Bir program Lint'i geçtiğinde, C derleyicisi kullanılarak derlenir. Ayrıca, birçok derleyici isteğe bağlı olarak aslında hata olması muhtemel sözdizimsel olarak geçerli yapılar hakkında uyarabilir. MISRA C, gömülü sistemler için geliştirilmiş, bu tür şüpheli kodlardan kaçınmak için özel bir kurallar dizisidir.5
Diziler için sınır denetimi, arabellek taşmasını algılama, serileştirme, dinamik bellek izleme ve otomatik çöp toplama gibi C'nin standart bir parçası olmayan eylemleri gerçekleştirmek için derleyiciler, kitaplıklar ve işletim sistemi düzeyinde mekanizmalar da vardır.
Purify veya Valgrind gibi araçlar ve bellek ayırma işlevlerinin özel sürümlerini içeren kitaplıklarla bağlantı kurma, bellek kullanımındaki çalışma zamanı hatalarını ortaya çıkarmaya yardımcı olabilir.
C, işletim sistemlerinin ve gömülü sistem uygulamalarının uygulanmasında sistem programlaması için yaygın olarak kullanılmaktadır.6 Bu birkaç nedenden dolayıdır:
Tarihsel olarak, C bazen web uygulaması, sunucu ve tarayıcı arasında bilgi için bir "ağ geçidi" olarak Ortak Ağ Geçidi Arayüzü(Common Gateway Interface) (CGI) kullanılarak web geliştirme için kullanılmıştır.7 C, hızı, kararlılığı ve neredeyse evrensel kullanılabilirliği nedeniyle yorumlanan (interpreted) diller yerine seçilmiş olabilir.8 Web geliştirmenin C'de yapılması artık yaygın bir uygulama değildir9 ve diğer birçok web geliştirme aracı mevcuttur.
C'nin geniş kullanılabilirliğinin ve verimliliğinin bir sonucu, diğer programlama dillerinin derleyicileri, kitaplıkları ve yorumlayıcılarının genellikle C'de uygulanmasıdır.10 Örneğin Python,11Perl,12 Ruby,13 ve PHP14 referans uygulamaları C ile yazılmıştır.
C, programcıların algoritmaların ve veri yapılarının verimli uygulamalarını oluşturmalarını sağlar, çünkü donanımdan soyutlama katmanı incedir ve ek yükü düşüktür, bu da hesaplama açısından yoğun programlar için önemli bir kriterdir. Örneğin, GNU Çoklu Hassas Aritmetik Kitaplığı, GNU Bilimsel Kitaplığı, Mathematica ve MATLAB tamamen veya kısmen C dilinde yazılmıştır. Birçok dil, C'de kitaplık işlevlerini çağırmayı destekler. Örneğin, Python tabanlı framework NumPy, yüksek performans ve donanım etkileşimi yönleri için C'yi kullanır.
C bazen diğer dillerin uygulamaları tarafından bir ara dil olarak kullanılır. Bu yaklaşım taşınabilirlik veya kolaylık için kullanılabilir; C'yi bir ara dil olarak kullanarak, makineye özel ek kod oluşturucular gerekli değildir. C, oluşturulan kodun derlenmesini destekleyen, satır numarası önişlemci yönergeleri ve başlatıcı listelerinin sonunda isteğe bağlı gereksiz virgüller gibi bazı özelliklere sahiptir. Bununla birlikte, C'nin bazı eksiklikleri, C-- gibi ara diller olarak kullanılmak üzere özel olarak tasarlanmış diğer C-tabanlı dillerin geliştirilmesine yol açmıştır. Ayrıca, çağdaş büyük derleyiciler GCC ve LLVM'nin her ikisi de C olmayan bir ara temsile sahiptir ve bu derleyiciler, C dahil birçok dil için ön uçları ( front ends) destekler.
C ayrıca son kullanıcı uygulamalarını uygulamak için yaygın olarak kullanılmaktadır. Bununla birlikte, bu tür uygulamalar daha yeni, daha yüksek seviyeli dillerde de yazılabilir.
C popüler, etkili ve son derece başarılı olmasına rağmen, aşağıdakiler de dahil olmak üzere dezavantajları vardır:
malloc
ve free
ile standart dinamik bellek işleme hataya
açıktır. Hatalar şunları içerir: Bellek ayrıldığında ancak serbest
bırakılmadığında bellek sızdırıyor; ve önceden boşaltılan belleğe
erişim.scanf
, arabellek
taşmalarına neden olabilir.#pragma
1516 aile,
bazıları ise ek anahtar sözcüklerle ör. __cdecl
çağrı kuralını
kullanın. Ancak yönerge ve seçenekler tutarlı bir şekilde
desteklenmemektedir.17setjmp
velongjmp
standart kitaplık işlevleri
[53]'te makrolar aracılığıyla bir try-catch mekanizmasını
uygulamak için kullanılmıştır.18C, C++, C#, D, Go, Java, JavaScript, Perl, PHP, Rust ve Unix'in C kabuğu gibi sonraki birçok dili hem doğrudan hem de dolaylı olarak etkilemiştir.19 En yaygın etki sözdizimsel olmuştur; bahsedilen dillerin tümü, C'nin deyim (statement) ve (az ya da çok tanınabilir şekilde) ifade (expression) sözdizimini, C'den bazen kökten farklı olan tür sistemleri, veri modelleri ve/veya büyük ölçekli program yapıları ile birleştirir.
Komut dosyası oluşturmak için de kullanılabilen Ch ve CINT dahil olmak üzere birkaç C veya C'ye yakın yorumlayıcı mevcuttur.
Nesne yönelimli programlama dilleri popüler hale geldiğinde, C++ ve Objective-C, C'nin nesne yönelimli yetenekler sağlayan iki farklı uzantısıydı. Her iki dil de başlangıçta kaynaktan kaynağa (source to source) derleyiciler olarak uygulandı; kaynak kodu C'ye çevrildi ve ardından bir C derleyicisi ile derlendi.20
C++ programlama dili (başlangıçta "C with Classes" olarak adlandırıldı) Bjarne Stroustrup tarafından C benzeri bir sözdizimi ile nesne yönelimli işlevsellik sağlamaya yönelik bir yaklaşım olarak geliştirilmiştir.21 C++, daha fazla yazma gücü, kapsam belirleme (generic programming) ve nesne yönelimli programlamada yararlı olan diğer araçları ekler ve şablonlar aracılığıyla genel programlamaya izin verir. Neredeyse C'nin bir üst kümesi olan C++ şimdi, birkaç istisna dışında C'nin çoğunu destekliyor.
Objective-C, başlangıçta C'nin üzerinde çok "ince" bir katmandı ve hibrit bir dinamik/statik yazım paradigması kullanarak nesne yönelimli programlamaya izin veren katı bir C üst kümesi olmaya devam ediyor. Objective-C sözdizimini hem C'den hem de Smalltalk'tan alır: ön işleme, ifadeler, işlev bildirimleri ve işlev çağrılarını içeren sözdizimi C'den miras alınırken, nesne yönelimli özelliklerin sözdizimi orijinal olarak Smalltalk'tan alınmıştır.
C++ ve Objective-C'ye ek olarak, Ch, Cilk ve Unified Parallel C, C'nin neredeyse üst kümeleridir.
Orijinal kaynak: c (programlama dili). Creative Commons Atıf-BenzerPaylaşım Lisansı ile paylaşılmıştır.
Ne Demek sitesindeki bilgiler kullanıcılar vasıtasıyla veya otomatik oluşturulmuştur. Buradaki bilgilerin doğru olduğu garanti edilmez. Düzeltilmesi gereken bilgi olduğunu düşünüyorsanız bizimle iletişime geçiniz. Her türlü görüş, destek ve önerileriniz için iletisim@nedemek.page