İçeriğe atla

C (programlama dili)

C
ParadigmasıZorunlu (yordamsal), yapısal
İlk çıkışı1972
TasarımcıDennis Ritchie
GeliştiriciAslen:
Dennis Ritchie & Bell Labs
ANSI C: ANSI X3J11
ISO C: ISO/IEC JTC1/SC22/WG14
Kararlı sürümC99 (Mart 2000)
Önizleme sürümüC1X
Önemli uygulamalarıClang, GCC, MSVC, Turbo C, Watcom C
LehçeleriCyclone, Unified Parallel C, Split-C, Cilk, C*
EtkilendikleriB (BCPL, CPL), ALGOL 68, Çevirici, PL/I, FORTRAN
EtkiledikleriBirç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 eklendi
  • long int veri tipi eklendi
  • unsigned 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 ve void * veri tipi
  • struct ya da union 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 mallocgibi kitaplık işlevleri kullanılarak isteğe bağlı boyutta bellek blokları istenebilir; bu bloklar, kütüphane işlevi realloc veya free ç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 mallochakkı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

C Programlama Dili

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

the power of assembly language and the convenience of ... assembly language

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 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.
  • İş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

Çeşitli programlama dillerinin popülerliğinin bir karşılaştırmasını gösteren TIOBE indeks grafiği[19]

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

  1. ^ Kernighan, Brian W.; Ritchie, Dennis M. (Şubat 1978). C Programlama Dili (1. bas.). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110163-3. 
  2. ^ Kernighan, Brian W.; Ritchie, Dennis M. (Mart 1988). C Programlama Dili (2. bas.). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110362-8. 
  3. ^ a b c d Klemens, Ben (2013). 21st Century C. O'Reilly Media. ISBN 978-1-4493-2714-9. 
  4. ^ "Man Page for lint (freebsd Section 1)". unix.com. 24 Mayıs 2001. Erişim tarihi: 15 Temmuz 2014. 
  5. ^ Dale, Nell B.; Weems, Chip (2014). Programming and problem solving with C++ (6. bas.). Burlington, MA: Jones & Bartlett Learning. ISBN 978-1449694289. OCLC 894992484. 
  6. ^ Dr. Dobb's Sourcebook. U.S.A.: Miller Freeman, Inc. November–December 1995. 
  7. ^ "Using C for CGI Programming". linuxjournal.com. 1 Mart 2005. 13 Şubat 2010 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Ocak 2010. 
  8. ^ 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. 
  9. ^ "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. 
  10. ^ "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. 
  11. ^ "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. 
  12. ^ "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. 
  13. ^ "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. 
  14. ^ 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. 
  15. ^ 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. 
  16. ^ "Pragmas (The C Preprocessor)". gcc.gnu.org. 17 Haziran 2002 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Eylül 2022. 
  17. ^ "Pragmas". Intel (İngilizce). 10 Nisan 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Nisan 2022. 
  18. ^ 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. 
  19. ^ 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. 
  20. ^ O'Regan, Gerard (24 Eylül 2015). Pillars of computing : a compendium of select, pivotal technology firms. ISBN 978-3319214641. OCLC 922324121. 
  21. ^ 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. 
  22. ^ 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

İlgili Araştırma Makaleleri

<span class="mw-page-title-main">Pascal (programlama dili)</span> yüksek seviyeli programlama dili

Pascal bilgisayar programlama dili pek çok öğrenciye bilgisayar programlamayı öğreten ve çeşitli versiyonları bugün hâlâ yaygın olarak kullanılmaya devam eden en önemli programlama dillerinden biridir. İlk Macintosh işletim sisteminin çoğu ve TeX Pascal ile yazılmıştır.

<span class="mw-page-title-main">C♯</span> programlama dili

C#; Microsoft tarafından .NET Teknolojisi için geliştirilen modern bir programlama dilidir. Sözdizimi C-like bir deneyim sunar.

<span class="mw-page-title-main">C++</span> bir programlama dili

C++, Bjarne Stroustrup tarafından 1979 yılında Bell Laboratuvarları'nda geliştirilmeye başlanmış, C'yi kapsayan ve çok paradigmalı, yaygın olarak kullanılan, genel amaçlı bir programlama dilidir.

<span class="mw-page-title-main">Derleyici</span> kaynak kodunu bilgisayarın işleyebileceği koda dönüştüren program

Derleyici, kaynak kodu makine koduna dönüştüren yazılımdır. Bir programlama dilinin derleyicisi, o programlama dili kullanılarak yazılmış olan kodu hedef işlemci mimarisine göre uygun şekilde makine koduna derler ve genellikle çıktı olarak yürütülebilir dosyanın oluşturulmasını sağlar. Bu eyleme derleme denir. Bir başka ifadeyle derleyici, bir tür yazı işleyicidir; girdi olarak yazı alır ve çıktı olarak yazı verir.

<span class="mw-page-title-main">Mikrodenetleyici</span>

Mikrodenetleyici bir VLSI entegre devre çipinde küçük bir bilgisayar'dır. Mikrodenetleyici, bellek ve programlanabilir giriş/çıkış çevre birimleri ile birlikte bir veya daha fazla CPU kapsar.

<span class="mw-page-title-main">Ada (programlama dili)</span> programlama dili

Ada, yapısal, statik tipli, zorunlu, geniş spektrumlu ve nesne yönelimli bir üst düzey bilgisayar programlama dilidir. Pascal ve diğer dillerin genişletilmiş halidir. Gömülü design-by-contract (DbC), güçlü yazımı, açık eşzamanlı, senkronize mesaj geçişi, korunmuş objeli ve belirsiz bir dildir. Ada kod güvenliğini ve sürdürebilirliğini derleyicide hataları bularak geliştirdi.

<span class="mw-page-title-main">Bellek yönetimi</span>

Ana belleğin işlemler arasında paylaştırılmasına ana bellek yönetimi ya da bellek yönetimi adı verilir. İşletim sisteminin bu amaçla oluşturulan kesimine de bellek yöneticisi adı verilir.

Veri yapısı, bilgisayar ortamında verilerin etkin olarak saklanması ve işlenmesi için kullanılan yapı.

Arabellek aşımı ya da arabellek taşkını, iki yazılım arasında veri iletişimi için ayrılmış olan bir arabelleğe boyutundan daha fazla veri konulması ile ortaya çıkan durumdur.

<span class="mw-page-title-main">Assembly</span> uygulanan işlemlerle programlama dilinin birbirine çok yakın olduğu düşük seviye programlama dilleri

Assembly dili, bir işlemcinin komut kümesi üzerine tanımlanmış alt seviye bir dildir. Assembly dili kolay hatırlanabilir semboller tanımlar ve böylece işlemcinin makina koduna karşılık gelen sayı dizilerinin bilinmesine gerek kalmaz. Assembly dili, platformdan bağımsız yüksek seviyeli programlama dillerinin aksine, işlemci mimarisine bağımlıdır. Tipik uygulamaları; cihaz sürücüleri, alt seviyeli dahili (embedded) ve gerçek zamanlı sistemlerdir. Bır assembly programı assembler kullanılarak makine koduna çevrilir.

Yorumlayıcı, yazılımı kısım kısım ele alarak doğrudan çalıştırır. Yorumlayıcılar standart bir çalıştırılabilir kod üretmezler. Yorumlama işlemi aşama aşama yapılmadığı için genellikle ilk hatanın bulunduğu yerde programın çalışması kesilir.

Bilgisayar Biliminde düşük seviyeli programlama komut kümesinde hiç soyutlama imkânı vermeyen ya da az bir soyutlama sağlayan programlama dili anlamına gelir. Buradaki "düşük" kelimesi programlama diliyle makine dili arasında bulunmayan ya da az bulunan bir soyutlama imkânını temsil eder. Bu yüzden düşük seviyeli programlama dilleri "donanıma yakın" programlama olarak da anılır.

Programlama paradigmaları, programlama dillerini özelliklerine göre sınıflandırmanın bir yoludur. Diller birden fazla paradigma içinde sınıflandırılabilir.

<span class="mw-page-title-main">Java sanal makinesi</span>

Java Sanal Makinesi (JSM), Java platformunun nesne modülü formatı olan class uzantılı sınıf dosyalarının belleğe yüklenip çalıştırılması için gereken hizmetleri sunan bir sistem programıdır ve temel görevinin sınıf dosyalarını yorumlamak olduğu söylenebilir. Ancak, JSM'ni salt bir yorumlayıcı olarak görmek büyük haksızlık olur. Zira, yorumlama ile birlikte JSM'nin şu görevleri de vardır.

<span class="mw-page-title-main">OpenMP</span>

OpenMP; Solaris, IBM AIX, HP-UX, GNU/Linux, MAC OS X ve Windows işletim sistemleri üzerinde çoğu işlemci mimarisi üzerinde Fortran, C++, C programlama dillerinde çoklu platform paylaşımlı bellek çoklu işlemeyi destekleyen bir uygulama geliştirme arayüzüdür, yani bir API'dir. OpenMP derleyici yönergelerinin kütüphane rutinlerini ve ortam değişkenlerinin çalışma zamanı davranışını etkileyen bir kümesini içerir.

<span class="mw-page-title-main">Yapay zekâya yönelik programlama dilleri listesi</span> Vikimedya liste maddesi

Yapay zekâ araştırmacıları yapay zekâya yönelik programlama dilleri geliştirmişlerdir.

Dart, ilk kez Google tarafından geliştirilen ve daha sonraları ECMA tarafından standart (ECMA-408) haline getirilen açık kaynaklı ve genel-amaçlı bir programlama dilidir. Dart dili kullanılarak web, sunucu, mobil uygulamalar ve IoT cihazları geliştirilebilir.

<span class="mw-page-title-main">Ayrıştırıcı (yazılım)</span>

Ayrıştırıcı, girdi verilerini alır ve girdinin yapısal bir temsilini vererek, süreçte doğru sözdizimini kontrol eden bir veri yapısı oluşturan bir yazılım bileşenidir. Ayrıştırma öncesinde veya sonrasında başka adımlar izlenebilir veya bunlar tek bir adımda birleştirilebilir. Ayrıştırıcı, genelde girilen karakter dizisinden belirteçler oluşturan ayrı bir sözcük tabanlı analiz motorunu takip eder. Ayrıştırıcılar elle programlanabilir veya bir ayrıştırıcı üreteci tarafından otomatik olarak veya yarı otomatik olarak oluşturulabilir. Ayrıştırma, biçimlendirilmiş çıktı üretimlerini tek bir şablonda tamamlama görevi görür. Bunlar, farklı etki alanlarına uygulanabilir, ancak bir derleyicinin girdi ve çıktı aşamaları gibi genellikle bir arada sunulur.

AOT derlemesi C veya C++ gibi daha üst düzey bir programlama dili, Java bytecode veya .NET Framework Ortak Ara Dil kodu gibi bir ara temsilciliğin yerli bir makine diline derleme eylemidir. Sonuçta ortaya çıkan ikili dosya yerel olarak çalıştırılabilir.

C programlama dilinde, struct (yapı), bir bellek bloğunda tek bir ad altında fiziksel olarak gruplandırılmış değişkenler listesini tanımlayan ve farklı değişkenlere tek bir işaretçi (pointer) aracılığıyla erişilmesine izin veren bileşik bir veri türüdür. Struct veri tipi, başka veri türlerini içerebilir. Bu nedenle dosya uzunluğu, ad, uzantı... veya diğer karma türdeki kayıtlar gibi karma veri türü kayıtları için kullanılır.