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 diline geçmişlerdir.
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 | (Mart 2000) |
Önizleme sürümü | |
, , | |
Clang, GCC, , Turbo C, | |
, , , , | |
Etkilendikleri | B (BCPL, ), ALGOL 68, Çevirici, , FORTRAN |
Etkiledikleri | Birçok: , AWK, , , , C#, Objective-C, , D, Go, Java, JavaScript, , , Perl, PHP, , , Python, |
İşletim sistemi | Çapraz platform |
Olağan dosya uzantıları | .h .c |
C Dilinin geçmişi
C Dilinin erken tarihi
C'nin ilk gelişme safhaları 1969 ile 1974 arasında 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ı koyduğu bir programlama dili de geliştirmiştir.
1973'e kadar C yeterince güçlü bir hale gelmiş ve ilk başta 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. 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.
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 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 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 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 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.
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:
- : 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.
- : 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
gibi kitaplık işlevleri kullanılarak isteğe bağlı boyutta bellek blokları istenebilir; bu bloklar, kütüphane işlevi
veya
ç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. 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 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 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).
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 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 ü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.
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 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 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 , 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. , gömülü sistemler için geliştirilmiş, bu tür şüpheli kodlardan kaçınmak için özel bir kurallar dizisidir.
Diziler için , arabellek taşmasını algılama, , 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.
veya 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 için yaygın olarak kullanılmaktadır. 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 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 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 ile erişilebilir, böylece sisteme özgü özellikler (örn. , (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 (Common Gateway Interface) (CGI) kullanılarak için kullanılmıştır. C, hızı, kararlılığı ve neredeyse evrensel kullanılabilirliği nedeniyle yorumlanan (interpreted) diller yerine seçilmiş olabilir. Web geliştirmenin C'de yapılması artık yaygın bir uygulama değildir ve diğer birçok 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. Örneğin Python,Perl,Ruby, ve PHP 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, , , 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 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, 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 'nin her ikisi de C olmayan bir sahiptir ve bu derleyiciler, C dahil birçok dil için ön uçları (front ends) destekler.
Son kullanıcı uygulamaları
C ayrıca 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
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 gibi alanlar için geçerli değildir ve ö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 ve ; 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
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. - Standart kitaplığı kullanarak , kod açısından yoğundur ve açık bellek yönetimi gerekir.
- Dil, nesne yönelimini, , ç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 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. - Bazı amaçlar için, kısıtlı C stilleri benimsenmiştir. Örneğin. veya , hata olasılığını azaltmak amacıyla. 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#, 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. 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.
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., 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.
ve Objective-C'ye ek olarak, Ch, ve , C'nin neredeyse üst kümeleridir.
Kaynakça
- ^ Kernighan, Brian W.; Ritchie, Dennis M. (Şubat 1978). (1. bas.). : Prentice Hall. ISBN .
- ^ Kernighan, Brian W.; Ritchie, Dennis M. (Mart 1988). (2. bas.). : Prentice Hall. ISBN .
- ^ a b c d (2013). 21st Century C. . ISBN .
- ^ "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 . 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 . Erişim tarihi: 4 Ocak 2010.
- ^ Perkins, Luc (17 Eylül 2013). . Medium (İngilizce). 4 Ekim 2014 tarihinde kaynağından arşivlendi.
- ^ . ICT Academy at IITK (İngilizce). 13 Kasım 2018. 31 Mayıs 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Ekim 2022.
- ^ . docs.python.org. 5 Kasım 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Ekim 2022.
- ^ . opensource.com (İngilizce). 26 Mayıs 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Ekim 2022.
- ^ . www.ruby-lang.org. 12 Ağustos 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Ekim 2022.
- ^ . 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 . Erişim tarihi: 19 Nisan 2022.
- ^ corob-msft. . learn.microsoft.com (İngilizce). 24 Eylül 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Eylül 2022.
- ^ . gcc.gnu.org. 17 Haziran 2002 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Eylül 2022.
- ^ . 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). . SRC-RR-40. 5 Ocak 2022 tarihinde kaynağından (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 . Erişim tarihi: 5 Mart 2017.
- ^ O'Regan, Gerard (24 Eylül 2015). Pillars of computing : a compendium of select, pivotal technology firms. ISBN . 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 . OCLC 57965544.
- ^ Stroustrup, Bjarne (1993). "A History of C++: 1979−1991" (PDF). 2 Şubat 2019 tarihinde kaynağından (PDF). Erişim tarihi: 9 Haziran 2011.
Dış bağlantılar
- ISO C Working Group resmî web sitesi12 Şubat 2018 tarihinde Wayback Machine sitesinde .
- comp.lang.c Sıkça Sorulan Sorular25 Şubat 2009 tarihinde Wayback Machine sitesinde .
- ISO/IEC 9899 resmî C99 belgeleri23 Mayıs 2015 tarihinde Wayback Machine sitesinde . sasa
- Coding Programmer Page / C Library Reference and Examples21 Ocak 2013 tarihinde Wayback Machine sitesinde . (english)
- Happy Codings 7 Mayıs 2021 tarihinde Wayback Machine sitesinde . Programming Code Examples
wikipedia, wiki, viki, vikipedia, oku, kitap, kütüphane, kütübhane, ara, ara bul, bul, herşey, ne arasanız burada,hikayeler, makale, kitaplar, öğren, wiki, bilgi, tarih, yukle, izle, telefon için, turk, türk, türkçe, turkce, nasıl yapılır, ne demek, nasıl, yapmak, yapılır, indir, ücretsiz, ücretsiz indir, bedava, bedava indir, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, resim, müzik, şarkı, film, film, oyun, oyunlar, mobil, cep telefonu, telefon, android, ios, apple, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, pc, web, computer, bilgisayar
AT amp T Bell laboratuvarlarinda Ken Thompson ve Dennis Ritchie tarafindan UNIX Isletim Sistemi ni gelistirebilmek amaciyla B dilinden turetilmis yapisal bir programlama dilidir Gelistirilme tarihi 1972 olmasina ragmen yayginlasmasi Brian Kernighan ve Dennis M Ritchie tarafindan yayimlanan C Programlama Dili kitabindan sonra hizlanmistir Gunumuzde neredeyse tum isletim sistemlerinin Microsoft Windows GNU Linux BSD Minix yapiminda 95 lere varan oranda kullanilmis halen daha sistem surucu yazilimi isletim sistemi modulleri ve hiz gereken her yerde kullanilan oldukca yaygin ve sinirlari belirsiz oldukca keskin bir dildir kaynak belirtilmeli Keskinligi programciya sonsuz ozgurlugun yaninda cok buyuk hatalar yapabilme olanagi saglamasidir Programlamanin gelisim sureciyle beraber programlamanin karmasiklasmasi gereksinimlerin artmasi ile uygulama programlarinda nesne yonelimliligin ortaya cikmasindan sonra C programcilari buyuk olcude nesne yonelimliligi destekleyen C diline gecmislerdir CParadigmasiZorunlu yordamsal yapisalIlk cikisi1972TasarimciDennis RitchieGelistiriciAslen Dennis Ritchie amp Bell Labs ANSI C ANSI X3J11 ISO C ISO IEC JTC1 SC22 WG14Kararli surum Mart 2000 Onizleme surumu Clang GCC Turbo C EtkilendikleriB BCPL ALGOL 68 Cevirici FORTRANEtkiledikleriBircok AWK C C Objective C D Go Java JavaScript Perl PHP Python Isletim sistemiCapraz platformOlagan dosya uzantilari h cC Dilinin gecmisiC Dilinin erken tarihi C nin ilk gelisme safhalari 1969 ile 1974 arasinda AT amp T Bell Laboratuvarlari nda gerceklesti Ritchie ye gore en yaratici devre 1972 idi Dilin pek cok ozelligi B adli bir dilden turedigi icin yeni dile C adi verildi B dili yorumlanan bir dildi ve veri tipi destegi yoktu Yeni donanimlarin farkli veri tiplerini desteklemesi ve yorumlanan dillerin calisma zamaninda gorece yavas olmasi sebebi ile C dili tip destegi eklenmis ve derlenen B olarak gelistirildi B adinin kokeni konusunda ise soylentiler degisik Ken Thompson B nin BCPL programlama dilinden turedigini soylemektedir ancak Thompson esi Bonnie nin onuruna adini koydugu bir programlama dili de gelistirmistir 1973 e kadar C yeterince guclu bir hale gelmis ve ilk basta assembly dili ile yazilan UNIX in cekirdeginin buyuk kismi C ile yeniden yazilmistir Boylece UNIX cekirdegi bir assembly dili ile yazilmayan ilk isletim sistemlerinden biri olmustur C dilinin gecmisi 1978 de Ritchie ve Brian Kernighan The C Programming Language C Programlama Dili kitabinin ilk baskisini yayimladilar C programcilari tarafindan K amp R olarak bilinen bu kitap yillar boyunca C dilinin gayriresmi standardi olarak kullanildi C nin bu surumu bugun K amp R C olarak adlandirilir Bu kitabin ikinci baskisi ise asagida anlatilan ANSI C standardini icerir K amp R dilde su degisiklikleri yapti struct veri tipleri eklendi long int veri tipi eklendi unsigned int veri tipi eklendi operatoru olarak degistirildi K amp R C genellikle tum C derleyicilerinin desteklemek zorunda oldugu dilin en temel kismi olarak kabul edilir Uzun yillar boyunca ANSI C nin kabul edilisinden sonra bile yuksek tasinabilirlik Ingilizce portability istendiginde K amp R C C programcilari tarafindan ortak payda olarak kabul edilmistir Cunku bazi derleyiciler henuz ANSI C yi desteklemek uzere guncellenmemislerdi ve zaten iyi yazilmis bir K amp R C programi ayni zamanda ANSI C yi de destekliyordu K amp R C nin yayimlanmasini izleyen yillar icine dile AT amp T nin derleyicilerinin ve bazi baska bilgisayar ureticileri tarafindan desteklenen kimi gayriresmi ozellikler eklendi Bunlarin icinde asagidaki ozellikler de vardi void fonksiyonlar ve void veri tipi struct ya da union veri tipi donduren fonksiyonlar her bir struct in alan adlari icin ayri bir ad alani struct veri tipleri icin atama bir nesneyi yazmaya karsi korumali yapmak icin const anahtar sozcugu standart bir C kutuphanesi enumeration lar single precision float tipiANSI C ve ISO C dilleri 1970 lerin sonunda C en cok kullanilan mikrobilgisayar dili olarak BASIC in onune gecmeye basladi 1980 lerde ise IBM PC ile kullanilmak uzere benimsenmesiyle birlikte popularitesi iyice artmaya basladi Ayni zamanda Bell Laboratuvarlari nda Bjarne Stroustrup ve is arkadaslari C ye nesneye yonelim eklemek uzere calismaya baslamislardi C bugun UNIX dunyasinda en cok kullanilan dil olarak kalirken Stroustrup un gelistirip C adini verdigi dil Microsoft Windows isletim sisteminde en onemli dil oldu 1983 te Amerikan Ulusal Standartlar Enstitusu ANSI bir C standardi olusturmak icin bir kurul olusturdu Uzun ve yorucu bir calismadan sonra bu kurul standardi 1989 da tamamladi ve standart ANSI X3 159 1989 Programming Language C C Programlama Dili olarak yayimlandi Dilin bu versiyonu genellikle ANSI C olarak adlandirilir 1990 da bu standart kucuk degisikliklerle Uluslararasi Standartlar Orgutu ISO tarafindan da benimsenip olarak yayimlandi ANSI C yi olusturmanin amaclaridan biri K amp R C yi iceren ve dile sonradan katilan gayriresmi ozellikleri de dile katan bir standart olusturmakti Kurul ve daha yetenekli bir onislemciyi de standarda ekledi Bugun artik ANSI C neredeyse tum derleyiciler tarafindan desteklenmektedir Gunumuzde yazilmakta olan C programlarinin cogunlugu ANSI C standardina uygun olarak yazilmaktadir Yalnizca standart C kullanilarak yazilmis bir program standarda uyumlu her derleyici ile dogru bir bicimde derlenip calistirilabilir Ancak standart olmayan kutuphaneler kullanilarak yazilmis programlar belli bir platform ya da derleyici gerektirebilirler C99 ANSI standartlastirma isleminden sonra C dili uzun bir sure oldukca sabit kaldi ancak C gelismeyi surdurdu Buna bagli olarak 1990 larin sonunda ISO standardi guncellendi ve 1999 da ISO 9899 1999 olarak yayimlandi 2000 yilinin Mart inda ise C99 olarak bilinen bu standart ANSI tarafindan da benimsendi C99 un yeni ozellikleri soyle ozetlenebilir for ve bunun gibi yineleme ifadelerinde parantez ici ilk deklarasyonlara izin verilmesi Ornegin for int i 0 i lt 10 i deyimi c99 da gecerli iken c89 da gecerli degildir inline fonksiyonlar C da oldugu gibi artik degiskenler programin herhangi bir yerinde tanimlanabilirler long long int boolean complex gibi yeni veri tipleri degisken uzunluga sahip diziler C dan alinan ile baslayan tek satirlik program ici aciklamalar snprintf gibi yeni kutuphane fonksiyonlari stdint h gibi yeni baslik dosyalari C99 u bugun GCC ve bazi baska derleyiciler desteklemekteyken Microsoft ve Borland derleyicilerine C99 destegi eklemekte isteksiz davranmaktadirlar Merhaba dunya ornegiMerhaba dunya ornegi ilk olarak The C Programming Language kitabinin birinci baskisinda kullanildi ve bircok programlama kitabinda kullanilan tanitici ornek haline geldi Bu ornek terminal ekranina merhaba dunya yazar Kitaptaki kodun orijinal hali include lt stdio h gt main printf merhaba dunya n Standart olarak onaylanan merhaba dunya versiyonu include lt stdio h gt int main printf merhaba dunya return 0 1 satir Bir onislemci komutudur ve daha program derlenmeden once devreye girerek istenilen degisiklikleri kaynak dosya uzerinde gerceklestirir Bu programda stdio h standart input output baslik dosyasini programa dahil eder Bu baslik dosyasinda standart giris cikis fonksiyonlarinin prototipleri mevcuttur Burada programdaki komutun amaci printf fonskiyonunu programa dahil etmektir 2 satir Bu satirda programda ise main fonksiyonun tanimlanmasiyla baslanmistir main fonksiyonun C dilinde ozel bir amaci vardir Programin calisma zamaninda basladigi yer main fonksiyonudur 3 satir main fonksiyonunun basladigi yeri belirtir 4 satir Bu satirda merhaba dunya yazisini karakter dizisini ekrana bastirmak icin printf fonksiyonu cagrilir ki bu fonksiyonu 1 satirdaki stdio h baslik dosyasi ile programa dahil etmistik 5 satir return kodu main fonksiyonumuzu 0 geri donus degeriyle sonlandirir 6 satir main fonksiyonunun bittigi yeri belirtir Hafiza yonetimiBir programlama dilinin en onemli islevlerinden biri bellegi ve bellekte depolanan nesneleri yonetmek icin olanaklar saglamaktir C nesneler icin bellek ayirmanin uc temel yolunu sunar nesne icin alan derleme zamaninda ikili dosyada saglanir bu nesnelerin onlari iceren ikili bellege yuklendigi surece bir kapsami extent veya omru lifetime vardir gecici nesneler yiginda stack saklanabilir ve bu alan otomatik olarak serbest birakilir ve bildirildikleri bloktan cikildiktan sonra yeniden kullanilabilir Dinamik bellek ayirma calisma zamaninda yigin adi verilen bir bellek bolgesinden gibi kitaplik islevleri kullanilarak istege bagli boyutta bellek bloklari istenebilir bu bloklar kutuphane islevi veya cagrilarak yeniden kullanim icin serbest birakilincaya kadar devam eder Bu uc yaklasim farkli durumlarda uygundur ve cesitli odunlesimlere sahiptir Ornegin statik bellek tahsisi allocation cok az tahsis ek yukune sahiptir Otomatik tahsis biraz daha fazla ek yuk icerebilir ve dinamik bellek ayirma tahsisi hem allocation hem de deallocation icin potansiyel olarak buyuk bir ek yuke sahip olabilir Statik nesnelerin kalici dogasi islev fonksiyon cagrilari arasinda durum bilgilerini korumak icin kullanislidir Otomatik ayirmanin kullanimi kolaydir ancak yigin alani genellikle statik bellek veya yigin alanindan cok daha sinirli ve gecicidir ve dinamik bellek tahsisi boyutu yalnizca calisma zamaninda bilinen nesnelerin uygun sekilde tahsis edilmesini saglar Cogu C programi ucunu de kapsamli bir sekilde kullanir Mumkun oldugunda otomatik veya statik ayirma genellikle en basitidir cunku depolama derleyici tarafindan yonetilir ve programciyi potansiyel olarak hataya acik depolamayi manuel olarak tahsis etme ve serbest birakma gorevinden kurtarir Ancak bircok veri yapisinin boyutu calisma zamaninda degisebilir ve statik ayirmalarin ve C99 dan onceki otomatik ayirmalarin derleme zamaninda sabit bir boyutu olmasi gerektiginden dinamik ayirmanin gerekli oldugu bircok durum vardir C99 standardindan once degisken boyutlu diziler bunun yaygin bir ornegiydi Dinamik olarak ayrilmis dizilerin bir ornegi icin mallochakkindaki makaleye bakin Kontrolsuz sonuclarla calisma zamaninda basarisiz olabilen otomatik tahsisin aksine dinamik tahsis islevleri gerekli depolama tahsis edilemediginde bir gosterge bos gosterici degeri seklinde dondurur Cok buyuk olan statik ayirma genellikle program yurutmeye baslamadan once baglayici veya yukleyici tarafindan algilanir Aksi belirtilmedikce statik nesneler program baslangicinda sifir veya bos gosterici degerleri icerir Otomatik ve dinamik olarak tahsis edilen nesneler yalnizca bir baslangic degeri acikca belirtilmisse baslatilir aksi halde baslangicta belirsiz degerlere sahiptirler tipik olarak depolamada hangi bit deseni bulunursa bulunsun bu tur icin gecerli bir degeri bile temsil etmeyebilir Program baslatilmamis bir degere erismeye calisirsa sonuclar tanimsizdir Bircok modern derleyici bu sorunu tespit etmeye ve uyarmaya calisir ancak hem olusabilir Yigin bellek tahsisi mumkun oldugunca yeniden kullanilmak uzere herhangi bir programdaki gercek kullanimiyla senkronize edilmelidir Ornegin bir yigin bellek tahsisine yonelik tek isaretci kapsam disina cikarsa veya acikca tahsis edilmeden once degerinin uzerine yazilirsa bu bellek daha sonra yeniden kullanim icin kurtarilamaz ve esasen program tarafindan kaybedilir bu bir bellek sizintisi olarak bilinen bir olgudur Tersine bellegin serbest birakilmasi mumkundur ancak daha sonra basvurulmakta ve bu da ongorulemeyen sonuclara yol acmaktadir Tipik olarak hata belirtileri programin hataya neden olan kodla ilgisi olmayan bir bolumunde belirir ve bu da hatanin teshis edilmesini zorlastirir Bu tur sorunlar otomatik cop toplama ile dillerde iyilestirilir KutuphanelerC programlama dili birincil uzanti yontemi primary method of extension olarak kutuphaneleri kullanir C de bir kitaplik tek bir arsiv dosyasinda bulunan bir dizi islevdir Her kutuphane tipik olarak bir program tarafindan kullanilabilecek kutuphane icinde bulunan islevlerin prototiplerini ve bu islevlerle kullanilan ozel veri turlerinin ve makro sembollerinin bildirimlerini iceren bir sahiptir Bir programin kutuphaneyi kullanabilmesi icin kutuphanenin baslik dosyasini icermesi ve kutuphanenin cogu durumda derleyici bayraklari gerektiren programla baglantili olmasi gerekir ornegin lm matematik kitapligini bagla icin kisayol En yaygin C kutuphanesi ISO ve ANSI C standartlari tarafindan belirtilen ve her C uygulamasiyla birlikte gelen C standart kutuphanesidir gomulu sistemler gibi sinirli ortamlari hedefleyen uygulamalar standart kutuphanenin yalnizca bir alt kumesini saglayabilir Bu kutuphane akis giris ve cikisini bellek ayirmayi matematigi karakter dizilerini ve zaman degerlerini destekler Birkac ayri standart baslik ornegin stdio h bu ve diger standart kutuphane olanaklari icin arabirimleri belirtir Diger bir yaygin C kutuphanesi islevi kumesi ozellikle Unix ve Unix benzeri sistemler icin hedeflenen uygulamalar tarafindan kullanilanlardir ozellikle cekirdege bir arabirim saglayan islevlerdir Bu islevler POSIX ve gibi cesitli standartlarda detaylandirilmistir Bircok program C ile yazildigindan cok cesitli baska kutuphaneler de mevcuttur kutuphaneler genellikle C ile yazilir cunku C derleyicileri verimli uretir programcilar daha sonra rutinlerin Java Perl ve Python gibi daha yuksek seviyeli dillerden kullanilabilmesi icin kutuphaneye arayuzler olusturur Dosya isleme ve akislar Dosya girisi ve cikisi G C C dilinin bir parcasi degildir bunun yerine kitapliklar C standart kitapligi gibi ve bunlarla iliskili baslik dosyalari ornegin stdio h tarafindan islenir Dosya isleme genellikle akislar araciligiyla calisan yuksek seviyeli girdi ve ciktilar araciligiyla gerceklestirilir Bu acidan bir stream cihazlardan bagimsiz bir veri akisi iken bir dosya somut bir cihazdir Ust duzey giris ve cikis bir akisin bir dosyayla iliskilendirilmesi yoluyla yapilir C standart kitapliginda son hedefe gonderilmeden once verileri depolamak icin gecici olarak bir arabellek bir bellek alani veya queue kullanilir Bu ornegin sabit surucu veya gibi daha yavas aygitlari beklemek icin harcanan sureyi azaltir Dusuk seviyeli giris ve cikis islevleri standart C kitapliginin bir parcasi degildir ancak genellikle ciplak metal bare metal programlamanin cogu gibi herhangi bir isletim sisteminden bagimsiz programlama parcasidir Birkac istisna disinda uygulamalar dusuk seviyeli girdi ve cikti icerir Dil araclariC programcilarinin tanimsiz davranisa veya muhtemelen hatali ifadelere sahip derleyici tarafindan saglanandan daha buyuk bir titizlikle ifadeleri bulmasina ve duzeltmesine yardimci olmak icin bir dizi arac gelistirilmistir Tool digerlerine yol acan ilk turdu Otomatik kaynak kodu checking ve auditing herhangi bir dilde faydalidir ve C icin Lint gibi bu tur bircok arac vardir Yaygin bir uygulama bir program ilk yazildiginda supheli kodu algilamak icin Lint kullanmaktir Bir program Lint i gectiginde C derleyicisi kullanilarak derlenir Ayrica bircok derleyici istege bagli olarak aslinda hata olmasi muhtemel sozdizimsel olarak gecerli yapilar hakkinda uyarabilir gomulu sistemler icin gelistirilmis bu tur supheli kodlardan kacinmak icin ozel bir kurallar dizisidir Diziler icin arabellek tasmasini algilama izleme ve otomatik cop toplama gibi C nin standart bir parcasi olmayan eylemleri gerceklestirmek icin derleyiciler kitapliklar ve isletim sistemi duzeyinde mekanizmalar da vardir veya gibi araclar ve bellek ayirma islevlerinin ozel surumlerini iceren kitapliklarla baglanti kurma bellek kullanimindaki calisma zamani hatalarini ortaya cikarmaya yardimci olabilir KullanimC Programlama DiliSistem programlamasinda kullanim gerekcesi C isletim sistemlerinin ve gomulu sistem uygulamalarinin uygulanmasinda icin yaygin olarak kullanilmaktadir Bu birkac nedenden dolayidir Derlemeden sonra olusturulan kod pek cok sistem ozelligi gerektirmez ve bazi onyukleme kodlarindan basit bir sekilde cagrilabilir yurutmesi kolaydir C dili deyimleri ve ifadeleri tipik olarak hedef islemci icin talimat dizileriyle iyi bir sekilde eslesir ve sonuc olarak sistem kaynaklarinda dusuk bir talebi vardir yurutulmesi hizlidir Zengin operator seti ile C dili hedef CPU larin bircok ozelligini kullanabilir Belirli bir CPU nun daha ezoterik talimatlara sahip oldugu durumlarda bu talimatlardan yararlanmak icin belki de bir dil varyanti olusturulabilir pratik olarak tum hedef CPU ozelliklerini kullanabilir Dil yapilarin ikili veri bloklari uzerine bindirilmesini kolaylastirarak verilerin anlasilmasina gezinmesine ve degistirilmesine olanak tanir veri yapilari hatta dosya sistemleri yazabilir Dil tam sayi aritmetigi ve mantigi ve belki de farkli boyutlardaki kayan nokta sayilari icin bit isleme dahil olmak uzere zengin bir operator grubunu destekler uygun sekilde yapilandirilmis verileri etkili bir sekilde isleyebilir C oldukca kucuk bir dildir yalnizca bir avuc ifade icerir ve kapsamli hedef kod olusturan cok fazla ozelligi yoktur anlasilirdir C ara sira dunyayi durduran cop toplama olaylari icin herhangi bir endise duymadan bellek isleme operasyonlarina makul verimlilik ve ongorulebilir zamanlama saglayan bellek allocation ve deallocation uzerinde dogrudan kontrole sahiptir ongorulebilir bir performansa sahiptir Platform donanimina isaretciler ve ile erisilebilir boylece sisteme ozgu ozellikler orn G C kayitlari e g Control Status Registers I O registers C ile yazilmis kodla yapilandirilabilir ve kullanilabilir uzerinde calistigi platformla iyi etkilesime girer Baglayiciya ve ortama bagli olarak C kodu Assembly dilinde yazilmis kitapliklari da cagirabilir ve Assembly dilinden cagrilabilir diger alt duzey kodlarla iyi bir sekilde birlikte calisir C ve onun arama kurallari ve baglayici yapilari hem C ye hem de C den yapilan aramalarla birlikte diger yuksek seviyeli dillerle birlikte yaygin olarak kullanilir diger yuksek seviyeli kodlarla iyi bir sekilde birlikte calisir C kutuphaneler cerceveler acik kaynak derleyiciler hata ayiklayicilar ve yardimci programlar dahil olmak uzere cok ergin ve genis bir ekosisteme sahiptir ve fiili standarttir Suruculerin C de zaten mevcut olmasi veya bir C derleyicisinin arka ucuna back end benzer bir CPU mimarisi olmasi muhtemeldir bu nedenle baska bir dil secmek icin azaltilmis tesvik vardir Bir kez web gelistirme icin kullanildi Tarihsel olarak C bazen web uygulamasi sunucu ve tarayici arasinda bilgi icin bir ag gecidi olarak Common Gateway Interface CGI kullanilarak icin kullanilmistir C hizi kararliligi ve neredeyse evrensel kullanilabilirligi nedeniyle yorumlanan interpreted diller yerine secilmis olabilir Web gelistirmenin C de yapilmasi artik yaygin bir uygulama degildir ve diger bircok mevcuttur Diger bazi dillerin kendileri C ile yazilmistir C nin genis kullanilabilirliginin ve verimliliginin bir sonucu diger programlama dillerinin derleyicileri kitapliklari ve yorumlayicilarinin genellikle C de uygulanmasidir Ornegin Python Perl Ruby ve PHP referans uygulamalari C ile yazilmistir Hesaplama acisindan yogun kitapliklar icin kullanilir C programcilarin algoritmalarin ve veri yapilarinin verimli uygulamalarini olusturmalarini saglar cunku donanimdan soyutlama katmani incedir ve ek yuku dusuktur bu da hesaplama acisindan yogun programlar icin onemli bir kriterdir Ornegin Mathematica ve MATLAB tamamen veya kismen C dilinde yazilmistir Bircok dil C de kitaplik islevlerini cagirmayi destekler Ornegin Python tabanli framework NumPy yuksek performans ve donanim etkilesimi yonleri icin C yi kullanir Ara dil olarak C C bazen diger dillerin uygulamalari tarafindan bir olarak kullanilir Bu yaklasim tasinabilirlik veya kolaylik icin kullanilabilir C yi bir ara dil olarak kullanarak makineye ozel ek kod olusturucular gerekli degildir C olusturulan kodun derlenmesini destekleyen satir numarasi onislemci yonergeleri ve baslatici listelerinin sonunda istege bagli gereksiz virguller gibi bazi ozelliklere sahiptir Bununla birlikte C nin bazi eksiklikleri gibi ara diller olarak kullanilmak uzere ozel olarak tasarlanmis diger C tabanli dillerin gelistirilmesine yol acmistir Ayrica cagdas buyuk derleyiciler GCC ve nin her ikisi de C olmayan bir sahiptir ve bu derleyiciler C dahil bircok dil icin on uclari front ends destekler Son kullanici uygulamalari C ayrica uygulamalarini uygulamak icin yaygin olarak kullanilmaktadir Bununla birlikte bu tur uygulamalar daha yeni daha yuksek seviyeli dillerde de yazilabilir Sinirlamalarthe power of assembly language and the convenience of assembly language Dennis Ritchie C populer etkili ve son derece basarili olmasina ragmen asagidakiler de dahil olmak uzere dezavantajlari vardir malloc ve free ile standart dinamik bellek isleme hataya aciktir Hatalar sunlari icerir Bellek ayrildiginda ancak serbest birakilmadiginda bellek sizdiriyor ve onceden bosaltilan bellege erisim Isaretcilerin kullanimi ve bellegin dogrudan manipulasyonu belki de programci hatasi veya yetersiz veri denetimi nedeniyle bellegin bozulmasinin mumkun oldugu anlamina gelir Bazi tip kontrolu vardir ancak gibi alanlar icin gecerli degildir ve onemsiz veya yanlislikla atlanabilir Yuksek seviyeli programlama dillerinde yaygin olarak bulunan string degisken tipi C de bulunmadigi icin bunun yerine char ile belirli bir uzunlukta karakter dizisi array seklinde hafizada tutulur Mesela char a Merhaba seklinde bir karakter dizisi tanimlanabilir Fakat daha sonra bu degiskene a Nasilsin seklinde direkt olarak yeni bir deger atanamaz Bunun yerine strcpy fonksiyonu kullanilabilir Bu da diger programlama dillerine nazaran C nin zorluklarindan biridir Derleyici tarafindan uretilen kodun kendisi birkac kontrol icerdiginden programcinin tum olasi sonuclari goz onunde bulundurmasi ve arabellek tasmalarina dizi sinirlari denetimine yigin tasmalarina bellek tukenmesine tur kosullarina dizi yalitimina vb karsi koruma yuku vardir Isaretcilerin kullanimi ve bu araclarin calisma zamani manipulasyonu derleme zamaninda belirlenemeyen ayni verilere aliasing erismenin iki yolu olabilir Bu diger dillerde mevcut olabilecek bazi optimizasyonlarin C de mumkun olmadigi anlamina gelir FORTRAN daha hizli kabul edilir Standart kitaplik islevlerinden bazilari orn scanf arabellek tasmalarina neden olabilir Olusturulan kodda dusuk seviyeli degiskenler icin sinirli standartlastirma destegi vardir ornegin farkli islev ve farkli yapi paketleme kurallari daha buyuk tam sayilar icinde farkli bayt siralamasi endianness dahil Pek cok dil uygulamasinda bu seceneklerden bazilari onislemci yonergesi pragma aile bazilari ise ek anahtar sozcuklerle or cdeclcagri kuralini kullanin Ancak yonerge ve secenekler tutarli bir sekilde desteklenmemektedir Standart kitapligi kullanarak kod acisindan yogundur ve acik bellek yonetimi gerekir Dil nesne yonelimini calisma zamani ifadesi degerlendirmesini jenerikleri vb dogrudan desteklemez Dil ozelliklerinin uygunsuz kullanimina karsi surdurulemez kodlara yol acabilecek birkac koruma vardir Zor kod icin bu tesis International Obfuscated C Code Contest ve Underhanded C Contest gibi yarismalarla kutlandi C istisna isleme icin standart destekten yoksundur ve yalnizca hata denetimi icin sunar setjmp velongjmp standart kitaplik islevleri 53 te makrolar araciligiyla bir try catch mekanizmasini uygulamak icin kullanilmistir Bazi amaclar icin kisitli C stilleri benimsenmistir Ornegin veya hata olasiligini azaltmak amaciyla gibi veritabanlari C vb nin guvenlik aciklarina sahip olma yollarini ve azaltma onerilerini saymaya calisir Bazi dezavantajlara karsi hafifletebilecek araclar var Cagdas C derleyicileri bircok olasi hatayi belirlemeye yardimci olmak icin uyarilar olusturabilen kontroller icerir Bu dezavantajlardan bazilari diger dillerin olusturulmasina yol acmistir Ilgili dillerCesitli programlama dillerinin populerliginin bir karsilastirmasini gosteren TIOBE indeks grafigi C C C D Go Java JavaScript Perl PHP Rust ve Unix in C kabugu gibi sonraki bircok dili hem dogrudan hem de dolayli olarak etkilemistir En yaygin etki sozdizimsel olmustur bahsedilen dillerin tumu C nin deyim statement ve az ya da cok taninabilir sekilde ifade expression sozdizimini C den bazen kokten farkli olan tur sistemleri veri modelleri ve veya buyuk olcekli program yapilari ile birlestirir Komut dosyasi olusturmak icin de kullanilabilen Ch ve CINT dahil olmak uzere birkac C veya C ye yakin yorumlayici mevcuttur Nesne yonelimli programlama dilleri populer hale geldiginde C ve Objective C C nin nesne yonelimli yetenekler saglayan iki farkli uzantisiydi Her iki dil de baslangicta kaynaktan kaynaga source to source derleyiciler olarak uygulandi kaynak kodu C ye cevrildi ve ardindan bir C derleyicisi ile derlendi C programlama dili baslangicta C with Classes olarak adlandirildi Bjarne Stroustrup tarafindan C benzeri bir sozdizimi ile nesne yonelimli islevsellik saglamaya yonelik bir yaklasim olarak gelistirilmistir C daha fazla yazma gucu kapsam belirleme generic programming ve nesne yonelimli programlamada yararli olan diger araclari ekler ve sablonlar araciligiyla genel programlamaya izin verir Neredeyse C nin bir ust kumesi olan C simdi birkac istisna disinda C nin cogunu destekliyor Objective C baslangicta C nin uzerinde cok ince bir katmandi ve hibrit bir dinamik statik yazim paradigmasi kullanarak nesne yonelimli programlamaya izin veren kati bir C ust kumesi olmaya devam ediyor Objective C sozdizimini hem C den hem de Smalltalk tan alir on isleme ifadeler islev bildirimleri ve islev cagrilarini iceren sozdizimi C den miras alinirken nesne yonelimli ozelliklerin sozdizimi orijinal olarak Smalltalk tan alinmistir C ve Objective C ye ek olarak Ch ve C nin neredeyse ust kumeleridir Kaynakca Kernighan Brian W Ritchie Dennis M Subat 1978 1 bas Prentice Hall ISBN 0 13 110163 3 Kernighan Brian W Ritchie Dennis M Mart 1988 2 bas Prentice Hall ISBN 0 13 110362 8 a b c d 2013 21st Century C ISBN 978 1 4493 2714 9 Man Page for lint freebsd Section 1 unix com 24 Mayis 2001 Erisim tarihi 15 Temmuz 2014 Dale Nell B Weems Chip 2014 Programming and problem solving with C 6 bas Burlington MA Jones amp 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 Subat 2010 tarihinde kaynagindan Erisim tarihi 4 Ocak 2010 Perkins Luc 17 Eylul 2013 Medium Ingilizce 4 Ekim 2014 tarihinde kaynagindan arsivlendi ICT Academy at IITK Ingilizce 13 Kasim 2018 31 Mayis 2021 tarihinde kaynagindan arsivlendi Erisim tarihi 11 Ekim 2022 docs python org 5 Kasim 2012 tarihinde kaynagindan arsivlendi Erisim tarihi 11 Ekim 2022 opensource com Ingilizce 26 Mayis 2022 tarihinde kaynagindan arsivlendi Erisim tarihi 11 Ekim 2022 www ruby lang org 12 Agustos 2013 tarihinde kaynagindan arsivlendi Erisim tarihi 11 Ekim 2022 freeCodeCamp org Ingilizce 3 Agustos 2022 4 Agustos 2022 tarihinde kaynagindan arsivlendi Erisim tarihi 11 Ekim 2022 Metz Cade Dennis Ritchie The Shoulders Steve Jobs Stood On Wired 12 Nisan 2022 tarihinde kaynagindan Erisim tarihi 19 Nisan 2022 corob msft learn microsoft com Ingilizce 24 Eylul 2022 tarihinde kaynagindan arsivlendi Erisim tarihi 24 Eylul 2022 gcc gnu org 17 Haziran 2002 tarihinde kaynagindan arsivlendi Erisim tarihi 24 Eylul 2022 Intel Ingilizce 10 Nisan 2022 tarihinde kaynagindan arsivlendi Erisim tarihi 10 Nisan 2022 Roberts Eric S 21 Mart 1989 Implementing Exceptions in C PDF SRC RR 40 5 Ocak 2022 tarihinde kaynagindan PDF Erisim tarihi 4 Ocak 2022 McMillan Robert 1 Agustos 2013 Is Java Losing Its Mojo Wired 15 Subat 2017 tarihinde kaynagindan Erisim tarihi 5 Mart 2017 O Regan Gerard 24 Eylul 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 Subat 2019 tarihinde kaynagindan PDF Erisim tarihi 9 Haziran 2011 Dis baglantilarISO C Working Group resmi web sitesi12 Subat 2018 tarihinde Wayback Machine sitesinde comp lang c Sikca Sorulan Sorular25 Subat 2009 tarihinde Wayback Machine sitesinde ISO IEC 9899 resmi C99 belgeleri23 Mayis 2015 tarihinde Wayback Machine sitesinde sasa Coding Programmer Page C Library Reference and Examples21 Ocak 2013 tarihinde Wayback Machine sitesinde english Happy Codings 7 Mayis 2021 tarihinde Wayback Machine sitesinde Programming Code Examples