C (programlama dili)
Paradigması | Zorunlu (yordamsal), yapısal |
---|---|
İlk çıkışı | 1972 |
Tasarımcı | Dennis Ritchie |
Geliştirici | Aslen: Dennis Ritchie & Bell Labs ANSI C: ANSI X3J11 ISO C: ISO/IEC JTC1/SC22/WG14 |
Kararlı sürüm | C99 (Mart 2000) |
Önizleme sürümü | C1X |
Önemli uygulamaları | Clang, GCC, MSVC, Turbo C, Watcom C |
Lehçeleri | Cyclone, Unified Parallel C, Split-C, Cilk, C* |
Etkilendikleri | B (BCPL, CPL), ALGOL 68, Çevirici, PL/I, FORTRAN |
Etkiledikleri | Birçok: AMPL, AWK, csh, C++, C--, C#, Objective-C, BitC, D, Go, Java, JavaScript, Limbo, LPC, Perl, PHP, Pike, Processing, Python, Comfy |
İşletim sistemi | Çapraz platform |
Olağan dosya uzantıları | .h .c |
C, yapısal bir programlama dilidir. Bell Laboratuvarları'nda, Ken Thompson ve Dennis Ritchie tarafından UNIX işletim sistemini geliştirebilmek amacıyla B dilinden türetilmiştir. 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 Dilinin geçmişi
C Dilinin erken tarihi
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.
C dilinin geçmişi
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ştirildi
K&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 ((İngilizce) 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 vevoid *
veri tipistruct
ya daunion
veri tipi döndüren fonksiyonlar- her bir
struct
'ın alan adları için ayrı bir ad alanı struct
veri tipleri için atama- bir nesneyi yazmaya karşı korumalı yapmak için
const
anahtar sözcüğü - standart bir C kütüphanesi
- enumeration'lar
- single-precision
float
tipi
ANSI C ve ISO C dilleri
1970'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.
C99
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:
- for ve bunun gibi yineleme ifadelerinde parantez içi ilk deklarasyonlara izin verilmesi
Örneğin for(int i=0; i<10; i++)
deyimi c99 da geçerli iken c89 da geçerli değildir...
- inline fonksiyonlar
- C++'da olduğu gibi artık değişkenler programın herhangi bir yerinde tanımlanabilirler
long long int
,boolean
,complex
gibi yeni veri tipleri- değişken uzunluğa sahip diziler
- C++'dan alınan,
//
ile başlayan tek satırlık program içi açıklamalar snprintf()
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
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 program derlenmeden önce devreye girerek istenilen değişiklikleri kaynak dosya üzerinde gerçekleştirir. Bu programda standart giriş-çıkış fonksiyonlarının prototiplerini içeren stdio.h
(standart input-output) başlık dosyasını programa dahil eder. Bu programdaki komutun amacı printf
fonskiyonunu programa dahil etmektir.
2. satır: Boş bir satır olduğundan derleyici tarafından önemsenmez.
3. satır: main
fonksiyonununun tanımını içerir. main
fonksiyonun C dilinde özel bir amacı vardır. Programın çalışma zamanında başladığı yer main fonksiyonudur. main
ne yaparsa, program da onu yapar.
4. satır: main
fonksiyonunun başladığı yeri belirtir.
5. satır: Bu satırda "merhaba, dünya" yazısını (karakter dizisini) konsola yazdırmak için printf
fonksiyonunu çağırır ki bu fonksiyonu 1. satırdaki stdio.h
başlık dosyası ile programa dahil edilmişti.
7. satır: return
kodu main fonksiyonunu 0
geri dönüş değeriyle sonlandırır.
8. satır: main
fonksiyonunun bittiği yeri belirtir.
Hafıza yönetimi
Bir programlama dilinin en önemli işlevlerinden biri, belleği ve bellekte depolanan nesneleri yönetmek için olanaklar sağlamaktır. C, nesneler için bellek ayırmanın üç temel yolunu sunar:[3]
- Statik bellek tahsisi: nesne için alan, derleme zamanında ikili dosyada sağlanır; bu nesnelerin, onları içeren ikili belleğe yüklendiği sürece bir kapsamı(extent) (veya ömrü "lifetime") vardır.
- Otomatik bellek tahsisi: geçici nesneler yığında(stack) saklanabilir ve bu alan otomatik olarak serbest bırakılır ve bildirildikleri bloktan çıkıldıktan sonra yeniden kullanılabilir.
- Dinamik bellek ayırma: çalışma zamanında, yığın adı verilen bir bellek bölgesinden
malloc
gibi kitaplık işlevleri kullanılarak isteğe bağlı boyutta bellek blokları istenebilir; bu bloklar, kütüphane işlevirealloc
veyafree
çağrılarak yeniden kullanım için serbest bırakılıncaya kadar devam eder.
Bu üç yaklaşım, farklı durumlarda uygundur ve çeşitli ödünleşimlere sahiptir. Örneğin, statik bellek tahsisi (allocation), çok az tahsis ek yüküne sahiptir. Otomatik tahsis biraz daha fazla ek yük içerebilir ve dinamik bellek ayırma (tahsisi), hem allocation hem de deallocation için potansiyel olarak büyük bir ek yüke sahip olabilir. Statik nesnelerin kalıcı doğası, işlev (fonksiyon) çağrıları arasında durum bilgilerini korumak için kullanışlıdır. Otomatik ayırmanın kullanımı kolaydır, ancak yığın alanı genellikle statik bellek veya yığın alanından çok daha sınırlı ve geçicidir ve dinamik bellek tahsisi, boyutu yalnızca çalışma zamanında bilinen nesnelerin uygun şekilde tahsis edilmesini sağlar. Çoğu C programı, üçünü de kapsamlı bir şekilde kullanır.
Mümkün olduğunda, otomatik veya statik ayırma genellikle en basitidir, çünkü depolama derleyici tarafından yönetilir ve programcıyı potansiyel olarak hataya açık depolamayı manuel olarak tahsis etme ve serbest bırakma görevinden kurtarır. Ancak, birçok veri yapısının boyutu çalışma zamanında değişebilir ve statik ayırmaların (ve C99'dan önceki otomatik ayırmaların) derleme zamanında sabit bir boyutu olması gerektiğinden, dinamik ayırmanın gerekli olduğu birçok durum vardır.[3] C99 standardından önce, değişken boyutlu diziler bunun yaygın bir örneğiydi. (Dinamik olarak ayrılmış dizilerin bir örneği için malloc
hakkındaki makaleye bakın.) Kontrolsüz sonuçlarla çalışma zamanında başarısız olabilen otomatik tahsisin aksine, dinamik tahsis işlevleri, gerekli depolama tahsis edilemediğinde bir gösterge (boş gösterici değeri şeklinde) döndürür. (Çok büyük olan statik ayırma, genellikle program yürütmeye başlamadan önce bağlayıcı veya yükleyici tarafından algılanır.)
Aksi belirtilmedikçe, statik nesneler program başlangıcında sıfır veya boş gösterici değerleri içerir. Otomatik ve dinamik olarak tahsis edilen nesneler, yalnızca bir başlangıç değeri açıkça belirtilmişse başlatılır; aksi halde başlangıçta belirsiz değerlere sahiptirler (tipik olarak, depolamada hangi bit deseni bulunursa bulunsun, bu tür için geçerli bir değeri bile temsil etmeyebilir). Program başlatılmamış bir değere erişmeye çalışırsa, sonuçlar tanımsızdır. Birçok modern derleyici bu sorunu tespit etmeye ve uyarmaya çalışır, ancak hem yanlış pozitifler hem de yanlış negatifler oluşabilir.
Yığın bellek tahsisi, mümkün olduğunca yeniden kullanılmak üzere herhangi bir programdaki gerçek kullanımıyla senkronize edilmelidir. Örneğin, bir yığın bellek tahsisine yönelik tek işaretçi kapsam dışına çıkarsa veya açıkça tahsis edilmeden önce değerinin üzerine yazılırsa, bu bellek daha sonra yeniden kullanım için kurtarılamaz ve esasen program tarafından kaybedilir, bu bir bellek sızıntısı olarak bilinen bir olgudur. Tersine, belleğin serbest bırakılması mümkündür, ancak daha sonra başvurulmakta ve bu da öngörülemeyen sonuçlara yol açmaktadır. Tipik olarak, hata belirtileri programın hataya neden olan kodla ilgisi olmayan bir bölümünde belirir ve bu da hatanın teşhis edilmesini zorlaştırır. Bu tür sorunlar, otomatik çöp toplama ile dillerde iyileştirilir.
Kütüphaneler
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.[3]
Dosya işleme ve akışlar
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.
Dil araçları
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.[4]
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.
Kullanım
Sistem programlamasında kullanım gerekçesi
C, işletim sistemlerinin ve gömülü sistem uygulamalarının uygulanmasında sistem programlaması için yaygın olarak kullanılmaktadır.[5] Bu birkaç nedenden dolayıdır:
- Derlemeden sonra oluşturulan kod, pek çok sistem özelliği gerektirmez ve bazı önyükleme kodlarından basit bir şekilde çağrılabilir - yürütmesi kolaydır.
- C dili deyimleri ve ifadeleri, tipik olarak, hedef işlemci için talimat dizileriyle iyi bir şekilde eşleşir ve sonuç olarak, sistem kaynaklarında düşük bir çalışma zamanı talebi vardır - yürütülmesi hızlıdır.
- Zengin operatör seti ile C dili, hedef CPU'ların birçok özelliğini kullanabilir. Belirli bir CPU'nun daha ezoterik talimatlara sahip olduğu durumlarda, bu talimatlardan yararlanmak için belki de içsel işlevlerle bir dil varyantı oluşturulabilir - pratik olarak tüm hedef CPU özelliklerini kullanabilir.
- Dil, yapıların ikili veri blokları üzerine bindirilmesini kolaylaştırarak verilerin anlaşılmasına, gezinmesine ve değiştirilmesine olanak tanır - veri yapıları, hatta dosya sistemleri yazabilir.
- Dil, tam sayı aritmetiği ve mantığı ve belki de farklı boyutlardaki kayan nokta sayıları için bit işleme dahil olmak üzere zengin bir operatör grubunu destekler - uygun şekilde yapılandırılmış verileri etkili bir şekilde işleyebilir.
- C oldukça küçük bir dildir, yalnızca bir avuç ifade içerir ve kapsamlı hedef kod oluşturan çok fazla özelliği yoktur - anlaşılırdır.
- C, ara sıra dünyayı durduran çöp toplama olayları için herhangi bir endişe duymadan, bellek işleme operasyonlarına makul verimlilik ve öngörülebilir zamanlama sağlayan bellek allocation ve deallocation üzerinde doğrudan kontrole sahiptir - öngörülebilir bir performansa sahiptir.
- Platform donanımına işaretçiler ve type punning ile erişilebilir, böylece sisteme özgü özellikler (örn. Kontrol/Durum Kayıtları, G/Ç kayıtları) (e.g. Control/Status Registers, I/O registers) C ile yazılmış kodla yapılandırılabilir ve kullanılabilir – üzerinde çalıştığı platformla iyi etkileşime girer.
- Bağlayıcıya ve ortama bağlı olarak, C kodu, Assembly dilinde yazılmış kitaplıkları da çağırabilir ve Assembly dilinden çağrılabilir - diğer alt düzey kodlarla iyi bir şekilde birlikte çalışır.
- C ve onun arama kuralları ve bağlayıcı yapıları, hem C'ye hem de C'den yapılan aramalarla birlikte diğer yüksek seviyeli dillerle birlikte yaygın olarak kullanılır - diğer yüksek seviyeli kodlarla iyi bir şekilde birlikte çalışır.
- C, kütüphaneler, çerçeveler, açık kaynak derleyiciler, hata ayıklayıcılar ve yardımcı programlar dahil olmak üzere çok ergin ve geniş bir ekosisteme sahiptir ve fiili standarttır. Sürücülerin C'de zaten mevcut olması veya bir C derleyicisinin arka ucuna(back-end) benzer bir CPU mimarisi olması muhtemeldir, bu nedenle başka bir dil seçmek için azaltılmış teşvik vardır.
Bir kez web geliştirme için kullanıldı
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.[6] C, hızı, kararlılığı ve neredeyse evrensel kullanılabilirliği nedeniyle yorumlanan (interpreted) diller yerine seçilmiş olabilir.[7] Web geliştirmenin C'de yapılması artık yaygın bir uygulama değildir[8] ve diğer birçok web geliştirme aracı mevcuttur.
Diğer bazı dillerin kendileri C ile yazılmıştır
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.[9] Örneğin Python,[10]Perl,[11] Ruby,[12] ve PHP[13] referans uygulamaları C ile yazılmıştır.
Hesaplama açısından yoğun kitaplıklar için kullanılı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.
Ara dil olarak C
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.
Son kullanıcı uygulamaları
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.
Sınırlamalar
Dennis Ritchie[14]
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
vefree
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.- İşaretçilerin kullanımı ve belleğin doğrudan manipülasyonu, belki de programcı hatası veya yetersiz veri denetimi nedeniyle belleğin bozulmasının mümkün olduğu anlamına gelir.
- Bazı tip kontrolü vardır, ancak değişken fonksiyonlar gibi alanlar için geçerli değildir ve tip kontrolü önemsiz veya yanlışlıkla atlanabilir.
- Yüksek seviyeli programlama dillerinde yaygın olarak bulunan string değişken tipi C'de bulunmadığı için bunun yerine char ile belirli bir uzunlukta karakter dizisi array şeklinde hafızada tutulur. Mesela char a[]="Merhaba"; şeklinde bir karakter dizisi tanımlanabilir. Fakat daha sonra bu değişkene a[]="Nasılsın?"; şeklinde direkt olarak yeni bir değer atanamaz. Bunun yerine strcpy fonksiyonu kullanılabilir. Bu da diğer programlama dillerine nazaran C'nin zorluklarından biridir.
- Derleyici tarafından üretilen kodun kendisi birkaç kontrol içerdiğinden, programcının tüm olası sonuçları göz önünde bulundurması ve arabellek taşmalarına, dizi sınırları denetimine, yığın taşmalarına, bellek tükenmesine, tür koşullarına, dizi yalıtımına vb. karşı koruma yükü vardır.
- İşaretçilerin kullanımı ve bu araçların çalışma zamanı manipülasyonu, derleme zamanında belirlenemeyen aynı verilere (aliasing) erişmenin iki yolu olabilir. Bu, diğer dillerde mevcut olabilecek bazı optimizasyonların C'de mümkün olmadığı anlamına gelir. FORTRAN daha hızlı kabul edilir.
- Standart kitaplık işlevlerinden bazıları, örn.
scanf
, arabellek taşmalarına neden olabilir. - Oluşturulan kodda düşük seviyeli değişkenler için sınırlı standartlaştırma desteği vardır, örneğin: farklı işlev çağırma kuralları ve ABI; farklı yapı paketleme kuralları; daha büyük tam sayılar içinde farklı bayt sıralaması (endianness dahil). Pek çok dil uygulamasında, bu seçeneklerden bazıları önişlemci yönergesi
#pragma
[15][16] 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.[17] - Standart kitaplığı kullanarak dize işleme, kod açısından yoğundur ve açık bellek yönetimi gerekir.
- Dil, nesne yönelimini, introspection, çalışma zamanı ifadesi değerlendirmesini, jenerikleri vb. doğrudan desteklemez.
- Dil özelliklerinin uygunsuz kullanımına karşı sürdürülemez kodlara yol açabilecek birkaç koruma vardır. Zor kod için bu tesis, International Obfuscated C Code Contest ve Underhanded C Contest. gibi yarışmalarla kutlandı.
- C, istisna işleme için standart destekten yoksundur ve yalnızca hata denetimi için dönüş kodları sunar.
setjmp
velongjmp
standart kitaplık işlevleri [53]'te makrolar aracılığıyla bir try-catch mekanizmasını uygulamak için kullanılmıştır.[18] - Bazı amaçlar için, kısıtlı C stilleri benimsenmiştir. Örneğin. MISRA C veya CERT C, hata olasılığını azaltmak amacıyla. CWE gibi veritabanları, C vb.'nin güvenlik açıklarına sahip olma yollarını ve azaltma önerilerini saymaya çalışır.
- Bazı dezavantajlara karşı hafifletebilecek araçlar var. Çağdaş C derleyicileri, birçok olası hatayı belirlemeye yardımcı olmak için uyarılar oluşturabilen kontroller içerir.
- Bu dezavantajlardan bazıları, diğer dillerin oluşturulmasına yol açmıştır.
İlgili diller
C, 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.[20] 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.[21]
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.[22] 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.
Kaynakça
- ^ Kernighan, Brian W.; Ritchie, Dennis M. (Şubat 1978). C Programlama Dili (1. bas.). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110163-3.
- ^ Kernighan, Brian W.; Ritchie, Dennis M. (Mart 1988). C Programlama Dili (2. bas.). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110362-8.
- ^ a b c d Klemens, Ben (2013). 21st Century C. O'Reilly Media. ISBN 978-1-4493-2714-9.
- ^ "Man Page for lint (freebsd Section 1)". unix.com. 24 Mayıs 2001. Erişim tarihi: 15 Temmuz 2014.
- ^ Dale, Nell B.; Weems, Chip (2014). Programming and problem solving with C++ (6. bas.). Burlington, MA: Jones & Bartlett Learning. ISBN 978-1449694289. OCLC 894992484.
- ^ Dr. Dobb's Sourcebook. U.S.A.: Miller Freeman, Inc. November–December 1995.
- ^ "Using C for CGI Programming". linuxjournal.com. 1 Mart 2005. 13 Şubat 2010 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Ocak 2010.
- ^ Perkins, Luc (17 Eylül 2013). "Web development in C: crazy? Or crazy like a fox?". Medium (İngilizce). 4 Ekim 2014 tarihinde kaynağından arşivlendi.
- ^ "C - the mother of all languages". ICT Academy at IITK (İngilizce). 13 Kasım 2018. 31 Mayıs 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Ekim 2022.
- ^ "1. Extending Python with C or C++ — Python 3.10.7 documentation". docs.python.org. 5 Kasım 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Ekim 2022.
- ^ "An overview of the Perl 5 engine | Opensource.com". opensource.com (İngilizce). 26 Mayıs 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Ekim 2022.
- ^ "To Ruby From C and C++". www.ruby-lang.org. 12 Ağustos 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Ekim 2022.
- ^ "What is PHP? How to Write Your First PHP Program". freeCodeCamp.org (İngilizce). 3 Ağustos 2022. 4 Ağustos 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Ekim 2022.
- ^ Metz, Cade. "Dennis Ritchie: The Shoulders Steve Jobs Stood On". Wired. 12 Nisan 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 19 Nisan 2022.
- ^ corob-msft. "Pragma directives and the __pragma and _Pragma keywords". learn.microsoft.com (İngilizce). 24 Eylül 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Eylül 2022.
- ^ "Pragmas (The C Preprocessor)". gcc.gnu.org. 17 Haziran 2002 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Eylül 2022.
- ^ "Pragmas". Intel (İngilizce). 10 Nisan 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Nisan 2022.
- ^ Roberts, Eric S. (21 Mart 1989). "Implementing Exceptions in C" (PDF). DEC Systems Research Center. SRC-RR-40. 5 Ocak 2022 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 4 Ocak 2022.
- ^ McMillan, Robert (1 Ağustos 2013). "Is Java Losing Its Mojo?". Wired. 15 Şubat 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Mart 2017.
- ^ O'Regan, Gerard (24 Eylül 2015). Pillars of computing : a compendium of select, pivotal technology firms. ISBN 978-3319214641. OCLC 922324121.
- ^ Rauchwerger, Lawrence (2004). Languages and compilers for parallel computing : 16th international workshop, LCPC 2003, College Station, TX, USA, October 2-4, 2003 : revised papers. Springer. ISBN 978-3540246442. OCLC 57965544.
- ^ Stroustrup, Bjarne (1993). "A History of C++: 1979−1991" (PDF). 2 Şubat 2019 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 9 Haziran 2011.
Dış bağlantılar
- ISO C Working Group resmî web sitesi12 Şubat 2018 tarihinde Wayback Machine sitesinde arşivlendi.
- comp.lang.c Sıkça Sorulan Sorular25 Şubat 2009 tarihinde Wayback Machine sitesinde arşivlendi.
- ISO/IEC 9899 resmî C99 belgeleri23 Mayıs 2015 tarihinde Wayback Machine sitesinde arşivlendi. sasa
- Coding Programmer Page / C Library Reference and Examples21 Ocak 2013 tarihinde Wayback Machine sitesinde arşivlendi. (english)
- Happy Codings 7 Mayıs 2021 tarihinde Wayback Machine sitesinde arşivlendi. Programming Code Examples