C (limba)

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
C.
limbaj de programare
C Logo.png
Autor Dennis Ritchie
Data de origine 1972
Ultima versiune C18
Utilizare Generic (eficiență ridicată)
Paradigme imperativ procesual
Tastare Static
Extensii comune .c pentru surse și .h pentru anteturi
Influențată de BCPL , B , ALGOL
A influențat Numeroase, inclusiv C ++ , Objective-C , C # , Swift , D.

În informatică , C este un limbaj de programare imperativ de natură procedurală ; Programele scrise în acest limbaj sunt compuse din expresii matematice și instrucțiuni imperative grupate în proceduri parametrizate capabile să manipuleze diferite tipuri de date .

Este definit ca un limbaj de programare de nivel înalt [1] [2] [3] și integrează caracteristicile limbajelor de nivel scăzut , și anume caractere , numere și adrese , care pot fi indicate prin intermediul operatorilor aritmetici și logici utilizați de mașini reale [4] . C a fost conceput pentru a fi slab și performant, de asemenea, folosește numeroase biblioteci pentru a satisface fiecare tip de cerință, în special biblioteca standard C. Astfel de biblioteci, sub formă de fișiere antet sau fișiere cu sufixul -h, pot fi încărcate folosind directiva preprocesor include .

Istorie

Limbajul a fost dezvoltat inițial de Dennis Ritchie [5] la AT & T's Bell Labs între 1969 și 1973, cu scopul de a-l utiliza pentru elaborarea sistemului de operare UNIX , dezvoltat anterior de Ken Thompson și Ritchie însuși în asamblarea PDP . 7 . În 1972, primul sistem UNIX a debutat pe un DEC PDP-11 , scris în întregime cu noul limbaj de programare C. [6] În 1978 , publicarea cărții Limbajul C l-a făcut să crească rapid, ducând la nașterea mai multor dialecte și de aici necesitatea definirii unui standard.

Prima standardizare a C a fost făcută deANSI în 1989 (ANSI X3.159-1989), cunoscută sub numele de C89. Aceeași versiune, cu doar modificări minime de formatare, a fost ulterior standardizată de ISO în 1990 (ISO / IEC 9899: 1990), cunoscută sub numele de C90. ISO a lansat ulterior încă patru versiuni ale limbajului C, cunoscute sub numele de C95 (ISO / IEC 9899 / AMD1: 1995), C99 (ISO / IEC 9899: 1999), C11 (ISO / IEC 9899: 2011 / Cor 1: 2012) și C18 (ISO / IEC 9899: 2018). Dintre acestea, C99 a adus îmbunătățiri majore limbajului de programare, introducând noi tipuri de date, inițializatoare desemnate pentru tablouri, tablouri de dimensiuni variabile și alte îmbunătățiri împrumutate de la C ++ .

Descriere

Născut împreună cu Unix , C este susținut de toate sistemele de operare utilizate pe scară largă și este utilizat în principal pentru crearea de sisteme de operare , limbaje de programare , biblioteci , jocuri și pentru aplicații performante; este renumit pentru eficiența sa și s-a impus ca limbaj de referință pentru dezvoltarea software-ului de sistem pe majoritatea platformelor hardware moderne. Standardizarea limbajului (mai întâi de ANSI și apoi de ISO ) garantează portabilitatea programelor scrise în C (standard, adesea numit ANSI C) pe orice platformă; în plus față de software-ul de sistem, acesta a fost mult timp limba dominantă într-o serie de alte domenii de aplicații caracterizate prin eficiență. Exemple tipice sunt telecomunicațiile , controlul proceselor industriale și software-ul de sistem în timp real . Dominația C în aceste contexte a scăzut parțial ca urmare a apariției unor alternative semnificative, în primul rând C ++ .

C are, de asemenea, o importanță didactică considerabilă, deși, datorită complexității sale semantice și a relațiilor puternice ale acestei semantice cu funcționarea hardware-ului computerului , nu este un limbaj deosebit de intuitiv pentru începători și, mai ales, pentru cei fără o pregătire adecvată în ceea ce privește electronica computerului. . Dacă la un moment dat liceele și cursurile universitare au adoptat C ca limbaj de referință datorită importanței sale tehnice, astăzi această alegere este motivată și de importanța crescândă a limbajelor derivate din C (de exemplu C ++ , Java și C # și , pentru a permite elevului o abordare inițială mai rapidă și mai intuitivă, limbaje de nivel înalt, cum ar fi Python ).

Caracteristici generale

C este un limbaj de programare relativ minimalist; semantica sa folosește un set restrâns de concepte relativ simple, apropiate de funcționarea hardware-ului computerului. Multe instrucțiuni C pot fi traduse direct cu o singură instrucțiune în limbajul mașinii (de exemplu, operatorii de autoincrementare și auto-descreștere ). În limbaj, un rol central îl joacă conceptul de pointer , care este generalizat până la coincidența cu adresarea indirectă, o modalitate de accesare a memoriei hardware caracteristică tuturor procesoarelor moderne. Acest lucru face din C un limbaj deosebit de eficient. În plus, comparativ cu limbajul de asamblare, C are, de asemenea, o structură logică definită și lizibilă, funcții în stil Pascal și, mai presus de toate, control asupra tipurilor (în timpul compilării), care lipsește complet în limbajul de asamblare.

Sintaxa lui C este destul de versatilă, iar limbajul este sub formă liberă , permițându-vă să scrieți instrucțiuni complexe în câteva linii de cod sau să creați programe criptice și ilizibile ( ofuscarea codului ). În cele din urmă, succesul lui C a fost dictat de faptul că este un limbaj creat de programatori cu experiență, pentru a fi folosit de programatori cu experiență.

Această mare libertate, complexitatea sintactică a limbajului (care, așa cum am văzut, conține puține instrucțiuni de bază) și rolul central al indicatoarelor, pe care este necesar să le folosim practic încă de la primele programe, îl fac, așadar, un limbaj dificil și inadmisibil pentru neofiții, care cad aproape imediat într-o serie de capcane care, deși evidente pentru un expert, sunt foarte greu de observat pentru un începător.

Datorită eficienței speciale a codului produs de compilatorii săi, C a fost folosit pentru a rescrie majoritatea codului sistemului UNIX , reducând utilizarea limbajului de asamblare la un grup mic de funcții. Cu toate acestea, importanța sa a crescut abia după 1978 odată cu publicarea, de către Brian Kernighan și Dennis Ritchie , a cărții The C Programming Language , în care limbajul a fost definit într-un mod precis.

Utilizarea pe scară largă ulterioară a dus la nașterea diferitelor dialecte și, prin urmare, la necesitatea definirii unui standard. În acest scop, în vara anului 1983 , a fost numit un comitet cu sarcina de a crea un standard ANSI ( American National Standards Institute ) care să definească definitiv limbajul C. Procesul de standardizare, care a durat șase ani (mult mai mult decât se aștepta), sa încheiat în decembrie 1989, iar primele exemplare au devenit disponibile la începutul anilor 1990 . Această versiune a C se numește în mod normal C89. Standardul a fost adoptat și de Organizația Internațională pentru Standardizare ( ISO ) în 1999 sub denumirea de Standard C ANSI / ISO. În 1995 , a fost adoptat amendamentul 1 la standardul C care, printre altele, a adăugat funcții noi bibliotecii standard a limbii. Folosind C89 cu amendamentul 1 ca document de bază și combinând utilizarea claselor Simula cu acesta, Bjarne Stroustrup a început să dezvolte C ++ .

Rezultatul final al dezvoltării continue a C a fost standardul promulgat în 1999 , cunoscut sub numele de ISO C99 (cod ISO 9899).

Cu versiunea C11 (2011) unele comenzi sunt ușor revizuite, în timp ce versiunea C18 (2018) a corectat unele aspecte critice ale C11, fără a introduce însă noi caracteristici noi.

Caracteristici ale unor versiuni

C99

  • _Bool date _Bool , care permite stocarea booleenilor false și true ;
  • _Complex date _Complex pentru reprezentarea numerelor complexe;
  • _Imaginary date _Imaginary pentru reprezentarea numerelor imaginare;
  • Tipul de date long long int ;
  • Tipul boolean în <stdbool.h> ;
  • Caracteristicile suplimentare în virgulă mobilă din <float.h> ;
  • Comentarii pe o singură linie introduse de //;
  • Funcții în inline ;
  • Calificatorul de tip restrict , admisibil numai pentru pointerii restricționați;
  • Returnarea implicită int este eliminată;
  • Matricea cu lungime variabilă (VLA);
  • Literali compuși;
  • Inițializatori desemnați
  • Este permis să declarați variabile oriunde doriți într-un bloc de cod, precum și să interpuneți alte instrucțiuni între ele;
  • Funcțiile familiei vscanf;
  • Regulile pentru constantele de tip întreg;
  • Regulile pentru promovarea numerelor întregi (promovarea numărului întreg);
  • Macro-urile matematice generice din <tgmath.it> ;
  • Macrocomenzi cu un număr variabil de argumente;
  • Macro va_copy ;
  • Specificatorul de conversie% lf din funcția printf ();
  • Suport pentru IEEE Floating-Point Arithmetic (IEC 559);
  • Operatorul de preprocesare _Pragma .

C11

Standardul c11 a introdus cinci fișiere de antet noi, și anume <stdalign.h> , <stdatomic.h> , <stdnoreturn.h> , <threads.h> și <uchar.h> , precum și câteva caracteristici care au ajutat la îmbunătățirea limbajului :

  • Macrocomenzile referitoare la specificațiile de aliniere a memoriei cu fișierul antet relativ <stdalign.h> , inclusiv _Alignas și _Alignof , precum și funcția aligned_alloc (Memory Alignment Control);
  • Suport adăugat pentru multi-threading. Noile caracteristici sunt furnizate de biblioteca de fire declarată în fișierul de antet <threads.h> . De asemenea, s-a adăugat calificativul de tip _Atomic în fișierul de antet <stdatomic.h> ;
  • Structurile ( struct ) și uniunile ( union ) anonime;
  • Expresii de tip generic folosind cuvântul cheie _Generic (expresii de tip generic);
  • Suport unicode îmbunătățit cu char16_t (UTF-16) și char32_t (UTF-32) cu funcțiile lor de conversie declarate în <uchar.h> ;
  • A fost eliminată funcția gets() declarată în <stdio.h> ;
  • Specificatorul _Noreturn aplicabil funcțiilor;
  • Afirmații statice utilizând cuvântul cheie _Static_assert (Static Assertions);
  • Funcția quick_exit pentru terminarea unui program;
  • Interfețe de verificare a limitelor (Anexa K);
  • Caracteristici de analizabilitate (Anexa L);
  • Modul exclusiv „ x ” Deschiderea și crearea fișierelor (Mod exclusiv de creare și deschidere):
  • Macrocomenzi pentru crearea numerelor complexe în <complex.h> .

Cuvânt cheie

Limbajul C, ca orice alt limbaj de programare, permite crearea de programe folosind un set de „cuvinte cheie”.

Standardul ANSI a definit următorul set de cuvinte cheie: auto, break, case, char, const, continue, implicit, do, double, else, enum, extern, float, for, go, if, int, long, register, return, scurt, semnat, sizeof, static, struct, switch, typedef , union, nesemnat, nul, volatil, în timp ce.

Exemplu de program

Salut Lume!

Pictogramă lupă mgx2.svg Același subiect în detaliu: Hello world .

Următorul exemplu tipărește textul „ Bună ziua lume! ” La ieșirea standard (care coincide în mod normal cu ecranul terminalului utilizat de runner-ul programului). În educația informatică, utilizarea introducerii fundamentelor unui limbaj de programare cu un program care tipărește „Hello world!” derivă din acest faimos exemplu, preluat din cartea Limbajul C de Kernighan și Ritchie.

 #include <stdio.h>
    
int main ()
{ 
   printf ( "Bună ziua lume! \ n " );
   retur 0 ;
}

Următoarea este o analiză linie cu linie a programului prezentat; acest tip de scriere este executabil numai pe sistemele bazate pe UNIX.

 #include <stdio.h>

Această linie este o directivă de preprocesare . Preprocesorul este un program (sau un modul al unui mediu integrat ) care efectuează unele transformări preliminare ale codului sursă , înainte ca acesta din urmă să fie livrat compilatorului propriu - zis. În acest caz, transformarea necesară este înlocuirea liniei în cauză cu întregul conținut al fișierului antet („ fișier antet ”) „ stdio.h ”. Prezența parantezelor unghiulare indică faptul că fișierul se află într-un director standard cunoscut de preprocesator. Pentru a include un antet (de obicei creat de programator) prezent în același folder în care se află fișierul care trebuie compilat, utilizați o sintaxă precum:

 #include "headername.h"

Cu numele în loc de nomeheader antetul dorit. Un fișier antet , în C, este un fișier care conține declarații de tipuri și funcții de date; în cazul specific, este inclusă introducerea în sursă a declarației funcției standard de bibliotecă printf. Această declarație specifică ce tipuri de parametri este necesar și permis să furnizeze printf și ce tip este valoarea returnată. Ambele informații vor fi apoi utilizate de compilator pentru a verifica dacă utilizarea „Hello world!” face această funcție corectă.

În loc de printf puteți utiliza și funcția puts , scrisă ca

 put ( "Bună ziua lume!" );
 int main ()

O astfel de linie este începutul unei definiții a funcției, în acest caz funcția main . Funcția main este punctul de intrare al unui program C: execuția unui program începe de la prima instrucțiune a main și se termină cu ultima. Orice alte funcții vor intra în joc numai dacă și când sunt apelate (direct sau indirect) din main . În absența unei funcții main , compilatorul nu poate produce un program executabil (dar ar putea produce o bibliotecă ).

Cuvântul cheie int inițial reprezintă tipul valorii returnate de funcție. În cazul special al main , este interpretat ca o valoare returnată de întregul program sistemului de operare . În concordanță cu o convenție universală despre valorile returnate de programe către sistem, main returnează întotdeauna un număr întreg, deși unele texte raportează, de asemenea, în mod incorect declarațiile funcției main cu tipul de returnare void (a se vedea ANSI C ).

 {

Parantezele sunt folosite în C pentru a indica începutul și sfârșitul unui bloc, o unitate de program; în acest caz, funcția main .

 printf ( "Bună ziua, lume! \ n " );

Această linie constituie un apel funcțional; cu alte cuvinte, necesită îndeplinirea funcției. printf este o funcție standard de bibliotecă C care imprimă un mesaj la ieșirea standard . Prin urmare , Bună ziua, lume! Va apărea pe ecran . (fără ghilimele duble, care sunt folosite în codul sursă pentru a indica începutul și sfârșitul șirului ).

\ n ” este o secvență de evadare , adică o secvență de caractere (care în C începe întotdeauna cu caracterul „ \ ”) care va fi tradusă într-un singur caracter în timpul compilării (de obicei nu poate fi tipărit sau interpretat în alt mod). În special, „ \ n ” va fi tradus în caracterul de linie nouă care, atunci când este utilizat cu bibliotecile de mod text standard (la fel ca la printf ), indică fluxul de linie și returnarea căruia textului. Deci, dacă programul este utilizat interactiv, de obicei o deplasare a cursorului .

Punctul și virgula finală a liniei indică sfârșitul instrucțiunii (apelul de funcție).

 retur 0 ;

O declarație începută cu cuvântul cheie return , în cadrul unei funcții, termină funcția în sine și vă permite să specificați o valoare returnată (dacă funcția poate returna una). În cazul particular main , așa cum s-a menționat mai sus, această valoare va fi returnată sistemului de operare ( 0 este revenirea la valoarea sistemului care, în mod convențional, indică încheierea cu succes a unui program).

Exemplu de calculator

Exemplu de calculator care realizează suma, produsul, diferența și cota a două numere întregi:

 #include <stdio.h> // Specificați biblioteca utilizată de program

int main () {
int a ; // Prima valoare
int b ; // A doua valoare
int sum ; // Suma celor două valori
produs int ; // Produsul celor două valori
int diferență ; // Diferența celor două valori
int quoto ; // Citatul celor două valori
    
printf ( "Introduceți primul număr:" ); // Imprimați pe consolă
scanf ( "% d" , & a ); // Citiți o valoare întreagă și „inserați-o” în variabila „a”
    
printf ( "Introduceți al doilea număr:" ); // Imprimați pe consolă
scanf ( "% d" , & b ); // Citiți o valoare întreagă și „inserați-o” în variabila „b”
    
sumă = a + b ; // Calculați suma conținutului variabilei „a” și cea a „b” și „inserați-o” în variabila „sumă”
produs = a * b ; // Calculează produsul din conținutul variabilei „a” și cel al „b” și „îl introduce” în variabila „produs”
diferență = a - b ; // Calculați diferența dintre conținutul variabilei „a” și cea a „b” și „inserați-o” în variabila „diferență”
    
if ( b ! = 0 ) { // Verificați dacă variabila „b” conține o altă valoare decât 0
quoto = a / b ; // Calculați coeficientul conținutului variabilei „a” și cel al „b” și „inserați-l” în variabila „quoto”
}
    
printf ( "Suma este:% d \ n " , sumă ); // Imprimați pe consolă un șir cu valoarea variabilei „sumă”
printf ( "Produsul este:% d \ n " , produs ); // Imprimați pe consolă un șir cu valoarea variabilei „produs”
printf ( "Diferența este:% d \ n " , diferență ); // Imprimați un șir pe consolă cu valoarea variabilei „diferență”
if ( b ! = 0 ) { // Verificați dacă variabila „b” conține o altă valoare decât 0
printf ( "Quoto este:% d \ n " , quoto ); // Imprimați un șir pe consolă cu valoarea variabilei „quoto”
}
    
retur 0 ; // Returnează 0 și termină programul
}

Explicaţie

  • „int” definește variabilele ca numere întregi (a, b, sumă, produs, diferență și quoto sunt variabile)
  • „printf” este instrucțiunea care va imprima ceea ce este conținut între ghilimelele de pe ecran
  • „scanf” citește intrarea și o plasează în variabilă („& a”). În acest caz în cifre zecimale („% d”)
  • "+", "*", "-", "/" sunt, respectiv, operatorii de sumă, produs, diferență și dimensiune
  • Sintaxa „if ()” verifică dacă conținutul din parantezele rotunde este adevărat. Dacă da, execută funcțiile din parantezele crețate (în acest caz: "quoto = a / b")
  • Sintaxa "! =" Înseamnă "diferit". În acest exercițiu se verifică dacă „b” este diferit de 0; dacă se face o divizare cu un divizor egal cu 0, programul va intra în eroare.
  • „Suma este:„% d ”, sumă În loc de„% d ”va fi tipărit conținutul„ sumei ”(% d înseamnă că va fi tipărit un număr întreg)
  • „returnare” este cuvântul cheie care indică terminarea funcției, returnând valoarea 0. Terminarea funcției main () determină și terminarea programului.

Secvențe de evadare

Secvenţă Numele fontului
\la bip
\ b backspace
\ f FF - feed formular (salt de pagină)
\ n LF - feed de linie sau newline
\ r CR - retur de transport
\ t filă orizontală
\ v filă verticală
\\ \ (bară inversă)
\ ' '(superscript)
\ " "(ghilimele duble)
\ 0 NULL (caracter nul sau sfârșitul șirului)

Limbi conexe

Multe dintre limbajele de programare moderne moderne sunt inspirate de C și moștenesc o parte din sintaxa sa. Unele limbaje (cum ar fi Java , C ++ , C # și Objective C ) păstrează o mare parte din sintaxa lui C și o extind pentru a sprijini mai bine diferite paradigme de programare, în timp ce alte limbaje modernizează sintaxa, dar încearcă să mențină aceeași paradigme și domenii de aplicații ale C, cum ar fi programarea sistemului (de exemplu, Go ) sau sistemele integrate (de exemplu, Zig ).

C ++

Pictogramă lupă mgx2.svg Același subiect în detaliu: C ++ .

Limbajul de programare C ++ a fost inițial derivat din C. Cu toate acestea, nu toate programele C sunt valabile în C ++. Pe măsură ce C și C ++ au evoluat independent, incompatibilitățile lor au crescut [7] . Versiunea C99 a creat mai multe conflicte. Diferențele fac dificilă scrierea de programe și biblioteci care funcționează atât în ​​C cât și în C ++ și creează confuzie pentru cei care programează în ambele limbi. Disparitatea face dificilă adoptarea de către ambele limbi a caracteristicilor celeilalte.

Bjarne Stroustrup , creatorul C ++, a sugerat în mod repetat [8] că incompatibilitățile dintre C și C ++ ar trebui reduse cât mai mult posibil pentru a maximiza interoperabilitatea dintre cele două limbi. Alții au susținut că, din moment ce C și C ++ sunt limbaje diferite, compatibilitatea dintre cele două este utilă, dar nu vitală. Conform acestei poziții, eforturile de reducere a incompatibilității nu ar trebui să împiedice încercările de îmbunătățire autonomă a limbilor.

Astăzi, diferențele majore (în afară de adăugarea în C ++ de clase, șabloane, spații de nume, supraîncărcare) între cele două limbi sunt:

  • inline - funcțiile inline sunt cuprinse global în C ++,
  • Tipul bool în C99 este definit în <stdbool.h> . Standardul anterior C nu a definit un tip boolean și s-au folosit diverse metode (incompatibile) pentru a simula tipul boolean.
  • Constantele de caracter individuale au dimensiunea unui int în C și a unui char în C ++.
  • Cuvinte cheie suplimentare sunt introduse în C ++ și, prin urmare, nu pot fi utilizate ca identificatori așa cum a fost permis în C (de exemplu, try , catch , template , new , delete ...)
  • În C ++, compilatorul creează automat o etichetă pentru fiecare struct , union sau enum , apoi struct S {}; în C ++, în C este echivalent cu typedef struct S {} S; .

Obiectiv-C

Pictogramă lupă mgx2.svg Același subiect în detaliu: Obiectivul C.

Limbajul Objective C își datorează popularitatea Apple, care l-a ales ca bază pentru sistemele sale de operare macOS , iOS , watchOS și tvOS . Este un limbaj orientat obiect și, spre deosebire de C ++ , menține compatibilitatea deplină cu C.

În 2014, Apple introduce un nou limbaj, Swift , care a înlocuit obiectivul C în programarea sistemelor de operare menționate anterior.

Notă

  1. ^ Oualline , p. 8 .
  2. ^ Kochan , p. 1 .
  3. ^ Deitel , p. 7 .
  4. ^ Limbajul C - Principii de programare și manual de referință (ediția a doua) - Brian W. Kernighan, Dennis M. Ritchie , Pearson Prentice Hall, p. Introducere - XIV.
  5. ^ Dennis Ritchie și Brian Kernighan, XI , în limbajul C. Principiile de programare și manualul de referință , Prentice Hall, 2004, p. 320.
    „C a fost proiectat și scris pentru sistemul de operare UNIX, pe DEC PDP-11, de către Dennis Ritchie .
  6. ^ (EN) Dennis Ritchie, The Development of the C Language (PDF), din Bell Labs / Lucent Technologies, 1993. Accesat la 1 mai 2017.
    „C a luat ființă în anii 1969-1973, în paralel cu dezvoltarea timpurie a sistemului de operare Unix; perioada cea mai creativă a avut loc în cursul anului 1972 " .
  7. ^ Incompatibilități între ISO C și ISO C ++ , pe david.tribble.com .
  8. ^ Sibling Rivalry: C și C ++ ( PDF ), la research.att.com .

Bibliografie

Elemente conexe

Alte proiecte

linkuri externe

Controllo di autorità LCCN ( EN ) sh85018532 · GND ( DE ) 4113195-2 · BNF ( FR ) cb119665180 (data)
Informatica Portale Informatica : accedi alle voci di Wikipedia che trattano di informatica