Kontentke ótiw

C (programmalastırıw tili)

Wikipedia — erkin enciklopediya
C
«C programmalastırıw tili» kitabınıń birinshi basılımınıń muqabasında qollanılǵan logotip[1]
Paradigmaları Kóp paradigmalı: imperativ (proceduralıq), strukturalıq
Dúziwshi Dennis Ritchi
Baǵdarlamashılar ANSI X3J11 (ANSI C); ISO/IEC JTC 1 (Birlesken Texnikalıq Komitet 1) / SC 22 (22-kishi komitet) / WG 14 (14-jumıs toparı) (ISO C)
Birinshi payda bolıwı 1972-jıl
Turaqlı reliz C23 / 31-oktyabr, 2024-jıl
Sınaq versiyası C2y (N3220) / 21-fevral, 2024-jıl
Tiplestiriw tártibi Statikalıq, hálsiz, anıq, nominal
Operaciyalıq sistema Kross-platformalı
Fayl keńeytpeleri .c, .h
Veb-saytları

c-language.org
iso.org
open-std.org

C — bul ulıwma maqsetli programmalastırıw tili. Ol 1970-jılları Dennis Ritchi tárepinen jaratılǵan hám házirgi waqıtqa shekem keń qollanıladı hám tásirin dawam etpekte. Dizaynı boyınsha, C baǵdarlamashıǵa maqsetli kórsetpeler toplamı ushın sazlanǵan, ádettegi oraylıq processor arxitekturasınıń ózgesheliklerine salıstırmalı túrde tikkeley kiriw imkaniyatın beredi. Ol operaciyalıq sistemalardı (ásirese yadrolardı[2]), qurılma drayverlerin hám protokollar steklerin ámelge asırıw ushın qollanılǵan hám qollanılmaqta, biraq qosımsha programmalıq támiynatta onıń qollanılıwı azaymaqta[3]. C eń úlken superkompyuterlerden eń kishi mikrokontrollerlerge hám ornatılǵan sistemalarǵa shekemgi kompyuterlerde qollanıladı.

B programmalastırıw tiliniń miyrasxorı bolǵan C, dáslep 1972 hám 1973-jıllar arasında Bell Labs laboratoriyasında Ritchi tárepinen Unixte isleytuǵın utilitalardı dúziw ushın islep shıǵılǵan. Ol Unix operaciyalıq sisteması yadrosın qayta ámelge asırıw ushın qollanılǵan. 1980-jıllar dawamında C basqıshpa-basqısh ataqlılıqqa iye boldı. Ol eń keń tarqalǵan programmalastırıw tilleriniń birine aylandı,[4][5] C kompilyatorları derlik barlıq zamanagóy kompyuter arxitekturaları hám operaciyalıq sistemaları ushın qoljetimli boldı. Tildiń dáslepki dizayneri tárepinen birge jazılǵan «C programmalastırıw tili» kitabı kóp jıllar dawamında til ushın de-fakto standart retinde xızmet etti[6]. C 1989-jıldan baslap Amerika Milliy Standartlar Instituti (ANSI) tárepinen, keyinirek bolsa Xalıqaralıq Standartlastırıw Shólkemi (ISO) hám Xalıqaralıq Elektrotexnika Komissiyası (IEC) tárepinen birgelikte standartlastırılǵan.

C — bul statikalıq tip sisteması bar, strukturalıq programmalastırıwdı, leksikalıq ózgeriwshi kólemin hám rekursiyanı qollap-quwatlaytuǵın imperativ proceduralıq til. Ol minimal orınlanıw waqtındaǵı qollap-quwatlaw menen, yadqa tómen dárejeli kiriwdi hám mashina kórsetpelerine nátiyjeli sáykes keletuǵın til konstrukciyaların támiyinlew ushın kompilyaciyalanıwǵa arnalǵan. Tómen dárejeli imkaniyatlarına qaramastan, til kross-platformalı programmalastırıwdı xoshametlew ushın proektlestirilgen. Portativlikti esapqa alıp jazılǵan standartqa sáykes C programması derek kodına az ózgerisler kirgizip, hár túrli kompyuter platformaları hám operaciyalıq sistemaları ushın kompilyaciyalana aladı.

Degen menen C de de, onıń standart kitapxanası basqa tillerde ushırasatuǵın ayırım ataqlı ózgesheliklerdi usınbasa da, olardı qollap-quwatlaw ushın jetkilikli dárejede iykemli. Mısalı, obyektke baǵdarlanıw hám shıǵındını jıynaw sáykes túrde sırtqı kitapxanalar GLib Obyekt Sisteması hám Boehm shıǵındı jıynawshısı tárepinen támiyinlenedi.

2000-jıldan baslap, C tili programmalastırıw tilleriniń ataqlılıǵın ólsheytuǵın TIOBE indeksinde turaqlı túrde eń jaqsı tórt tildiń qatarına kiredi[7].

Ózgeshelikleri

Dennis Ritchi (ońda), C programmalastırıw tiliniń oylap tabıwshısı, Ken Tompson menen birge

C tili tómendegi ózgesheliklerge iye:

  • Erkin-formatlı derek kodı
  • Útirli noqatlar operatorlardı juwmaqlaydı
  • Figuralı qawsırmalar operatorlardı bloklarǵa gruppalaydı
  • Orınlanatuǵın kod funkciyalarda jaylasadı; skriptke uqsas sintaksis joq
  • Parametrler mánisi boyınsha beriledi; silteme boyınsha beriw mániske kórsetkish beriw arqalı ámelge asırıladı
  • Salıstırmalı túrde az sanlı gilt sózler
  • if, for, do, while hám switch sıyaqlı basqarıw aǵımı konstrukciyaları
  • +,+=,++,&,|| sıyaqlı arifmetikalıq, bit boyınsha hám logikalıq operatorlar
  • Bir operatorda bir neshe menshiklew orınlanıwı múmkin
  • Paydalanıwshı anıqlaytuǵın identifikatorlar gilt sózlerden ajıratılmaydı; yaǵnıy, sigil arqalı
  • Blok ishinde járiyalanǵan ózgeriwshi tek sol blokta hám tek járiyalanıwdan keyin ǵana qoljetimli
  • Funkciyanıń qaytarılatuǵın mánisi itibarǵa alınbawı múmkin
  • Funkciya funkciyanıń ishinde jaylasa almaydı, biraq geypara translyatorlar bunı qollap-quwatlaydı
  • Orınlanıw waqtındaǵı polimorfizm funkciya kórsetkishleri arqalı ámelge asırılıwı múmkin
  • Rekursiyanı qollap-quwatlaydı
  • Maǵlıwmatlardıń tiplestiriliwi statikalıq, biraq hálsiz qadaǵalanadı; barlıq ózgeriwshilerdiń tipi bar, biraq primitiv tipler arasındaǵı jasırın túrlendiriw hár túrli tiplerdiń ajıratılıwın hálsizlendiredi
  • Paydalanıwshı anıqlaytuǵın maǵlıwmat tipleri maǵlıwmat tipiniń specifikatorın psevdonimlewge imkaniyat beredi
  • Massivti anıqlaw hám oǵan kiriw sintaksisi kvadrat qawsırma belgisi arqalı, mısalı, month[11]. Indekslew kórsetkish arifmetikası arqalı anıqlanadı. Pútin massivlerdi arnawlı yamasa kitapxana kodısız kóshiriwge yamasa salıstırıwǵa bolmaydı
  • Paydalanıwshı anıqlaytuǵın struktura tipleri baylanıslı maǵlıwmat elementleriniń birlik retinde beriliwine hám kóshiriliwine imkaniyat beredi, degen menen eki strukturanı hár bir maydandı salıstırıw ushın arnawlı kodsız salıstırıwǵa bolmaydı
  • Paydalanıwshı anıqlaytuǵın birlesiw tipleri bir-birin basıp ótetuǵın aǵzalardı qollap-quwatlaydı; bir neshe maǵlıwmat tipleriniń birdey yad ornın bólisiwine imkaniyat beredi
  • Paydalanıwshı anıqlaytuǵın sanaw tipleri pútin san mánislerin psevdonimlewdi qollap-quwatlaydı
  • Qatar tipi joq, biraq óziniń standart kitapxanasında sáykes qayta islew menen nul menen tamamlanatuǵın qatarlar ushın sintaksisi bar
  • Kórsetkishler arqalı kompyuter yadına tómen dárejeli kiriwdi qollap-quwatlaydı
  • void qaytaratuǵın funkciya retinde proceduralıq konstruktiyanı qollap-quwatlaydı
  • Standart kitapxana funkciyaları arqalı dinamikalıq yadtı qollap-quwatlaydı
  • Makro anıqlawdı, derek kodı faylın qosıwdı hám shártli kompilyaciyanı orınlaw ushın C preprocessorın óz ishine aladı
  • Fayllar bólek qayta islenetuǵınlıǵı sebepli modullikti qollap-quwatlaydı, kóriniwshilik static hám extern atributları arqalı basqarıladı
  • Tiykarǵı tildegi funkcional imkaniyatlar minimallastırılǵan, al I/O, qatar manipulyaciyası hám matematikalıq funkciyalar sıyaqlı salıstırmalı túrde quramalı funkcional imkaniyatlar standart kitapxana funkciyaları arqalı qollap-quwatlanadı
  • Nátiyjedegi kompilyaciyalanǵan kodtıń tiykarındaǵı platformaǵa salıstırmalı túrde ápiwayı talapları bar, bul onı operaciyalıq hám ornatılǵan sistemalar ushın qálewge ılayıqlı etedi

«Hello, world» mısalı

Brayan Kernigan tárepinen jazılǵan «Hello, World!» programması (1978)

K&R diń birinshi basılımında payda bolǵan «Hello, World!» programması mısalı kópshilik programmalastırıw sabaqlıqlarında kirisiw programması ushın úlgi boldı. Programma standart shıǵarıwǵa «hello, world» dep jazadı.

Dáslepki versiyası:

main()
{
    printf("hello, world\n");
}

Anaǵurlım zamanagóy versiyası:

#include <stdio.h>

int main(void)
{
    printf("hello, world\n");
}

Birinshi qatar — bul #include penen kórsetilgen preprocessor direktivası, ol preprocessorǵa sol kod qatarın printf sıyaqlı kirgiziw hám shıǵarıw funkciyaları ushın járiyalanıwlardı óz ishine alǵan stdio.h baslı faylınıń teksti menen almastırıwǵa sebep boladı. stdio.h átirapındaǵı múyeshli qawsırmalar baslı fayldı kompilyator menen birge berilgen baslı faylların proektke tán kataloglarda tabılıwı múmkin bolǵan sol atlı fayllardan artıq kóretuǵın izlew strategiyasın paydalanıp tabıwǵa bolatuǵının kórsetedi.

Keyingi kod qatarı kirisiw noqatı funkciyası main-di járiyalaydı. Orınlanıw ortalıǵı programma orınlanıwın baslaw ushın usı funkciyanı shaqıradı. int tip specifikatorı funkciyanıń pútin san mánisin qaytaratuǵının kórsetedi. void parametrler dizimi funkciyanıń hesh qanday argument qabıl etpeytuǵının kórsetedi. Orınlanıw ortalıǵı negizinde eki argument (int hám char *[] tipli) beredi, biraq bul implementaciya olardı itibarǵa almaydı. ISO C standartı (5.1.2.2.1-bólim) ya void yamasa usı eki argument bolǵan sintaksisti talap etedi — bul basqa funkciyalarǵa berilmeytuǵın arnawlı qatnas.

Ashılatuǵın figuralı qawsırma funkciyanı anıqlaytuǵın kodtıń baslanıwın kórsetedi.

Keyingi kod qatarı C standart kitapxanasınıń printf funkciyasın qatar literalı retinde kórsetilgen nol menen tamamlanatuǵın qatardıń birinshi belgisiniń adresi menen shaqıradı (orınlawdı oǵan ótkeredi). \n teksti terminalda shıǵarılǵanda kursordı kelesi qatardıń basına jıljıtatuǵın jańa qatar simvolın ańlatatuǵın qashıw izbe-izligi. printf int mánisin qaytarsa da, ol únsiz taslap jiberiledi. Útirli noqat ; shaqırıw operatorın tamamlaydı.

Jabılatuǵın figuralı qawsırma main funkciyasınıń juwmaqlanǵanın kórsetedi. C99-ǵa shekem, main funkciyasınıń aqırında anıq return 0; operatorı talap etiletuǵın edi, biraq C99-dan baslap, main funkciyası (dáslepki funkciya shaqırıwı bolǵanlıqtan) óziniń sońǵı jabılatuǵın figuralı qawsırmasına jetkende jasırın túrde 0 qaytaradı.

Tariyxı

Dáslepki rawajlanıwlar

C tiliniń xronologiyası
Jıl Rásmiy emes atı Rásmiy standart
1972 birinshi reliz N/A
1978 K&R C N/A
1989,
1990
ANSI C, C89,
ISO C, C90
ANSI X3.159-1989
ISO/IEC 9899:1990
1999 C99, C9X ISO/IEC 9899:1999
2011 C11, C1X ISO/IEC 9899:2011
2018 C17, C18 ISO/IEC 9899:2018
2024 C23, C2X ISO/IEC 9899:2024
TBA C2Y

C tiliniń kelip shıǵıwı Unix operaciyalıq sistemasın islep shıǵıw menen tıǵız baylanıslı, ol dáslep Dennis Ritchi hám Ken Tompson tárepinen PDP-7 de assembler tilinde ámelge asırılǵan hám kásiplesleriniń bir neshe ideyaların óz ishine alǵan. Aqıbetinde, olar operaciyalıq sistemanı PDP-11 ge portlawǵa (kóshiriwge) qarar etti. Unix-tiń dáslepki PDP-11 versiyası da assembler tilinde islep shıǵılǵan.

B

Tompson jańa platforma ushın utilitalardı islep shıǵıwǵa arnalǵan programmalastırıw tilin qáledi. Ol dáslep Fortran kompilyatorın jazıwǵa háreket etti, biraq tez arada bul ideyadan bas tarttı hám onıń ornına jaqında islep shıǵılǵan BCPL dep atalatuǵın sistemalıq programmalastırıw tiliniń qısqartılǵan versiyasın jarattı. Sol waqıtta BCPL-dıń rásmiy táriyipleniwi joq edi,[8] hám Tompson sintaksisti anaǵurlım 'kóp sózli' emes hám SMALGOL dep atalǵan ápiwayılastırılǵan ALGOLǵa uqsas etip ózgertti. Ol nátiyjeni B dep atadı hám onı «kóp SMALGOL sintaksisi bar BCPL semantikası» dep táriyipledi. BCPL sıyaqlı, B-de jańa mashinalarǵa portlawdı ańsatlastırıw ushın ózin-ózi kompilyaciyalaytuǵın kompilyatorı bar edi[9]. Aqıbetinde, B tilinde az sanlı utilitalar jazıldı, sebebi ol júdá áste isledi hám bayt boyınsha adreslew sıyaqlı PDP-11 ózgesheliklerinen paydalana almadı.

BCPL-dıń qatardıń aqırına shekemgi kommentariyalardı belgileytuǵın // kommentariyasınan ayırmashılıǵı, B kommentariya shegaralawshısı retinde /* kommentariya */ di qabıl etti, bul PL/1 ge kóbirek uqsas edi hám kommentariyalardıń qatarlar ortasında payda bolıwına imkaniyat berdi. (BCPL-dıń kommentariya stili C++ tilinde qayta kirgizildi.)

Jańa B hám birinshi C relizi

1971-jılı Ritchi anaǵurlım kúshli PDP-11-diń ózgesheliklerinen paydalanıw ushın B-di jaqsılawdı basladı. Áhmiyetli qosımsha simvollıq maǵlıwmat tipi boldı. Ol bunı Jańa B (NB) dep atadı. Tompson Unix yadrosın jazıw ushın NB-di paydalana basladı hám onıń talapları tildiń rawajlanıw baǵdarın qáliplestirdi[10].

1972-jılǵa shekem NB tiline anaǵurlım bay tipler qosıldı. NBde int hám char massivleri bar edi, hám bul tiplerge kórsetkishler, basqa tiplerge kórsetkishler payda etiw imkaniyatı, barlıq tiplerdiń massivleri hám funkciyalardan qaytarılatuǵın tipler qosıldı. Ańlatpalar ishindegi massivler nátiyjeli túrde kórsetkishler retinde qaraldı. Jańa kompilyator jazıldı hám til C dep qayta ataldı.

C kompilyatorı hám onıń járdeminde islengen ayırım utilitalar Version 2 Unix quramına kirgizildi, ol sonday-aq Research Unix dep te ataladı.

Strukturalar hám Unix yadrosın qayta jazıw

1973-jıl noyabrde shıǵarılǵan Version 4 Unix-te Unix yadrosı C tilinde keń kólemde qayta ámelge asırıldı. Usı waqıtqa kelip, C tili struct tipleri sıyaqlı ayırım kúshli ózgesheliklerge iye bolǵan edi.

Preprocessor shama menen 1973-jılı Alan Snayderdiń talabı menen hám sonday-aq BCPL hám PL/I tillerinde bar bolǵan fayldı qosıw mexanizmleriniń paydalılıǵın moyınlaw menen kirgizildi. Onıń dáslepki versiyası tek qosılǵan fayllardı hám ápiwayı qatar almastırıwların támiyinledi: parametrsiz makroslardıń #include hám #define buyrıqları. Sonnan keyin tez arada, tiykarınan Mayk Lesk, sońınan Djon Rayzer tárepinen, argumentleri bar makroslardı hám shártli kompilyaciyanı óz ishine alatuǵın etip keńeytildi.

Unix assembler tilinen basqa tilde ámelge asırılǵan birinshi operaciyalıq sistema yadrolarınıń biri boldı. Aldınǵı mısallarǵa Multics sisteması (ol PL/I tilinde jazılǵan) hám 1961-jılı Burroughs B5000 ushın Master Control Program (MCP) (ol ALGOL tilinde jazılǵan) kiredi. 1977-jılı hám onıń átirapında Ritchi hám Stiven S. Djonson Unix operaciyalıq sistemasınıń portativligin ańsatlastırıw ushın tilge qosımsha ózgerisler kirgizdi. Djonsonnıń Portativ C Kompilyatorı jańa platformalarda C-diń bir neshe implementaciyaları ushın tiykar boldı.

K&R C

Brayan Kernigan hám Dennis Ritchidiń «C programmalastırıw tili» kitabınıń birinshi basılımınıń muqabası

1978-jılı Brayan Kernigan hám Dennis Ritchi «C programmalastırıw tili» kitabınıń birinshi basılımın járiyaladı. Avtorlarınıń bas háriplerinen K&R dep atalǵan bul kitap kóp jıllar dawamında tildiń rásmiy emes specifikaciyası retinde xızmet etti. Onda táriyiplengen C versiyası kóbinese «K&R C» dep ataladı. Bul 1978-jılı shıǵarılǵanlıqtan, ol házir C78 dep te ataladı[11]. Kitaptıń ekinshi basılımı tómende táriyiplengen keyingi ANSI C standartın qamtıydı.

K&R bir neshe til ózgesheliklerin kirgizdi:

  • Standart kirgiziw/shıǵarıw kitapxanası
  • long int maǵlıwmat tipi
  • unsigned int maǵlıwmat tipi
  • =op formasındaǵı quramalı menshiklew operatorları (mısalı, =-) i=-10 sıyaqlı konstrukciyalar tárepinen payda bolǵan semantikalıq eki mánililikti joq etiw ushın op= formasına ózgertildi (yaǵnıy, -=), bul i = -10 (i -10ǵa teń bolsın) degen múmkin bolǵan niyet ornına i =- 10 (i-di 10ǵa kemeytiw) dep interpretaciyalanǵan edi.

1989-jılǵı ANSI standartı járiyalanǵannan keyin de, kóp jıllar dawamında K&R C ele de C baǵdarlamashıları maksimal portativlikke umtılǵanda ózlerin shekleytuǵın «eń tómengi ulıwma bólim» dep esaplanatuǵın edi, sebebi kóp eski kompilyatorlar ele de qollanıwda edi hám dıqqat penen jazılǵan K&R C kodı Standart C-de de nızamlı bola alatuǵın edi.

C-diń keyingi versiyaları funkciyalardıń anıq tip járiyalanıwın talap etkenine qaramastan, K&R C tek int-ten basqa tip qaytaratuǵın funkciyalardıń qollanıwdan aldın járiyalanıwın talap etti. Aldınnan járiyalanbastan paydalanılǵan funkciyalar int qaytaradı dep boljanǵan.

Mısalı:

long long_function();

calling_function()
{
    long longvar;
    register intvar;
    longvar = long_function();
    if (longvar > 1)
          intvar = 0;
    else
          intvar = int_function();
    return intvar;
}

long_function() járiyalanıwı (1-qatarda) talap etiledi, sebebi ol int emes, al long qaytaradı. int_function funkciyasın (11-qatar) járiyalanbaǵan bolsa da shaqırıwǵa boladı, sebebi ol int qaytaradı. Sonday-aq, intvar ózgeriwshisin int tipi retinde járiyalaw kerek emes, sebebi bul register gilt sózi ushın standart tip bolıp tabıladı.

Funkciya járiyalanıwları argumentler haqqında informaciyanı óz ishine almaǵanlıqtan, tip tekseriwleri orınlanbadı, degen menen ayırım kompilyatorlar eger funkciyaǵa hár túrli shaqırıwlar hár túrli sanlı yamasa tipli argumentlerdi paydalansa, eskertiw beretuǵın edi. Unix-tiń lint utilitası sıyaqlı qurallar islep shıǵıldı, olar (basqa zatlar menen bir qatarda) bir neshe derek faylları boyınsha funkciya qollanıwınıń sáykesligin tekserdi.

K&R C járiyalanǵannan keyingi jıllarda tilge bir neshe ózgeshelikler qosıldı, olar AT&T (ásirese PCC[12]) hám basqa óndiriwshilerdiń kompilyatorları tárepinen qollap-quwatlandı. Olarǵa tómendegiler kiredi:

  • void funkciyalar; mánis qaytarmaytuǵın funkciyalar
  • struct yamasaunion tiplerin qaytaratuǵın funkciyalar
  • struct ózgeriwshileri ushın menshiklew
  • Sanap ótiw tipleri

Tildiń ataqlılıǵı, standart kitapxana interfeysleri boyınsha kelisimniń joqlıǵı hám K&R specifikaciyasına sáykes kelmew standartlastırıw háreketlerine alıp keldi[13].

ANSI C hám ISO C

1970-jıllardıń aqırında hám 1980-jıllarda, C versiyaları IBM PC sıyaqlı meynfreym kompyuterlerdiń, minikompyuterlerdiń hám mikrokompyuterlerdiń keń túri ushın ámelge asırıldı, sebebi onıń ataqlılıǵı ádewir arttı. 1983-jılı Amerika Milliy Standartlar Instituti (ANSI) C-diń standart specifikaciyasın belgilew ushın X3J11 komitetin dúzdi. X3J11 C standartın Unix implementaciyasına tiykarladı; degen menen, Unix C kitapxanasınıń portativ emes bólimi IEEE 1003 jumıs toparına tapsırıldı, bul 1988-jılǵı POSIX standartı ushın tiykar boldı. 1989-jılı C standartı ANSI X3.159-1989 «Programmalastırıw tili C» retinde ratifikaciyalandı. Tildiń bul versiyası kóbinese ANSI C, Standart C yamasa geyde C89 dep ataladı.

1990-jılı ANSI C standartı (formatlaw ózgerisleri menen) Xalıqaralıq Standartlastırıw Shólkemi (ISO) tárepinen ISO/IEC 9899:1990 retinde qabıl etildi, ol geyde C90 dep ataladı. Sonlıqtan, «C89» hám «C90» terminleri birdey programmalastırıw tilin bildiredi.

ANSI, basqa milliy standartlar shólkemleri sıyaqlı, endi C standartın jeke islep shıqpaydı, al ISO/IEC JTC1/SC22/WG14 jumıs toparı tárepinen qollap-quwatlanatuǵın xalıqaralıq C standartına súyenedi. Xalıqaralıq standartqa jańalanıwdı milliy qabıl etiw ádette ISO baspasınan keyin bir jıl ishinde júz beredi.

C standartlastırıw procesiniń maqsetleriniń biri keyinirek kirgizilgen kóplegen rásmiy emes ózgesheliklerdi óz ishine alǵan K&R C-diń supersetin jaratıw edi. Standartlar komiteti sonıń menen bir qatarda funkciya prototipleri (C++-ten alınǵan), void kórsetkishleri, xalıqaralıq simvol toplamların hám lokallardı qollap-quwatlaw hám preprocessor jaqsılanıwları sıyaqlı bir neshe qosımsha ózgesheliklerdi de qostı. Degen menen parametr járiyalanıwları ushın sintaksis C++-te qollanılǵan stilge sáykes keńeytilgen bolsa da, K&R interfeysine bar bolǵan derek kodı menen sáykeslik ushın ruqsat beriliwi dawam etti.

C89 házirgi C kompilyatorları tárepinen qollap-quwatlanadı hám kópshilik zamanagóy C kodı oǵan tiykarlanǵan. Tek Standart C-de jazılǵan hám hesh qanday apparatlıq támiynatqa baylanıslı boljawları joq hár qanday programma sáykes C implementaciyası bar hár qanday platformada, onıń resurs sheklewleri sheńberinde durıs islep turadı. Bunday saqlıq ilajlarısız, programmalar tek belgili bir platformada yamasa belgili bir kompilyator menen kompilyaciyalana aladı, mısalı, GUI kitapxanaları sıyaqlı standart emes kitapxanalardı paydalanıw yamasa maǵlıwmat túrleriniń anıq ólshemi hám bayt tártibi sıyaqlı kompilyatorǵa yamasa platformaǵa tán atributlarǵa súyeniw sebepli.

Kod standartqa sáykes keletuǵın yamasa K&R C-ge tiykarlanǵan kompilyatorlar tárepinen de kompilyaciyalana alıwı kerek bolǵan jaǵdaylarda, __STDC__ makrosı kodtı Standart hám K&R bólimlerine ajıratıw ushın qollanılıwı múmkin, bul K&R C-ge tiykarlanǵan kompilyatorda tek Standart C-de bar bolǵan ózgesheliklerdi paydalanıwdıń aldın aladı.

ANSI/ISO standartlastırıw procesinen keyin, C tili specifikaciyası bir neshe jıl dawamında salıstırmalı túrde turaqlı qaldı. 1995-jılı 1990-jılǵı C standartına Normativ Dúzetiw 1 (ISO/IEC 9899/AMD1:1995, rásmiy emes túrde C95 dep ataladı) járiyalandı, ol geypara detallardı dúzetiw hám xalıqaralıq simvol toplamlarına keńirek qollap-quwatlaw qosıw ushın boldı[14].

C99

C standartı 1990-jıllardıń aqırında jáne qayta kórip shıǵıldı, bul 1999-jılı ISO/IEC 9899:1999 járiyalanıwına alıp keldi, ol kóbinese «C99» dep ataladı. Sonnan berli oǵan Texnikalıq Dúzetiwler arqalı úsh ret ózgeris kirgizildi[15].

C99 bir neshe jańa ózgeshelikler kirgizdi, sonıń ishinde ishki funkciyalar, bir neshe jańa maǵlıwmat tipleri (long long int hám complex sanlardı kórsetiw ushın kompleks tip), ózgeriwshi uzınlıqtaǵı massivler hám iykemli massiv aǵzaları, IEEE 754 haqıyqıy sanların jaqsıraq qollap-quwatlaw, variativ makroslardı (ózgeriwshi arnost makroslar) qollap-quwatlaw hám BCPL yamasa C++ tillerindegi sıyaqlı // menen baslanatuǵın bir qatarlı kommentariyalardı qollap-quwatlaw. Olardıń kópshiligi bir neshe C kompilyatorlarında keńeytpeler retinde ámelge asırılǵan edi.

C99 tiykarınan C90 menen keri sáykes keledi, biraq ayırım jaǵdaylarda qatańlaw; ásirese, tip specifikatorı joq járiyalanıw endi int-ti jasırın túrde boljanbaydı. C99 qollap-quwatlawınıń bar ekenin kórsetiw ushın standart __STDC_VERSION__ makrosı 199901L mánisi menen anıqlanǵan. GCC, Solaris Studio hám basqa C kompilyatorları házir C99-dıń kóplegen yamasa barlıq jańa ózgesheliklerin qollap-quwatlaydı. Degen menen, Microsoft Visual C++-tegi C kompilyatorı C89 standartın hám C++11 menen sáykeslik ushın kerek bolǵan C99 bólimlerin ámelge asıradı[16].

Bunnan tısqarı, C99 standartı qashıw simvolları (mısalı, \u0040 yamasa \U0001f431) túrinde Unicode paydalanatuǵın identifikatorlardı qollap-quwatlawdı talap etedi hám shiyki Unicode atların qollap-quwatlawdı usınıs etedi.

C11

2007-jılı C standartın jáne bir qayta kórip shıǵıw boyınsha jumıslar baslandı, ol rásmiy túrde 2011-jıl 8-dekabrde ISO/IEC 9899:2011 járiyalanǵanǵa shekem rásmiy emes túrde «C1X» dep ataldı. C standartları komiteti bar bolǵan implementaciyalar tárepinen testlenbegen jańa ózgesheliklerdiń qabıl etiliwin sheklew boyınsha kórsetpelerdi qabıl etti.

C11 standartı C tiline hám kitapxanasına kóp jańa ózgeshelikler qosadı, sonıń ishinde tip ulıwma makrosları, anonim strukturalar, jaqsılanǵan Unicode qollap-quwatlawı, atomlı operaciyalar, kóp aǵımlıq hám shegaraları tekserilgen funkciyalar. Ol sonıń menen birge bar bolǵan C99 kitapxanasınıń geypara bólimlerin qosımsha etedi hám C++ penen sáykeslikti jaqsılaydı. C11 qollap-quwatlawınıń bar ekenin kórsetiw ushın __STDC_VERSION__ standart makrosı 201112L retinde anıqlanǵan.

C17

C17 — bul 2018-jıl iyun ayında járiyalanǵan C programmalastırıw tili standartı ISO/IEC 9899:2018 ushın rásmiy emes at. Ol hesh qanday jańa til ózgesheliklerin kirgizbeydi, tek C11-degi kemshiliklerge texnikalıq dúzetiwler hám anıqlamalar ǵana kirgizedi. C17 qollap-quwatlawınıń bar ekenin kórsetiw ushın __STDC_VERSION__ standart makrosı 201710L retinde anıqlanǵan.

C23

C23 — bul házirgi tiykarǵı C tili standartı qayta kórip shıǵılıwınıń rásmiy emes atı hám ol rawajlanıwınıń úlken bóliminde «C2X» dep atalǵan. Ol aldıńǵı relizlerge tiykarlanıp, jańa gilt sózler, nullptr_t hám _BitInt(N) sıyaqlı tipler hám standart kitapxanaǵa keńeytiwler sıyaqlı jańa ózgeshelikler kirgizedi[17].

C23 2024-jıl oktyabr ayında ISO/IEC 9899:2024 retinde járiyalandı[18]. C23 qollap-quwatlawınıń bar ekenin kórsetiw ushın __STDC_VERSION__ standart makrosı 202311L retinde anıqlanǵan.

C2Y

C2Y — bul C23 (C2X) ten keyingi, 2020-jıllardıń aqırında shıǵarılıwı úmit etiletuǵın kelesi tiykarǵı C tili standartı qayta kórip shıǵılıwınıń rásmiy emes atı, sonlıqtan «C2Y» de «2» bar. C2Y-diń dáslepki jumıs joybarı 2024-jıl fevral ayında ISO/IEC JTC1/SC22/WG14 jumıs toparı tárepinen N3220 retinde shıǵarıldı[19].

Embedded C

Tariyxıy jaqtan, ornatılǵan C programmalastırıw qatań noqatlı arifmetika, bir neshe hár túrli yad bankleri hám tiykarǵı I/O operaciyaları sıyaqlı ekzotikalıq ózgesheliklerdi qollap-quwatlaw ushın C tiline standart emes keńeytpelerdi talap etken.

2008-jılı C Standartları Komiteti C tilin keńeytetuǵın texnikalıq esabat járiyaladı, ol barlıq implementaciyalardıń sáykes keliwi ushın ulıwma standart usınıw arqalı bul máselelerdi sheshiwge baǵdarlanǵan[20]. Ol ádettegi C-de bolmaǵan bir qatar ózgesheliklerdi óz ishine aladı, mısalı, qatań noqatlı arifmetika, atalǵan adres keńislikleri hám tiykarǵı I/O apparatlıq adreslew.

Anıqlama

Qatardıń aqırı C tilinde ulıwma áhmiyetli emes; degen menen, qatar shegaraları preprocessor basqıshında áhmiyetke iye. Kommentariyalar ya /* hám */ shegaralawshıları arasında, yamasa (C99-dan baslap) // belgisi artınan qatardıń aqırına shekem payda bolıwı múmkin. /* hám */ menen shegaralanǵan kommentariyalar bir-biriniń ishinde jaylaspaydı hám bul simvollar izbe-izligi qatar yamasa simvol literalları ishinde ushırassa, kommentariya shegaralawshıları retinde interpretaciyalanbaydı.

C derek faylları járiyalanıwlar hám funkciya anıqlamaların óz ishine aladı. Funkciya anıqlamaları, óz gezeginde, járiyalanıwlar hám operatorlardı óz ishine aladı. Járiyalanıwlar ya struct, union hám enum sıyaqlı gilt sózler arqalı jańa tiplerdi anıqlaydı, ya bolmasa jańa ózgeriwshilerge tiplerdi menshikleydi hám bálkim orın ajıratadı, ádette tip penen birge ózgeriwshi atın jazıw arqalı. char hám int sıyaqlı gilt sózler ornatılǵan tiplerdi kórsetedi. Kod bólimleri járiyalanıwlardıń kóriw sheńberin sheklew hám basqarıw strukturaları ushın bir operator retinde xızmet etiw maqsetinde figuralı qawsırmalar ({ hám }) ishine alınadı.

Imperativ til retinde, C háreketlerdi kórsetiw ushın operatorlardı paydalanadı. Eń keń tarqalǵan operator — bul bahalanatuǵın ańlatpadan hám onnan keyingi útirli noqattan ibarat bolǵan ańlatpa operatorı; bahalanıwdıń qosımsha tásiri retinde funkciyalar shaqırılıwı hám ózgeriwshilerge jańa mánisler tayınlanıwı múmkin. Operatorlardıń ádettegi izbe-iz orınlanıwın ózgertiw ushın, C saqlanǵan gilt sózler menen belgilengen bir neshe basqarıw aǵımı operatorların usınadı. Strukturalıq programmalastırıw if ... [else] shártli orınlanıwı hám do ... while, while hám for iterativ orınlanıwı (cikl) arqalı qollap-quwatlanadı. for operatorınıń bólek inicializaciya, tekseriw hám qayta inicializaciya ańlatpaları bar, olardıń hárbiri yamasa hámmesi de túsirip qaldırılıwı múmkin. break hám continue cikl ishinde qollanılıwı múmkin. Break eń ishki cikl operatorınan shıǵıw ushın, al continue onıń qayta inicializaciyasına ótiw ushın qollanıladı. Sonday-aq, funkciya ishinde belgilengen belgige tikkeley ótetuǵın strukturalanbaǵan goto operatorı da bar. switch pútin san ańlatpasınıń mánisine tiykarlanıp orınlanatuǵın jaǵdaydı tańlaydı. Basqa kóplegen tillerden ayırmashılıǵı, case break penen toqtatılmasa, basqarıw aǵımı kelesi jaǵdayǵa ótedi.

Ańlatpalar hár túrli ornatılǵan operatorlardı paydalanıwı hám funkciya shaqırıwların óz ishine alıwı múmkin. Funkciyalarǵa argumentlerdiń hám kópshilik operatorlarǵa operandlardıń bahalanıw tártibi anıqlanbaǵan. Bahalanıwlar hátte aralasıp ketiwi de múmkin. Degen menen, barlıq qosımsha tásirler (ózgeriwshilerge saqlawdı qosqanda) kelesi «izbe-izlik noqatı»nan aldın júz beredi; izbe-izlik noqatları hárbir ańlatpa operatorınıń aqırı, hárbir funkciya shaqırıwına kiriw hám onnan qaytıwdı óz ishine aladı. Izbe-izlik noqatları sonıń menen birge belgili bir operatorlardı (&&, ||, ?: hám útir operatorı) óz ishine alǵan ańlatpalardı bahalaw waqtında da payda boladı. Bul kompilyator tárepinen obyekt kodın joqarı dárejede optimallastırıwǵa imkaniyat beredi, biraq C baǵdarlamashılarınan basqa programmalastırıw tillerine qaraǵanda isenimli nátiyjeler alıw ushın kóbirek itibar beriwdi talap etedi.

Kernigan hám Ritchi «C programmalastırıw tili» kitabınıń kirisiwinde bılay deydi: «C, basqa hár qanday til sıyaqlı, óziniń kemshiliklerine iye. Geypara operatorlardıń orınlanıw tártibi nadurıs; sintaksistiń geypara bólimleri jaqsıraq bolıwı múmkin edi». C standartı bunday ózgerislerdiń bar bolǵan programmalıq támiynatqa tásiri sebepli, bul kemshiliklerdiń kópshiligin dúzetiwge urınbadı.

Simvollar toplamı

Tiykarǵı C derek simvollar jıynaǵı tómendegi belgilerdi óz ishine aladı:[21]

  • ISO tiykarǵı latın álipbesiniń kishi hám bas háripleri: az, AZ
  • Onlıq sanlar: 09
  • Grafikalıq simvollar: ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~
  • Bos orın simvolları: probel, gorizontal tabulyaciya, vertikal tabulyaciya, forma almastırıw, jańa qatar

Jańa qatar simvolı tekst qatarınıń aqırın bildiredi; ol haqıyqıy bir simvolǵa sáykes keliwi shárt emes, degen menen qolaylılıq ushın C onı solay qarastıradı.

POSIX standartı tiykarǵı C derek simvollar toplamına bir neshe simvollar (ásirese «@») qosatuǵın portativ belgiler toplamın talap etedi. Eki standart ta hesh qanday anıq mánis kodlawın kórsetpeydi — ASCII hám EBCDIC ekewi de bul standartlarǵa sáykes keledi, sebebi olar keminde sol tiykarǵı belgilerdi óz ishine aladı, hátte ol belgiler ushın hár túrli kodlanǵan mánislerdi paydalansa da.

Qosımsha kóp baytlı kodlanǵan simvollar qatar literallarında qollanılıwı múmkin, biraq olar tolıq portativ emes. C99-dan baslap kóp milletli Unicode simvolları \uXXXX yamasa \UXXXXXXXX kodlawın paydalanıp C derek teksti ishine portativ túrde jaylastırılıwı múmkin (bul jerde X on altılıq belgini ańlatadı).

Tiykarǵı C orınlanıw simvollar toplamı sol belgilerdi, sonday-aq nol belgisiniń, eskertiwdiń, keri qaytıwdıń hám qatar basına qaytıwınıń kórinislerin óz ishine aladı.

Keńeytilgen simvollar toplamların orınlanıw waqtında qollap-quwatlaw C standartınıń hárbir jańalanıwı menen arttı.

Rezervlengen sózler

C-diń barlıq versiyalarında registrge sezgir aldınnan saqlanǵan sózler bar. Saqlanǵan sózler bolǵanlıqtan, olar ózgeriwshi atları retinde qollanıla almaydı.

C89-da 32 aldınnan saqlanǵan sóz bar:

  • auto
  • break
  • case
  • char
  • const
  • continue
  • default
  • do
  • double
  • else
  • enum
  • extern
  • float
  • for
  • goto
  • if
  • int
  • long
  • register
  • return
  • short
  • signed
  • sizeof
  • static
  • struct
  • switch
  • typedef
  • union
  • unsigned
  • void
  • volatile
  • while

C99 jáne bes saqlanǵan sóz qostı: (‡ C23 gilt sóziniń alternativ imlasın bildiredi)

  • inline
  • restrict
  • _Bool
  • _Complex
  • _Imaginary

C11 jáne jeti saqlanǵan sóz qostı:[22] (‡ C23 gilt sóziniń alternativ imlasın bildiredi)

  • _Alignas
  • _Alignof
  • _Atomic
  • _Generic
  • _Noreturn
  • _Static_assert
  • _Thread_local

C23 jáne on bes sózdi rezervledi:

  • alignas
  • alignof
  • bool
  • constexpr
  • false
  • nullptr
  • static_assert
  • thread_local
  • true
  • typeof
  • typeof_unqual
  • _BitInt
  • _Decimal32
  • _Decimal64
  • _Decimal128

Sońǵı waqıtta saqlanǵan sózlerdiń kópshiligi tómengi sızıqsha menen baslanıp, bas hárip penen dawam etedi, sebebi bunday formadaǵı identifikatorlar aldın C standartı tárepinen tek implementaciyalar tárepinen paydalanıw ushın rezervlengen edi. Bar bolǵan programma derek kodı bunday identifikatorlardı paydalanbaǵan bolıwı kerek bolǵanlıqtan, C implementaciyaları programmalastırıw tiliniń bul keńeytpelerin qollap-quwatlay baslaǵanda oǵan tásir etpeydi. Geypara standart tema atları tómengi sızıqshalı identifikatorlar ushın qolaylıraq sinonimlerdi anıqlaydı. Bul sózlerdiń geyparaları C23-te ózleriniń ádettegi imlası menen gilt sózler retinde qosıldı hám sáykes makroslar alıp taslandı.

C89-ǵa shekem entry gilt sóz retinde rezervlengen edi. K&R dep atalǵan C89-dı táriyipleytuǵın «C programmalastırıw tili» kitabınıń ekinshi basılımında Kernigan hám Ritchi bılay dep jazǵan: «... [gilt sóz] entry, aldın rezervlengen, biraq hesh qashan qollanılmaǵan, endi rezervlengen emes.» hám «Óli tuwılǵan entry gilt sózi alıp taslandı.»

Operatorlar

C operatorlardıń bay toplamın qollap-quwatlaydı, olar ańlatpanıń ishinde sol ańlatpanı bahalaw waqtında orınlanatuǵın manipulyaciyalardı kórsetiw ushın paydalanılatuǵın simvollar. C tili tómendegi operatorlarǵa iye:

  • arifmetikalıq: +, -, *, /, %
  • menshiklew: =
  • keńeytilgen menshiklew: +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
  • bit boyınsha logika: ~, &, |, ^
  • bit boyınsha jıljıtıw: <<, >>
  • bul logikası: !, &&, ||
  • shártli bahalaw: ? :
  • teńlikti tekseriw: ==, !=
  • funkciya shaqırıw: ( )
  • inkrement hám dekrement: ++, --
  • aǵzanı tańlaw: ., ->
  • obyekt ólshemi: sizeof
  • tip: typeof, typeof_unqual since C23
  • tártip qatnasları: <, <=, >, >=
  • silteme hám siltemeni anıqlaw: &, *, [ ]
  • izbe-izlik: ,
  • kishi ańlatpanı gruppalaw: ( )
  • tip túrlendiriw: (typename)

C menshiklewdi kórsetiw ushın (matematikada teńlikti ańlatıw ushın qollanılatuǵın) = operatorın paydalanadı, bul Fortran hám PL/I-dıń úlgisine ámel etedi, biraq ALGOL hám onıń tuwındılarınan ayırmashılıq etedi. C teńlikti tekseriw ushın == operatorın paydalanadı. Menshiklew hám teńlik operatorları arasındaǵı uqsaslıq biriniń ornına ekinshisiniń tosınarlı paydalanılıwına alıp keliwi múmkin hám kóp jaǵdaylarda bul qátelik qáte xabarın payda etpeydi (degen menen ayırım kompilyatorlar eskertiwler beredi). Mısalı, if (a == b + 1) shártli ańlatpası qátelik penen if (a = b + 1) dep jazılıwı múmkin, bul eger menshiklewden keyin a-nıń mánisi 0 bolmasa, true dep bahalanadı[23].

C operatorlarınıń orınlanıw tártibi bárqulla intuitiv emes. Mısalı, == operatorı & (bit boyınsha AND) hám | (bit boyınsha OR) operatorlarına qaraǵanda kúshlirek baylanısadı (olardan aldın orınlanadı), x & 1 == 0 sıyaqlı ańlatpalarda, eger kod jazıwshınıń maqseti sol bolsa, (x & 1) == 0 dep jazılıwı kerek[24].

Maǵlıwmat tipleri

C-degi tip sisteması statikalıq hám hálsiz tiplestirilgen bolıp, bul onı Pascal sıyaqlı ALGOL tuwındılarınıń tip sistemasına uqsas etedi[25]. Hár túrli ólshemdegi, oń hám teris, haqıyqıy sanlar hám sanap ótiw tipleri (enum) ushın ornatılǵan tipler bar. char pútin san tipi kóbinese bir baytlı simvollar ushın qollanıladı. C99 logikalıq maǵlıwmat tipin qostı. Sonday-aq massivler, kórsetkishler, jazıwlar (struct) hám birlespeler (union) sıyaqlı tuwındı tipler de bar.

C kóbinese tip sistemasınan shıǵıwlar zárúr bolıwı múmkin tómen dárejeli sistemalıq programmalastırıwda qollanıladı. Kompilyator kópshilik ańlatpalardıń tip durıslıǵın támiyinlewge háreket etedi, biraq baǵdarlamashı tekseriwlerdi hár túrli usıllar menen aylanıp óte aladı, ya bir mánisti bir tipten ekinshisine anıq túrlendiriw ushın tip túrlendiriwin paydalanıw arqalı, ya bolmasa maǵlıwmat obyektiniń tiykarındaǵı bitlerin basqa bir usılda qayta interpretaciyalaw ushın kórsetkishler yamasa birlespelerdi paydalanıw arqalı.

Ayırımlar C-diń járiyalaw sintaksisin, ásirese funkciya kórsetkishleri ushın, intuitiv emes dep tabadı. (Ritchidiń ideyası identifikatorlardı olardıń qollanılıwına uqsas kontekstlerde járiyalaw edi: «járiyalaw qollanıwdı sáwlelendiredi».)

C-diń ádettegi arifmetikalıq túrlendiriwleri nátiyjeli kod payda etiwge imkaniyat beredi, biraq geyde kútilmegen nátiyjelerge alıp keliwi múmkin. Mısalı, teń keńliktegi oń hám teris pútin sanlardı salıstırıw oń sannıń teris sanǵa túrlendiriliwin talap etedi. Eger oń san mánisi teris bolsa, bul kútilmegen nátiyjelerge alıp keliwi múmkin.

Kórsetkishler

C kórsetkishlerdi, yaǵnıy yadtaǵı obyekt yamasa funkciyanıń adresi yamasa ornın jazıp alatuǵın silteme túrin paydalanıwdı qollap-quwatlaydı. Kórsetkishler kórsetilgen adreste saqlanǵan maǵlıwmatlarǵa kiriw ushın yamasa kórsetilgen funkciyanı shaqırıw ushın dereferenciyalanıwı múmkin. Kórsetkishler menshiklew yamasa kórsetkish arifmetikası arqalı manipulyaciyalanıwı múmkin. Kórsetkish mánisiniń orınlanıw waqtındaǵı kórinisi ádette shiyki yad adresi bolıp tabıladı (múmkin, sóz ishindegi jıljıw maydanı menen tolıqtırılǵan), biraq kórsetkishtiń tipi kórsetilgen zattıń tipin óz ishine alǵanlıqtan, kórsetkishler bar ańlatpalar kompilyaciya waqtında tip boyınsha tekseriliwi múmkin. Kórsetkish arifmetikası kórsetilgen maǵlıwmat tipiniń ólshemine sáykes avtomat túrde masshtablanadı.

Kórsetkishler C-de kóp maqsetler ushın qollanıladı. Tekst qatarları ádette simvollar massivlerine kórsetkishler arqalı manipulyaciyalanadı. Dinamikalıq yad ajıratıw kórsetkishler arqalı orınlanadı; malloc nátiyjesi ádette saqlanatuǵın maǵlıwmatlardıń maǵlıwmat tipine túrlendiriledi. Terekler sıyaqlı kóp maǵlıwmat tipleri ádette dinamikalıq túrde ajıratılǵan, kórsetkishler arqalı bir-birine baylanıstırılǵan struct obyektleri retinde ámelge asırıladı. Basqa kórsetkishlerge kórsetkishler kóbinese kóp ólshemli massivlerde hám struct obyektleri massivlerinde qollanıladı. Funkciya kórsetkishleri (funkciya kórsetkishleri) funkciyalardı joqarı dárejeli funkciyalarǵa (mısalı, qsort yamasa bsearch) argument retinde, jóneltiw kestelerinde yamasa waqıya qayta islewshilerge keri shaqırıwlar retinde beriw ushın paydalı.

Nul kórsetkish mánisi hesh qanday durıs orınǵa anıq kórsetpeydi. Nul kórsetkish mánisin dereferenciyalaw anıqlanbaǵan, kóbinese segmentaciyalaw qáteligine alıp keledi. Nul kórsetkish mánisleri baylanıslı dizimniń sońǵı túyinindegi «kelesi» kórsetkishtiń joqlıǵı sıyaqlı arnawlı jaǵdaylardı kórsetiw ushın yamasa kórsetkishler qaytaratuǵın funkciyalardan qáte kórsetkishi retinde paydalı. Derek kodındaǵı sáykes kontekstlerde, mısalı, kórsetkish ózgeriwshisine menshiklew ushın, nul kórsetkish konstantası 0 retinde, kórsetkish tipine anıq túrlendiriw menen yamasa ózgertiwsiz, bir neshe standart baslı fayllar tárepinen anıqlanǵan NULL makrosı retinde yamasa, C23-ten baslap nullptr konstantası menen jazılıwı múmkin. Shártli kontekstlerde nul kórsetkish mánisleri false dep bahalanadı, al basqa barlıq kórsetkish mánisleri true dep bahalanadı.

Void kórsetkishleri (void *) anıqlanbaǵan tiptegi obyektlerge kórsetedi hám sonlıqtan «ulıwma» maǵlıwmat kórsetkishleri retinde qollanıla aladı. Kórsetilgen obyekttiń ólshemi hám tipi belgili bolmaǵanlıqtan, void kórsetkishleri dereferenciyalana almaydı hám de olarǵa kórsetkish arifmetikası ruqsat etilmeydi, degen menen olar ańsat (hám kóp kontekstlerde jasırın túrde) basqa hár qanday obyekt kórsetkish tipine hám onnan túrlendiriliwi múmkin.

Kórsetkishlerdi abaysız paydalanıw potencial qáwipli bolıwı múmkin. Olar ádette tekserilmegenlikten, kórsetkish ózgeriwshisin qálegen tosınarlı orınǵa kórsetetuǵın etip qoyıwǵa boladı, bul qálemegen tásirlerge alıp keliwi múmkin. Durıs paydalanılǵan kórsetkishler qáwipsiz orınlarǵa kórsetkenine qaramastan, olar nadurıs kórsetkish arifmetikasın paydalanıp qáwipsiz emes orınlarǵa kórsetiliwi múmkin; olar kórsetken obyektler bosatılǵannan keyin de paydalanılıwı múmkin (asılıp turǵan kórsetkishler); olar inicializaciyalanbastan paydalanılıwı múmkin (jabayı kórsetkishler); yamasa olarǵa túrlendiriw, birlespe yamasa basqa buzılǵan kórsetkish arqalı tikkeley qáwipsiz emes mánis beriliwi múmkin. Ulıwma alǵanda, C kórsetkish tiplerin manipulyaciyalawǵa hám olar arasında túrlendiriwge ruqsat beriwde erkin, degen menen kompilyatorlar ádette hár túrli dárejede tekseriw ushın opciyalar usınadı. Geypara basqa programmalastırıw tilleri bul máselelerdi anaǵurlım sheklengenirek silteme tiplerin paydalanıw arqalı sheshedi.

Massivler

C-degi massiv tipleri dástúrli túrde kompilyaciya waqtında anıqlanǵan turaqlı, statikalıq ólshemge iye. Jańa C99 standartı sonday-aq ózgeriwshi uzınlıqtaǵı massivlerdiń bir túrine de ruqsat etedi. Degen menen, sonday-aq standart kitapxananıń malloc funkciyasın paydalanıp, orınlanıw waqtında yad blogın (qálegen ólshemde) ajıratıw hám onı massiv retinde qarawǵa boladı.

Massivlerge bárqulla (haqıyqatında) kórsetkishler arqalı kirilgenlikten, massivke kiriwler ádette tiykarındaǵı massiv ólshemine qarsı tekserilmeydi, degen menen geypara kompilyatorlar shegara tekseriwin opciya retinde usınıwı múmkin[26][27]. Sonlıqtan massiv shegaraların buzıw múmkin hám nızamsız yadqa kiriw, maǵlıwmatlardıń buzılıwı, buferdiń tolıp ketiwi hám orınlanıw waqtındaǵı ayrıqsha jaǵdaylar sıyaqlı hár túrli aqıbetlerge alıp keliwi múmkin.

C kóp ólshemli massivlerdi járiyalaw ushın arnawlı qaǵıydaǵa iye emes, al onıń ornına massivler massivlerin járiyalaw ushın tip sistemasındaǵı rekursiyaǵa súyenedi, bul nátiyjeli túrde sol bir nárseni ámelge asıradı. Nátiyjedegi «kóp ólshemli massivtiń» indeks mánisleri qatar boyınsha tártipte ósiwde dep esaplanıwı múmkin. Kóp ólshemli massivler kóbinese sanlı algoritmlerde (tiykarınan ámeliy sızıqlı algebradan) matricalardı saqlaw ushın qollanıladı. C massiviniń dúzilisi usı arnawlı wazıypaǵa jaqsı sáykes keledi. Degen menen, C-diń dáslepki versiyalarında massivtiń shegaraları belgili turaqlı mánisler bolıwı kerek yamasa olardı talap etetuǵın hár qanday kishi programmaǵa anıq beriliwi kerek, al dinamikalıq ólshemli massivler massivlerine qos indekslew arqalı kiriwge bolmaydı. (Bul ushın sheshim massivti baǵanalarǵa kórsetkishlerdiń qosımsha «qatar vektorı» menen ajıratıw boldı.) C99 bul máseleni sheshetuǵın «ózgeriwshi uzınlıqtaǵı massivlerdi» kirgizdi.

Tómendegi zamanagóy C (C99 yamasa keyingi) qollanatuǵın mısal stekde (heap) eki ólshemli massivtiń ajıratılıwın hám kiriwler ushın kóp ólshemli massiv indekslewiniń paydalanılıwın kórsetedi (bul kóp C kompilyatorlarında shegara tekseriwin paydalana aladı):

int func(int n, int m) {
    float (*p)[n][m] = malloc(sizeof *p);
    if (p == NULL) {
         return -1;
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            (*p)[i][j] = i + j;
        }
    }
    print_array(n, m, p);
    free(p);
    return 1;
}

Al tómende C99-dıń Auto VLA ózgesheligin paydalanatuǵın uqsas implementaciya keltirilgen:

int func(int n, int m) {
// Itibar beriń: n * m * sizeof(float) auto VLA sheklewlerinen aspawın hám stektiń bar ólshemi sheńberinde ekenin tekseriw kerek.
float p[n][m]; // auto VLA stekde saqlanadı hám funkciya shaqırılǵanda ólshemi anıqlanadı
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
p[i][j] = i + j;
}
print_array(n, m, p);
// p-nı bosatıw kerek emes, sebebi ol funkciya tamamlanǵanda, stek ramkasınıń qalǵan bólimi menen birge joǵalıp ketedi
return 1;
}

Massiv-kórsetkish almasıw imkaniyatı

Indeks belgisi x[i] (bul jerde x kórsetkishti bildiredi) *(x+i) ushın sintaksislik qolaylıq bolıp tabıladı.[28]. Kompilyatordıń kórsetkish tipi haqqındaǵı biliminen paydalanıp, x + i kórsetetuǵın adres tiykarǵı adres (x kórsetken) i baytqa arttırılǵan emes, al tiykarǵı adres i-ge kóbeytilgen, x kórsetetuǵın elementtiń ólshemine sáykes arttırılǵan dep anıqlanadı. Solay etip, x[i] massivtiń i+1-elementin bildiredi.

Bunnan tısqarı, kópshilik ańlatpa kontekstlerinde (áhmiyetli ózgeshelik — sizeof operatorınıń operandı retinde), massiv tipindegi ańlatpa avtomat túrde massivtiń birinshi elementine kórsetkishke aylandırıladı. Bul massiv funkciyaǵa argument retinde kórsetilgende hesh qashan tutas kóshirilmeytuǵının, al tek ǵana onıń birinshi elementiniń adresi beriletuǵının ańlatadı. Sonlıqtan, C-degi funkciya shaqırıwları mánis boyınsha beriw semantikasın paydalansa da, massivler haqıyqatında silteme boyınsha beriledi.

x massiviniń ulıwma ólshemin massiv tipindegi ańlatpaǵa sizeof qollanıw arqalı anıqlawǵa boladı. Elementtiń ólshemin A massiviniń hár qanday siltemesi alıp taslanǵan elementine sizeof operatorın qollanıw arqalı, mısalı n = sizeof A[0] sıyaqlı anıqlawǵa boladı. Solay etip, járiyalanǵan A massivindegi elementler sanın sizeof A / sizeof A[0] retinde anıqlawǵa boladı. Itibar beriń, eger joqarıda táriyiplengen avtomat túrlendiriw sebepli kóbinese C kodında bolatuǵını sıyaqlı tek birinshi elementke kórsetkish bar bolsa, massivtiń tolıq tipi hám onıń uzınlıǵı haqqındaǵı informaciya joytıladı.

Yadtı basqarıw

Programmalastırıw tiliniń eń áhmiyetli funkciyalarınıń biri — bul yadtı hám yadta saqlanatuǵın obyektlerdi basqarıw ushın imkaniyatlar beriw. C obyektler ushın yadtı ajıratıwdıń úsh tiykarǵı usılın usınadı:

  • Statikalıq yad bólistiriw: obyekt ushın orın kompilyaciya waqtında binar faylında beriledi; bul obyektlerdiń bar bolıw múddeti (yamasa ómiri) olar bar bolǵan binar faylı yadqa júklengen waqıt dawamında boladı.
  • Avtomat yad bólistiriw: waqıtsha obyektler stekde saqlanıwı múmkin hám bul orın olar járiyalanǵan bloktan shıǵılǵannan keyin avtomat túrde bosatılıp, qayta paydalanıwǵa boladı.
  • Dinamikalıq yad bólistiriw: qálegen ólshemdegi yad blokları orınlanıw waqtında stek (heap) dep atalatuǵın yad aymaǵınan malloc sıyaqlı kitapxana funkciyaları arqalı soralıwı múmkin; bul bloklar keyinirek realloc yamasa free kitapxana funkciyaların shaqırıw arqalı qayta paydalanıw ushın bosatılǵanǵa shekem bar boladı.

Bul úsh usıl hár túrli jaǵdaylar ushın sáykes keledi hám hár túrli artıqmashılıqlar menen kemshiliklerge iye. Mısalı, statikalıq yad bólistiriwde az ajıratıw shıǵını bar, avtomat bólistiriw biraz kóbirek shıǵındı talap etiwi múmkin, al dinamikalıq yad bólistiriw ajıratıw ushın da, bosatıw ushın da potencial túrde úlken shıǵınǵa iye bolıwı múmkin. Statikalıq obyektlerdiń turaqlı tábiyatı funkciya shaqırıwları arasındaǵı jaǵday informaciyasın saqlaw ushın paydalı, avtomat bólistiriw qollanıwǵa ańsat, biraq stek keńisligi ádette statikalıq yadqa yamasa stek keńisligine qaraǵanda ádewir sheklengen hám waqıtsha, al dinamikalıq yad bólistiriw ólshemi tek orınlanıw waqtında belgili bolǵan obyektlerdi qolaylı bólistiriwge imkaniyat beredi. Kópshilik C programmaları úshewiniń hámmesinen keń paydalanadı.

Múmkin bolǵanda, avtomat yamasa statikalıq bólistiriw ádette eń ápiwayı, sebebi saqlaw kompilyator tárepinen basqarıladı, bul baǵdarlamashını yadtı qoldan ajıratıw hám bosatıw sıyaqlı potencial qátege beyim wazıypadan azat etedi. Degen menen, kóp maǵlıwmat strukturaları orınlanıw waqtında ólshemin ózgertiwi múmkin, al statikalıq bólistiriwler (hám C99-ǵa shekemgi avtomat bólistiriwler) kompilyaciya waqtında anıq ólshemge iye bolıwı kerek bolǵanlıqtan, dinamikalıq bólistiriw kerek bolǵan kóp jaǵdaylar bar. C99 standartına shekem, ózgeriwshi ólshemli massivler bunıń keń tarqalǵan mısalı edi. (Dinamikalıq bólistirilgen massivlerdiń mısalı ushın C dinamikalıq yad bólistiriw haqqındaǵı maqalasına qarań.) Orınlanıw waqtında basqarılmaytuǵın aqıbetler menen sátsizlikke ushırawı múmkin avtomat bólistiriwden ayırmashılıǵı, dinamikalıq bólistiriw funkciyaları kerekli saqlaw ornı bólistire almaǵanda kórsetkish (nul kórsetkish mánisi formasında) qaytaradı. (Júdá úlken statikalıq bólistiriw ádette programma iske túsiriwden aldın baylanıstırıwshı yamasa júklewshi tárepinen anıqlanadı.)

Basqasha kórsetilmese, statikalıq obyektler programma iske túskende nol yamasa nul kórsetkish mánislerin óz ishine aladı. Avtomat hám dinamikalıq bólistirilgen obyektler tek eger dáslepki mánis anıq kórsetilse ǵana inicializaciyalanadı; basqa jaǵdayda olar dáslep anıq emes mánislerge iye boladı (ádette, saqlaw ornında bar bolǵan hár qanday bit úlgisi, ol hátte sol tip ushın durıs mánisti bildirmewi de múmkin). Eger programma inicializaciyalanbaǵan mániske kiriwge urınsa, nátiyjeler anıqlanbaǵan. Kóp zamanagóy kompilyatorlar bul máseleni anıqlawǵa hám eskertiwge háreket etedi, biraq jalǵan oń hám jalǵan teris nátiyjeler de bolıwı múmkin.

Stek yadın bólistiriw múmkin bolǵanınsha qayta paydalanıw ushın hár qanday programmada onıń haqıyqıy paydalanılıwı menen sinxronlastırılıwı kerek. Mısalı, eger stek yadın bólistiriwge jalǵız kórsetkish kóriw sheńberinen shıǵıp ketse yamasa onıń mánisi anıq bosatılmastan aldın qayta jazılsa, onda ol yad keyingi paydalanıw ushın qaytarıla almaydı hám negizinde programma ushın joytıladı, bul qubılıs yad aǵıwı dep ataladı. Kerisinshe, yad bosatılıwı, biraq keyinirek silteme beriliwi múmkin, bul aldınnan boljanbaytuǵın nátiyjelerge alıp keledi. Ádette, sátsizlik belgileri programmanıń qátege sebep bolatuǵın kodqa baylanıslı bolmaǵan bóliminde payda boladı, bul sátsizlikti anıqlawdı qıyınlastıradı. Bunday máseleler avtomat shıǵındını jıynawı bar tillerde jeńillestiriledi.

Kitapxanalar

C programmalastırıw tili keńeytiwdiń tiykarǵı usılı retinde kitapxanalardı paydalanadı. C tilinde kitapxana — bul bir «arxiv» faylı ishinde jaylasqan funkciyalar toplamı. Hárbir kitapxananıń ádette programma tárepinen qollanılıwı múmkin bolǵan kitapxana ishinde jaylasqan funkciyalardıń prototiplerin hám usı funkciyalar menen paydalanılatuǵın arnawlı maǵlıwmat túrleri menen makro simvollardıń járiyalanıwların óz ishine alǵan baslı faylı boladı. Programma kitapxananı paydalanıwı ushın, ol kitapxananıń baslı faylın qosıwı kerek hám kitapxana programma menen baylanıstırılıwı kerek, bul kóp jaǵdaylarda kompilyator bayraqların talap etedi (mısalı, -lm, «matematika kitapxanasın baylanıstır» sóziniń qısqartpası).

Eń keń tarqalǵan C kitapxanası — bul ISO hám ANSI C standartları menen anıqlanǵan hám hárbir C implementaciyası menen birge keletuǵın C standart kitapxanası (ornatılǵan sistemalar sıyaqlı sheklengen ortalıqlarǵa baǵdarlanǵan implementaciyalar tek standart kitapxananıń bir bólimin ǵana usınıwı múmkin). Bul kitapxana aǵımlı kirgiziw hám shıǵarıwdı, yadtı bólistiriwdi, matematikanı, simvol qatarların hám waqıt mánislerin qollap-quwatlaydı. Bir neshe bólek standart baslılar (mısalı, stdio.h) bul hám basqa standart kitapxana imkaniyatları ushın interfeyslerdi anıqlaydı.

C kitapxana funkciyalarınıń jáne bir keń tarqalǵan toplamı — bul arnawlı túrde Unix hám Unixke uqsas sistemalarǵa baǵdarlanǵan qosımshalar tárepinen qollanılatuǵınlar, ásirese yadroǵa interfeys usınatuǵın funkciyalar. Bul funkciyalar POSIX hám Single UNIX Specification sıyaqlı hár túrli standartlarda tolıq táriyiplengen.

Kóp programmalar C tilinde jazılǵanlıqtan, basqa da hár túrli kitapxanalar bar. Kitapxanalar kóbinese C tilinde jazıladı, sebebi C kompilyatorları nátiyjeli obyekt kodın payda etedi; baǵdarlamashılar keyin Java, Perl hám Python sıyaqlı joqarı dárejeli tillerden paydalanıw ushın kitapxanaǵa interfeysler jaratadı.

Fayllardı qayta islew hám aǵımlar

Fayldı kirgiziw hám shıǵarıw (I/O) C tiliniń óziniń bir bólimi emes, al onıń ornına kitapxanalar (mısalı, C standart kitapxanası) hám olar menen baylanıslı baslı faylları (mısalı, stdio.h) arqalı ámelge asırıladı. Fayldı qayta islew ádette aǵımlar arqalı isleytuǵın joqarı dárejeli I/O arqalı ámelge asırıladı. Bul kózqarastan aǵım — bul qurılmalardan ǵárezsiz maǵlıwmat aǵımı, al fayl — anıq qurılma. Joqarı dárejeli I/O aǵımnıń faylǵa baylanıstırılıwı arqalı orınlanadı. C standart kitapxanasında bufer (yad aymaǵı yamasa gezek) maǵlıwmatlardı aqırǵı orınǵa jiberilmesten aldın waqıtsha saqlaw ushın paydalanıladı. Bul qattı disk yamasa SSD sıyaqlı áste qurılmalardı kútiw waqtın azaytadı. Tómen dárejeli I/O funkciyaları standart C kitapxanasınıń bir bólimi emes[anıqlama kerek], biraq ádette «shiyki temir» programmalastırıwınıń (kópshilik ornatılǵan programmalastırıw sıyaqlı hár qanday operaciyalıq sistemadan ǵárezsiz programmalastırıw) bir bólimi bolıp tabıladı. Az sanlı ózgesheliklerdi esapqa almaǵanda, implementaciyalar tómen dárejeli I/O-nı óz ishine aladı.

Til quralları

C baǵdarlamashılarına anıqlanbaǵan háreketli yamasa múmkin qáte ańlatpaları bar operatorlardı kompilyator tárepinen usınılǵanǵa qaraǵanda úlkenirek qatańlıq penen tabıwǵa hám dúzetiwge járdem beriw ushın bir qatar qurallar islep shıǵılǵan.

Avtomatlastırılǵan derek kodın tekseriw hám audit quralları, mısalı Lint, bar. Keń tarqalǵan ámeliyat — programma birinshi ret jazılǵanda gúmanlı kodtı anıqlaw ushın Lint-ti paydalanıw. Programma Lint-ten ótkennen keyin, ol C kompilyatorı menen kompilyaciya etiledi. Sonday-aq, kóp kompilyatorlar sintaksislik jaqtan durıs, biraq haqıyqatında qáte bolıwı itimal bolǵan konstrukciyalar haqqında qosımsha túrde eskertiw bere aladı. MISRA C — bul ornatılǵan sistemalar ushın islep shıǵılǵan, bunday gúmanlı kodtan qashıw ushın usınıslar toplamı[29].

Sonday-aq, C-diń standart bólimi bolmaǵan háreketlerdi orınlaw ushın kompilyatorlar, kitapxanalar hám operaciyalıq sistema dárejesindegi mexanizmler bar, mısalı, massivler ushın shegara tekseriwi, buferdiń tolıp ketiwin anıqlaw, seriyalaw, dinamikalıq yadtı baqlaw hám avtomat shıǵındını jıynaw.

Purify yamasa Valgrind sıyaqlı yadtı basqarıw tekseriw quralları hám yad bólistiriw funkciyalarınıń arnawlı versiyaları bar kitapxanalar menen baylanıstırıw yadtı paydalanıwdaǵı orınlanıw waqtındaǵı qátelerdi ashıwǵa járdem bere aladı[30][31].

Qollanılıwı

C aqırǵı paydalanıwshı hám sistema dárejesindegi qosımshalardı ámelge asırıw ushın keń qollanılǵan[32].

Sistemalıq programmalastırıwda qollanıwınıń sebepleri

C tilinde jazılǵan ayırım programmalıq támiynatlar

C operaciyalıq sistemalardı hám ornatılǵan sistema qosımshaların ámelge asırıwda sistemalıq programmalastırıw ushın keń qollanıladı[33]. Bul bir neshe sebepke baylanıslı:

  • C tili platforma apparatlıq támiynatına hám yadqa kórsetkishler hám tip túrlendiriw arqalı kiriwge imkaniyat beredi, solay etip sistemaǵa tán ózgeshelikler (mısalı, Basqarıw/Status Registrleri, I/O registrleri) C tilinde jazılǵan kod penen sazlanıwı hám paydalanılıwı múmkin – ol islep atırǵan platformanı tolıq basqarıwǵa imkaniyat beredi.
  • Kompilyaciya nátiyjesinde payda bolǵan kod kóp sistema ózgesheliklerin talap etpeydi hám geypara iske túsiriw kodınan ápiwayı túrde shaqırılıwı múmkin – onı orınlaw ańsat.
  • C tili operatorları hám ańlatpaları ádette maqsetli processor ushın kórsetpeler izbe-izligine jaqsı sáykes keledi hám nátiyjede sistema resurslarına tómen orınlanıw waqtında talap bar – onı orınlaw tez.
  • Operatorlardıń bay toplamı menen, C tili maqsetli oraylıq processorlardıń kóplegen ózgesheliklerin paydalana aladı. Belgili bir oraylıq processorda kóbirek siyrek kórsetpeler bolǵanda, sol kórsetpelerden paydalanıw ushın bálkim ishki funkciyaları bar til variantı qurılıwı múmkin – ol maqsetli oraylıq processordıń derlik barlıq ózgesheliklerin paydalana aladı.
  • Til ekilik maǵlıwmat bloklarına strukturalardı jaylastırıwdı ańsatlastıradı, bul maǵlıwmatlardı túsinip alıwǵa, basqarıwǵa hám ózgertiwge imkaniyat beredi – ol maǵlıwmat strukturaların, hátte fayl sistemaların da jaza aladı.
  • Til pútin san arifmetikası hám logikası ushın, sonıń ishinde bit manipulyaciyası ushın bay operatorlar toplamın hám bálkim hár túrli ólshemdegi haqıyqıy sanlardı qollap-quwatlaydı – ol sáykes strukturalanǵan maǵlıwmatlardı nátiyjeli qayta isley aladı.
  • C — bul tek bir neshe operatorı bar, hám keń kólemli maqsetli kod payda etetuǵın júdá kóp ózgeshelikleri joq, salıstırmalı túrde kishi til – onı túsinip alıw ańsat.
  • C yad ajıratıw hám bosatıw ústinen tikkeley basqarıwǵa iye, bul yad penen islesiw operaciyalarına toqtawlı shıǵındı jıynaw waqıyaları ushın hesh qanday uwayımsız, maqul nátiyjelilik hám aldınnan boljanatuǵın waqıt beredi – onıń ónimdarlıǵı aldınnan boljanatuǵın.
  • C hár túrli yad ajıratıw sxemaların paydalanıwǵa hám ámelge asırıwǵa imkaniyat beredi, sonıń ishinde ádettegi malloc hám free; arenaları bar anaǵurlım quramalı mexanizm; yamasa DMA-ǵa sáykes keletuǵın, úzilis qayta islewshileri ishinde paydalanılatuǵın yamasa virtual yad sisteması menen integraciyalanǵan OS yadrosı ushın versiya.
  • Baylanıstırıwshıǵa hám ortalıqqa baylanıslı, C kodı assembler tilinde jazılǵan kitapxanalardı da shaqıra aladı hám assembler tilinen shaqırılıwı múmkin – ol basqa tómen dárejeli kod penen jaqsı islesedi.
  • C hám onıń shaqırıw qaǵıydaları hám baylanıstırıwshı strukturaları kóbinese basqa joqarı dárejeli tiller menen birge paydalanıladı, C-ǵa da, C-den de shaqırıwlardı qollap-quwatlaydı – ol basqa joqarı dárejeli kod penen jaqsı islesedi.
  • C jetilisken hám keń ekosistemaǵa iye, sonıń ishinde kitapxanalar, freymvorklar, ashıq kodlı kompilyatorlar, sazlawshılar hám utilitalar bar hám de-fakto standart bolıp tabıladı. Drayverlerdiń C tilinde bar bolıwı itimal, yamasa C kompilyatorınıń backend retinde uqsas oraylıq processor arxitekturası bar, sonlıqtan basqa tildi tańlawǵa stimul az.

Oyınlar

Kompyuter oyınları kóbinese tillerdiń kombinaciyasınan qurıladı. C, ásirese kompyuter platformalarınan eń jaqsı ónimdarlıqtı alıwǵa háreket etetuǵın oyınlar ushın, áhmiyetli orın iyelegen. Mısallarǵa 1993-jılǵı Doom kiredi[34].

Dúnya júzilik tor

Tariyxıy jaqtan, C geyde Ulıwma Shlyuz Interfeysi (CGI) arqalı veb-baǵdarlamalastırıw ushın veb-qosımsha, server hám brauzer arasındaǵı informaciya ushın «shlyuz» retinde paydalanılǵan[35]. C óziniń tezligi, turaqlılıǵı hám derlik universal qoljetimliligi sebepli interpretaciyalanatuǵın tillerden artıq kórilgen bolıwı múmkin[36]. Házirgi waqıtta veb-baǵdarlamalastırıwdı C tilinde ámelge asırıw ádettegi ámeliyat emes,[37] hám basqa da kóp veb-baǵdarlamalastırıw tilleri keń tarqalǵan. C tiykarındaǵı veb-baǵdarlamalastırıw dawam etip atırǵan qosımshalarǵa routerlerdegi HTTP konfiguraciya betleri, IoT qurılmaları hám uqsasları kiredi, degen menen hátte bul jerde de ayırım proektlerdiń joqarı dárejeli tillerdegi bólimleri bar, mısalı, OpenWRT ishinde Lua-nı paydalanıw.

Eki ataqlı veb-server, Apache HTTP Server hám Nginx, C tilinde jazılǵan[38][39]. C-diń apparatlıq támiynatqa jaqınlıǵı bul joqarı ónimli programmalıq támiynat sistemaların qurıwǵa imkaniyat beredi.

C aralıq til retinde

C geyde basqa tillerdiń implementaciyaları tárepinen aralıq til retinde paydalanıladı. Bul usıl portativlik yamasa qolaylılıq ushın paydalanılıwı múmkin; C-di aralıq til retinde paydalanıw arqalı qosımsha mashinaǵa tán kod generatorları kerek emes boladı. C-de qatar nomerli preprocessor direktivleri hám inicializator dizimleriniń aqırındaǵı qosımsha artıqsha útirler sıyaqlı generaciyalanǵan kodtıń kompilyaciyasın qollap-quwatlaytuǵın ayırım ózgeshelikler bar. Degen menen, C-diń ayırım kemshilikleri C-- sıyaqlı aralıq til retinde paydalanıw ushın arnawlı proektlestirilgen basqa C-ge tiykarlanǵan tillerdiń islep shıǵılıwına túrtki boldı. Sonday-aq, zamanagóy iri kompilyatorlar GCC hám LLVM ekewi de C emes aralıq kóriniske iye hám bul kompilyatorlar C-di qosqanda, kóp tiller ushın aldıńǵı bólimlerdi (front ends) qollap-quwatlaydı.

Esaplawǵa intensiv kitapxanalar

C baǵdarlamashılarǵa algoritmler hám maǵlıwmatlar strukturalarınıń nátiyjeli implementaciyaların jaratıwǵa imkaniyat beredi, sebebi apparatlıq támiynattan abstrakciya qatlamı juqa hám onıń artıqmashılıǵı tómen, bul esaplawǵa intensiv programmalar ushın áhmiyetli kriteriya. Mısalı, GNU Kóp Anıqlıqlı Arifmetika Kitapxanası, GNU Ilimiy Kitapxanası, Mathematica hám MATLAB tolıǵı menen yamasa bólek C tilinde jazılǵan. Kóp tiller C-degi kitapxana funkciyaların shaqırıwdı qollap-quwatlaydı; mısalı, Python tiykarındaǵı NumPy freymvorkı joqarı ónimli hám apparatlıq támiynat penen islesiw aspektleri ushın C-di paydalanadı.

Basqa tiller C tilinde jazılǵan

C-diń keń tarqalǵan qoljetimliligi hám nátiyjeliliginiń aqıbeti — basqa programmalastırıw tilleriniń kompilyatorları, kitapxanaları hám interpretatorları kóbinese C tilinde ámelge asırıladı[40]. Mısalı, Python,[41] Perl,[42] Ruby,[43] hám PHPdiń[44] anıqlama implementaciyaları C tilinde jazılǵan.

Sheklewler

Ritchi ózi jaratqan tildiń sheklewleri haqqında házillesken:[45]

assembler tiliniń kúshi hám ... assembler tiliniń qolaylılıǵı

— Dennis Ritchi

C ataqlı, tásirli hám úlken tabıslı bolǵanına qaramastan, onıń kemshilikleri de bar, sonıń ishinde:

  • malloc hám free menen standart dinamikalıq yadtı basqarıw qátelerge beyim. Nadurıs paydalanıw yad aǵıwlarına hám asılıp turǵan kórsetkishlerge alıp keliwi múmkin[46].
  • Kórsetkishlerdi paydalanıw hám yadtı tikkeley manipulyaciyalaw yadtıń buzılıwı múmkin ekenin ańlatadı.
  • Tip tekseriwi bar, biraq ol variativ funkciyalar sıyaqlı ayırım tarawlarǵa qollanılmaydı hám tip tekseriwi ápiwayı yamasa abaysızda aylanıp ótiliwi múmkin. Ol statikalıq tiplestirilgenine qaramastan, hálsiz tiplestirilgen.
  • Kompilyator tárepinen generaciyalanǵan kodta az sanlı orınlanıw waqtındaǵı tekseriwler bolǵanlıqtan, baǵdarlamashıǵa barlıq múmkin bolǵan nátiyjelerdi esapqa alıw, buferdiń tolıp ketiwinen, massiv shegaraların tekseriwden, stektiń tolıp ketiwinen hám yadtıń tamamlanıwınan qorǵanıw, sonday-aq báseki jaǵdayların, aǵım izolaciyasın hám t.b. esapqa alıw júklenedi.
  • Kórsetkishlerdi paydalanıw hám olardıń orınlanıw waqtındaǵı manipulyaciyası birdey maǵlıwmatlarǵa kiriwdiń eki usılın (aliasing) múmkin etedi, bul kompilyaciya waqtında bárqulla anıqlanbaydı. Bul Fortran sıyaqlı geypara basqa tiller ushın qoljetimli bolǵan ayırım optimallastırıwlardıń C tilinde múmkin emes ekenin ańlatadı. Usı sebepke baylanıslı, Fortran geyde tezirek dep esaplanadı.
  • Standart kitapxana funkciyalarınıń geyparaları, mısalı, scanf yamasa strncat, buferdiń tolıp ketiwine alıp keliwi múmkin.
  • Generaciyalanǵan kodtaǵı tómen dárejeli variantlardı, mısalı, hár túrli funkciya shaqırıw qaǵıydaları hám ABI-lerdi qollap-quwatlawda sheklengen standartlastırıw bar; hár túrli struktura ornalastırıw qaǵıydaları; hám úlkenirek pútin sanlar ishinde hár túrli bayt tártibi (endianness-ti qosqanda). Kóp til implementaciyalarında bul opciyalardıń geyparaları #pragma preprocessor direktivası menen hám geyparaları qosımsha gilt sózler menen,[47][48] mısalı, __cdecl shaqırıw qaǵıydasın paydalanıw arqalı basqarılıwı múmkin. Direktiv hám opciyalar birdey qollap-quwatlanbaydı[49].
  • Standart kitapxananı paydalanıp qatar menen islesiw anıq yad basqarıwın talap etetuǵın, kodqa intensiv bolıp tabıladı.
  • Til obyektke baǵdarlanǵan programmalastırıwdı, introspeciyanı, orınlanıw waqtında ańlatpanı bahalawdı (JavaScripttegi eval sıyaqlı), shıǵındını jıynawdı hám t.b. tikkeley qollap-quwatlamaydı.
  • Til ózgesheliklerin nadurıs paydalanıwǵa qarsı az sanlı qorǵawshılar bar, bul qollap-quwatlawǵa jaramsız kodqa múmkinshilik beriwi múmkin. Ásirese, C preprocessorı eki ese bahalaw hám onnan da jamanıraq sıyaqlı qıyınshılıqlı tásirlerdi jasıra aladı[50]. Bul túsiniksizlew kod imkaniyatı Xalıqaralıq Túsiniksiz C Kodı Tańlawı hám Astırtın C Tańlawı sıyaqlı tańlawlar menen belgilenip ótilgen.
  • C ayrıqsha jaǵdaylardı qayta islew ushın standart qollap-quwatlawǵa iye emes hám qáte tekseriw ushın tek qaytarıw kodların usınadı. setjmp hám longjmp standart kitapxana funkciyaları makroslar arqalı try-catch mexanizmin ámelge asırıw ushın qollanılǵan[51]. Sonday-aq, goto operatorları kóbinese qáte qayta islew ushın qollanıladı.

Ayırım maqsetler ushın, kemshilikler múmkinshiligin azaytıwǵa urınıwda, C-diń sheklengen stilleri, mısalı, MISRA C yamasa CERT C qabıl etilgen. CWE sıyaqlı maǵlıwmatlar bazaları C-diń potencial hálsizlikleriniń usılların sanawǵa háreket etedi, sonıń menen birge jeńillestiriw boyınsha usınıslar beredi.

Kemshiliklerdiń ayırımların jeńillestiretuǵın qurallar bar. Zamanagóy C kompilyatorları kóp potencial qátelerdi anıqlawǵa járdem beretuǵın eskertiwler payda etetuǵın tekseriwlerdi óz ishine aladı.

Baylanıslı tiller

TIOBE indeksi

C-den keyin islep shıǵılǵan kóp tiller C-den tásirlendi hám C-diń aspektlerin aldı, sonıń ishinde C++, C#, C shell, D, Go, Java, JavaScript, Julia, Limbo, LPC, Objective-C, Perl, PHP, Python, Ruby, Rust, Swift, Verilog hám SystemVerilog[52]. Geyparalar eń keń tarqalǵan tásir sintaksislik bolǵanın aytadı – bul tiller C-diń operator hám ańlatpa sintaksisin C-den ózgeshe, geyde radikal túrde ayırmashılıq etetuǵın tip sistemaları, maǵlıwmat modelleri hám úlken kólemli programma strukturaları menen biriktiredi.

Bir neshe C yamasa C-ge jaqın interpretatorlar bar, sonıń ishinde Ch hám CINT, olar skriptlew ushın da paydalanılıwı múmkin.

Obyektke baǵdarlanǵan programmalastırıw tilleri ataqlı bolǵanda, C++ hám Objective-C obyektke baǵdarlanǵan imkaniyatlardı usınatuǵın C-diń eki hár túrli keńeytpesi edi. Eki til de dáslep derekten-derekke kompilyatorlar retinde ámelge asırılǵan; derek kodı C-ge awdarılıp, keyin C kompilyatorı menen kompilyaciyalanǵan[53].

C++ programmalastırıw tili (dáslep «Klassları bar C» dep atalǵan) Byarn Straustrup tárepinen C-ge uqsas sintaksis penen obyektke baǵdarlanǵan funkcional imkaniyatlardı usınıw usılı retinde oylap tabılǵan[54]. C++ kúshlirek tiplestiriw, kóriw sheńberi hám obyektke baǵdarlanǵan programmalastırıwda paydalı basqa qurallardı qosadı hám shablonlar arqalı ulıwma programmalastırıwǵa imkaniyat beredi. Derlik C-diń superseti bolǵan C++ házir C-diń kópshilik bólimin, bir neshe ózgeshelikler menen qollap-quwatlaydı.

Objective-C dáslep C-diń juqa bir qatlamı bolǵan hám gibrid dinamikalıq/statikalıq tiplestiriw paradigmasın paydalanıp obyektke baǵdarlanǵan programmalastırıwǵa imkaniyat beretuǵın C-diń qatań superseti bolıp qalmaqta. Objective-C óziniń sintaksisin C-den de, Smalltalk-tan da aladı: preprocessorlawdı, ańlatpalardı, funkciya járiyalanıwların hám funkciya shaqırıwların óz ishine alǵan sintaksis C-den miyras alınǵan, al obyektke baǵdarlanǵan ózgeshelikler ushın sintaksis dáslep Smalltalk-tan alınǵan.

C++ hám Objective-C ge qosımsha, Ch, Cilk hám Unified Parallel C derlik C diń supersetleri bolıp tabıladı.

Derekler

  1. Prinz, Peter; Crawford, Tony. [[[:Úlgi:GBurl]] C in a Nutshell] (en). O'Reilly Media, Inc., December 16, 2005 — 3 bet. ISBN 9780596550714. 
  2. Munoz, Daniel «After All These Years, the World is Still Powered by C Programming | Toptal». Toptal Engineering Blog. Qaraldı: 15-iyun 2024-jıl.
  3. «C Language Drops to Lowest Popularity Rating» (en-US). Developer.com (9-avgust 2016-jıl). 22-avgust 2022-jılda túp nusqadan arxivlendi. Qaraldı: 1-avgust 2022-jıl.
  4. «Programming Language Popularity» (2009). 16-yanvar 2009-jılda túp nusqadan arxivlendi. Qaraldı: 16-yanvar 2009-jıl.
  5. «TIOBE Programming Community Index» (2009). 4-may 2009-jılda túp nusqadan arxivlendi. Qaraldı: 6-may 2009-jıl.
  6. Ward, Terry A. (August 1983). "Annotated C / A Bibliography of the C Language". Byte: pp. 268. https://archive.org/stream/byte-magazine-1983-08/1983_08_BYTE_08-08_The_C_Language#page/n267/mode/2up. 
  7. «TIOBE Index for September 2024». 18-sentyabr 2024-jılda túp nusqadan arxivlendi. Qaraldı: 20-sentyabr 2024-jıl.
  8. Ritchie, Dennis «BCPL to B to C». lysator.liu.se. 12-dekabr 2019-jılda túp nusqadan arxivlendi. Qaraldı: 10-sentyabr 2019-jıl.
  9. Jensen, Richard «"A damn stupid thing to do"—the origins of C» (en-us). Ars Technica (9-dekabr 2020-jıl). 28-mart 2022-jılda túp nusqadan arxivlendi. Qaraldı: 28-mart 2022-jıl.
  10. Johnson, S. C.; Ritchie, D. M. (1978). "Portability of C Programs and the UNIX System". Bell System Tech. J. 57 (6): 2021–2048. doi:10.1002/j.1538-7305.1978.tb02141.x. ISSN 0005-8580.  (Note: The PDF is an OCR scan of the original, and contains a rendering of "IBM 370" as "IBM 310".)
  11. „C manual pages“,FreeBSD Miscellaneous Information Manual, FreeBSD 13.0, May 30, 2011.  [1] Yanvar 21, 2021[Sáne tuwrı kelmeydi], sánesinde Wayback Machine saytında arxivlendi.
  12. Stroustrup, Bjarne (2002). Sibling rivalry: C and C++ (PDF) (Report). AT&T Labs. Archived (PDF) from the original on August 24, 2014. Retrieved April 14, 2014.
  13. «Rationale for American National Standard for Information Systems – Programming Language – C». 17-iyul 2024-jılda túp nusqadan arxivlendi. Qaraldı: 17-iyul 2024-jıl.
  14. C Integrity. International Organization for Standardization, March 30, 1995. 
  15. «JTC1/SC22/WG14 – C». Home page. ISO/IEC. 12-fevral 2018-jılda túp nusqadan arxivlendi. Qaraldı: 2-iyun 2011-jıl.
  16. Andrew Binstock. «Interview with Herb Sutter». Dr. Dobbs (12-oktyabr 2011-jıl). 2-avgust 2013-jılda túp nusqadan arxivlendi. Qaraldı: 7-sentyabr 2013-jıl.
  17. «ISO/IEC 9899:2024 (en) — N3220 working draft». Qaraldı: 11-iyul 2025-jıl.
  18. «WG14-N3132 : Revised C23 Schedule». open-std.org (4-iyun 2023-jıl). 9-iyun 2023-jılda túp nusqadan arxivlendi.
  19. «WG14-N3220 : Working Draft, C2y». open-std.org (21-fevral 2024-jıl). 26-fevral 2024-jılda túp nusqadan arxivlendi.
  20. «TR 18037: Embedded C». open-std.org (4-aprel 2006-jıl). 25-fevral 2021-jılda túp nusqadan arxivlendi. Qaraldı: 26-iyul 2011-jıl.
  21. "Committee Draft ISO/IEC 9899:TC3: 5.2.1 Character sets". 2007.
  22. «ISO/IEC 9899:201x (ISO C11) Committee Draft». open-std.org (2-dekabr 2010-jıl). 22-dekabr 2017-jılda túp nusqadan arxivlendi. Qaraldı: 16-sentyabr 2011-jıl.
  23. «10 Common Programming Mistakes in C++». Cs.ucr.edu. 21-oktyabr 2008-jılda túp nusqadan arxivlendi. Qaraldı: 26-iyun 2009-jıl.
  24. Schultz, Thomas. [[[:Úlgi:GBurl]] C and the 8051], 3rd, Otsego, MI: PageFree Publishing Inc., 2004 — 20 bet. ISBN 978-1-58961-237-2. 
  25. Feuer, Alan R.; Gehani, Narain H. (March 1982). "Comparison of the Programming Languages C and Pascal". ACM Computing Surveys 14 (1): 73–92. doi:10.1145/356869.356872. 
  26. For example, gcc provides _FORTIFY_SOURCE. «Security Features: Compile Time Buffer Checks (FORTIFY_SOURCE)». fedoraproject.org. 7-yanvar 2007-jılda túp nusqadan arxivlendi. Qaraldı: 5-avgust 2012-jıl.
  27. เอี่ยมสิริวงศ์, โอภาศ. Programming with C. Bangkok, Thailand: SE-EDUCATION PUBLIC COMPANY LIMITED, 2016 — 225–230 bet. ISBN 978-616-08-2740-4. 
  28. Raymond, Eric S.. [[[:Úlgi:GBurl]] The New Hacker's Dictionary], 3rd, MIT Press, October 11, 1996 — 432 bet. ISBN 978-0-262-68092-9. 
  29. «Man Page for lint (freebsd Section 1)». unix.com (24-may 2001-jıl). Qaraldı: 15-iyul 2014-jıl.
  30. «CS107 Valgrind Memcheck». web.stanford.edu. Qaraldı: 23-iyun 2023-jıl.
  31. Hastings, Reed; Joyce, Bob. "Purify: Fast Detection of Memory Leaks and Access Errors". Pure Software Inc.: 9. https://web.stanford.edu/class/cs343/resources/purify.pdf. 
  32. Munoz, Daniel «After All These Years, the World is Still Powered by C Programming» (en). Toptal Engineering Blog. Qaraldı: 17-noyabr 2023-jıl.
  33. Dale, Nell B.; Weems, Chip. Programming and problem solving with C++, 6th, Burlington, Massachusetts: Jones & Bartlett Learning, 2014. ISBN 978-1449694289. OCLC 894992484. 
  34. «Development of Doom» (en). DoomWiki.org (2-mart 2025-jıl). Qaraldı: 2-mart 2025-jıl.
  35. Dr. Dobb's Sourcebook. U.S.: Miller Freeman, Inc., November–December 1995. 
  36. «Using C for CGI Programming». linuxjournal.com (1-mart 2005-jıl). 13-fevral 2010-jılda túp nusqadan arxivlendi. Qaraldı: 4-yanvar 2010-jıl.
  37. Perkins, Luc «Web development in C: crazy? Or crazy like a fox?» (en). Medium (17-sentyabr 2013-jıl). 4-oktyabr 2014-jılda túp nusqadan arxivlendi. Qaraldı: 8-aprel 2022-jıl.
  38. «What programming language does NGINX use?».
  39. «What is Apache and What Does it Do for Website Development?».
  40. «C – the mother of all languages» (en-US). ICT Academy at IITK (13-noyabr 2018-jıl). 31-may 2021-jılda túp nusqadan arxivlendi. Qaraldı: 11-oktyabr 2022-jıl.
  41. «1. Extending Python with C or C++». Python 3.10.7 documentation. 5-noyabr 2012-jılda túp nusqadan arxivlendi. Qaraldı: 11-oktyabr 2022-jıl.
  42. Conrad, Michael «An overview of the Perl 5 engine» (en). Opensource.com (22-yanvar 2018-jıl). 26-may 2022-jılda túp nusqadan arxivlendi. Qaraldı: 11-oktyabr 2022-jıl.
  43. «To Ruby From C and C++». Ruby Programming Language. 12-avgust 2013-jılda túp nusqadan arxivlendi. Qaraldı: 11-oktyabr 2022-jıl.
  44. Para, Michael «What is PHP? How to Write Your First PHP Program» (en). freeCodeCamp (3-avgust 2022-jıl). 4-avgust 2022-jılda túp nusqadan arxivlendi. Qaraldı: 11-oktyabr 2022-jıl.
  45. Metz, Cade (2011-10-13). „Dennis Ritchie: The Shoulders Steve Jobs Stood On“. Wired. April 12, 2022da túp nusqadan arxivlendi. Qaraldı: April 19, 2022.
  46. Internet Security Research Group. «What is memory safety and why does it matter?». Prossimo. Qaraldı: 3-mart 2025-jıl.
  47. corob-msft «Pragma directives and the __pragma and _Pragma keywords» (en-us). Microsoft Learn (31-mart 2022-jıl). 24-sentyabr 2022-jılda túp nusqadan arxivlendi. Qaraldı: 24-sentyabr 2022-jıl.
  48. «Pragmas (The C Preprocessor)». GCC, the GNU Compiler Collection. 17-iyun 2002-jılda túp nusqadan arxivlendi. Qaraldı: 24-sentyabr 2022-jıl.
  49. «Pragmas» (en). Intel C++ Compiler Classic Developer Guide and Reference. Intel. 10-aprel 2022-jılda túp nusqadan arxivlendi. Qaraldı: 10-aprel 2022-jıl.
  50. «In praise of the C preprocessor». apenwarr (13-avgust 2007-jıl). Qaraldı: 9-iyul 2023-jıl.
  51. Roberts, Eric S. «Implementing Exceptions in C». DEC Systems Research Center (21-mart 1989-jıl). 15-yanvar 2017-jılda túp nusqadan arxivlendi. Qaraldı: 4-yanvar 2022-jıl.
  52. O'Regan, Gerard. Pillars of computing : a compendium of select, pivotal technology firms. Springer, September 24, 2015. ISBN 978-3319214641. OCLC 922324121. 
  53. Rauchwerger, Lawrence. Languages and compilers for parallel computing : 16th international workshop, LCPC 2003, College Station, TX, USA, October 2–4, 2003 : revised papers. Springer, 2004. ISBN 978-3540246442. OCLC 57965544. 
  54. Stroustrup, Bjarne «A History of C++: 1979–1991» (1993). 2-fevral 2019-jılda túp nusqadan arxivlendi. Qaraldı: 9-iyun 2011-jıl.