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 Multe, inclusiv C ++ , Objective-C , C # , Swift , D.

În calcul , C este un limbaj de programare de natură imperativă procedurală ; Programele scrise în acest limbaj sunt alcătuite din expresii matematice și instrucțiuni obligatorii grupate în proceduri parametrizate capabile să gestioneze 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 aritmeticii și operatorilor logici pe care le folosiți mașinile reale [4] . C a fost conceput pentru a fi eficient și eficient, de asemenea beneficiază de multe biblioteci pentru a face față oricărui tip de cerință, în special a bibliotecii standard C. Aceste biblioteci, sub formă de fișiere antet sau fișiere cu sufixul -h, pot fi încărcate folosind directiva include a preprocesatorului .

Istorie

Limbajul a fost dezvoltat inițial de Dennis Ritchie [5] la Bell Labs de AT & T între 1969 și 1973, cu scopul de a-l utiliza pentru elaborarea sistemului de operare UNIX , realizat anterior de Ken Thompson și Ritchie același ansamblu al 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ă de la „ANSI în 1989 (ANSI X3.159-1989), cunoscut sub numele de C89. Aceeași versiune, doar cu modificări minore de formatare, a fost ulterior și prin standardizarea „ ISO 1990 (ISO / IEC 9899: 1990), cunoscută sub numele de C90. ISO a lansat ulterior alte 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 totalitatea sistemelor de operare ale angajaților de utilizare largă și este utilizat în principal pentru realizarea de sisteme de operare , limbaje de programare , biblioteci , jocuri și aplicații de înaltă performanță; Este renumit pentru eficiența sa și s-a impus ca limbaj de referință pentru realizarea software-ului de sistem pe majoritatea platformelor hardware moderne. Standardizarea limbajului (partea dinaintea ISO ' ANSI și apoi Dell') asigură portabilitatea programelor scrise în C (standard, adesea spus ANSI C) pe orice platformă; în plus față de software-ul de sistem, acesta a fost mult timp limba dominantă într-o varietate de alte domenii de aplicații caracterizate concentrate pe eficiență. Exemple tipice sunt telecomunicațiile , controlul proceselor industriale și sistemul software în timp real . Dominația C în aceste contexte este parțial scăzută ca urmare a introducerii de alternative semnificative, în special C ++ .

C are, de asemenea, o importanță educațională 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 calculatoarele electronice . Acolo unde odată cursurile de liceu și facultate au adoptat C ca limbaj de referință datorită importanței sale tehnice, această alegere este astăzi o motivație suplimentară în importanța crescândă a limbajelor derivate din C (de exemplu, C ++ , Java și C # și, până la permite elevilor o abordare inițială mai rapidă și mai intuitivă, limbaje la 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 un singur limbaj al mașinii de instrucțiuni (de exemplu, creșterea și descreșterea automată a operatorilor). În limbaj, un rol central îl joacă conceptul de pointer , care este generalizat pentru a coincide cu adresarea indirectă, o modalitate de a accesa memoria hardware caracteristică tuturor procesorelor moderne. Acest lucru face din C un limbaj deosebit de eficient. În plus, pentru limbajul de asamblare, C are o structură logică mai definită și mai ușor de citit, stilul funcțiilor Pascal și mai ales verificarea tipului (la compilare), care lipsește complet în limbajul de asamblare.

Sintaxa lui C este destul de versatilă, iar limbajul este în 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 produsului de către compilatorii săi, C a fost folosit pentru a rescrie o mare parte din codul 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 Limbajul de programare C , în care limbajul a fost definit cu precizie.

Următoarea sa utilizare foarte largă a dus la apariția 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 ANSI ( American National Standards Institute ) care să definească definitiv limbajul C. Procesul de standardizare, care a durat șase ani (mult mai mult decât era de așteptat), sa încheiat în decembrie 1989 , iar primele exemplare au devenit disponibile la începutul anului 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 noi caracteristici standardelor de limbă ale bibliotecii . Folosind ca document de bază, C89 cu amendamentul 1 și alăturându-se utilizării claselor de Simula , Bjarne Stroustrup a început să dezvolte C ++ .

Rezultatul final al dezvoltării continue a standardului C a fost 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

  • Tipul de date _Bool , care admite stocarea Boolean fals și adevărat;
  • Tipul de date _Complex pentru reprezentarea numerelor complexe;
  • Tipul de date _Imaginary pentru reprezentarea numerelor imaginare;
  • Tipul de date long long int ;
  • Tipul boolean în <stdbool.h> ;
  • Funcționalitatea suplimentară în virgulă mobilă <float.h> ;
  • Comentarii cu o singură linie introduse de //;
  • Funcțiile în inline ;
  • restrict calificativului de tip, permisă numai pentru pointeri (pointer restricționat);
  • A eliminat ' int return implicit;
  • 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);
  • Tipul macro generic matematic 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, sau <stdalign.h> , <stdatomic.h> , <stdnoreturn.h> , <threads.h> și <uchar.h> , precum și câteva caracteristici care au ajutat la îmbunătățirea limba:

  • Macro inerent în specificațiile de aliniere ale memoriei cu fișierul de antet asociat <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 firele de bibliotecă declarate în fișierul antet <threads.h> . S-a adăugat, de asemenea, tipul calificativului _Atomic header file <stdatomic.h> ;
  • Structurile ( struct ) și uniunile ( union ) anonime;
  • Expresii generice folosind cuvântul cheie _Generic (expresii tip-generice);
  • Suport unicode îmbunătățit cu tipurile de date char16_t (UTF-16) și char32_t (UTF-32) cu funcțiile relative de conversie declarate în <uchar.h> ;
  • Eliminată funcția gets() declarată în <stdio.h> ;
  • Specificatorul _Noreturn aplicabil funcțiilor;
  • Afirmații statice după cuvânt cheie _Static_assert (Afirmații statice);
  • 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):
  • Macrocomenzile 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 imprimă textul „ Hello world! ” („Hello world!”) Pe ieșirea standard (care coincide în mod normal cu ecranul terminalului folosit de cei care rulează programul). Î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, bazat pe 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ă pentru preprocesor . Preprocesatorul este un program (sau un modul al unui mediu integrat ) care efectuează unele transformări preliminare ale codului sursă , înainte ca acesta să fie livrat chiar compilatorului . În acest caz, procesarea necesară este înlocuirea liniei în cauză cu întregul conținut al antetului fișierului („fișiere 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 "nomeheader.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 de date și funcții ; în acest caz, este inclus în sursă introducerea declarației bibliotecii de funcții standard printf. Această declarație, care specifică ce tipuri de parametri este necesară și este permisă pentru a furniza printf și ce fel este valoarea ei 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 puts , scrise ca

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

O linie de acest tip 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 programului începe de la prima instrucțiune a main și se termină cu ultima. Orice alte funcții vor intra în joc numai dacă și atunci când sunt apelate (direct sau indirect) din main . În absența unei funcții main , compilatorul nu poate produce un program executabil (dar poate produce o bibliotecă).

Cuvântul cheie inițial int reprezintă tipul de valoarea returnată de funcția. În cazul special al main , acesta este interpretat ca valoarea returnată de la întregul program la sistemul de operare . În concordanță cu o convenție universală privind valorile returnate de programul de sistem, main returnează întotdeauna un număr întreg, deși unii aduc înapoi texte și declarații greșite ale 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 a bibliotecii standard C care tipărește un mesaj pe ieșirea standard . Prin urmare, ecranul va afișa mesajul Bună ziua, lume! (fără ghilimele, 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ă la compilare într-un singur caracter (de obicei neprimabile sau interpretate în orice alt mod) . În special, „\ n” va fi tradus în caracterul de linie nouă care, atunci când este utilizat cu bibliotecile standard în modul text (la fel ca la printf ), indică fluxul de linie și returnarea căruia textului. Deci, dacă programul este utilizat interactiv, de obicei o schimbare a cursorului .

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

 retur 0 ;

O instrucțiune a început cu cuvântul cheie return , în cadrul unei funcții, termină aceeași funcție și specifică o valoare returnată (dacă funcția o putem returna). În cazul particular al main , așa cum s-a spus mai sus, această valoare va fi returnată sistemului de operare ( 0 este valoarea returnată sistemului care, în mod convențional, indică încheierea unui program cu succes).

Exemplu de calculator

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

 #include <stdio.h> // Specifică 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 valoare diferită de 0
quoto = a / b; // Calculați coeficientul conținutului variabilei „a” și cel al „b” și „inserați-l” în variabila „quoto”
}
    
printf ( "Suma și ':% d \ n", sumă); // Imprimați pe consolă un șir cu valoarea variabilei „sumă”
printf ( "Produsul și ':% d \ n", produs); // Imprimați pe consolă un șir cu valoarea variabilei „produs”
printf ( "Diferența și ':% d \ n", diferență); // Imprimați pe consolă un șir cu valoarea variabilei „diferență”
if (b! = 0) {// Verificați dacă variabila „b” conține o valoare diferită de 0
printf ( "Quoto și ':% 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 (întrerupere pagină)
\ n LF - feed de linie sau newline
\ r CR - retur de transport (Retur de transport - cursor la începutul liniei)
\ t filă orizontală
\ v filă verticală
\\ \ (bară inversă)
\ ' '(superscript)
\ " "(ghilimele duble)
\ 0 NULL (caracter nul sau sfârșitul șirului)

Limbi conexe

Multe dintre principalele limbaje moderne de programare 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ă păstreze aceleași paradigme și domenii de aplicații. de C, ca programare a sistemului (de exemplu, Go ) sau sisteme 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 ++. În timp ce C și C ++ au evoluat independent, ele și-au sporit incompatibilitatea [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 repetate rânduri [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 au sfera globală în C ++,
  • Tipul bool 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 cu un singur caracter au dimensiunea unui int în C și a unui char în C ++.
  • Cuvintele 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 și 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, deoarece Apple 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 ++ , păstrează compatibilitatea deplină cu C.

În 2014, Apple introduce un nou limbaj, Swift , care a înlocuit programarea Objective C pe sistemele de operare de mai sus.

Notă

  1. ^ Oualline , p. 8 .
  2. ^ Kochan , p. 1 .
  3. ^ Deitel , p. 7 .
  4. ^ Limbajul C - Introducere în 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 standardele de programare în limbaj C și manualul de referință, Prentice Hall, 2004, p. 320.
    "C a fost proiectat și scris pentru sistemul de operare UNIX, DEC PDP-11, de 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) pe 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