|
Trusa de unelteÎn alte limbi
|
C (limbaj de programare)
The C Programming Language - Limbajul de programare C, de Brian Kernighan şi Dennis Ritchie, ediţia originală ce a servit pentru mulţi ani ca manual de referinţă al limbajului C.
C este un limbaj de programare standardizat, compilat, de nivel mediu. Este implementat pe marea majoritate a platformelor de calcul existente azi, şi este cel mai popular limbaj de programare pentru scrierea de software de sistem. Este apreciat pentru eficienţa codului obiect pe care îl poate genera, şi pentru portabilitatea sa. A fost dezvoltat la începutul anilor 1970 de Ken Thompson şi Dennis Ritchie, care aveau nevoie de un limbaj simplu şi portabil pentru scrierea nucleului sistemului de operare UNIX. Sintaxa limbajului C a stat la baza multor limbaje create ulterior şi încă populare azi: C++, Java, JavaScript, C#.
[modifică] Generalităţi C[modifică] Scurtă introducere în CC este un limbaj de programare relativ minimalist ce operează în strânsă legătură cu hardware-ul, fiind cel mai apropiat de limbajul de asamblare faţă de marea majoritate a celorlalte limbaje de programare. Întradevăr, C este prezentat uneori ca "asamblor portabil", făcându-se astfel diferenţele principale faţă de limbajele de asamblare: codul unui program C poate fi compilat şi rulat pe aproape orice tip de maşină, în comparaţie cu alte limbaje de programare, în timp ce limbajele de asamblare sunt specifice unui model specific de maşină. Limbajul C este plasat în clasa limbajelor de nivel scăzut sau de nivel mediu, indicând cât de strânsă este legătura de interoperabilitate cu echipamentul hardware. Nu este un accident; C a fost creat având un scop important: de a face ca programele mari să poată fi scrise mai uşor şi cu mai puţine erori în paradigma programării procedurale, dar fără a pune un obstacol în scrierea compilatorului de C, care este încărcat de caracteristicile complexe ale limbajului. În concluzie, C are urmatoarele caracteristici importante:
Printre caracteristicile ce lipsesc în C dar care pot fi regăsite în alte limbaje de programare se enumeră:
Deşi lista minusurilor limbajului C este destul de lungă, aceasta nu reprezintă un dezavantaj important pentru a face limbajul C să nu fie acceptat în practică, deoarece permite ca noi compilatoare să poată fi scrise pe noi tipuri de platforme şi pentru că permite programatorului să ţină bine sub control programul pe care îl scrie. Acesta este unul din motivele care face ca un cod scris în C să fie mult mai eficient decât dacă ar fi scris în alte limbaje de programare. În mod normal numai un cod scris într-un limbaj de asamblare, cu foarte mare grijă să poată fi mai performant, deoarece are control integral asupra maşinii, dar performanţa avansată a compilatoarelor, combinată cu complexitatea noilor tipuri de procesoare, au făcut ca limbajul C să fie preferat şi să fie acceptat din ce în ce mai mult de programatori. Una din consecinţele acceptării şi eficienţei C-ului este acela că multe compilatoare, biblioteci şi interpretoare ale limbajelor de nivel înalt sunt adesea implementate în C. [modifică] Un exemplu de program C: "Hello, World!"Următorul exemplu de program a apărut în prima ediţie a cărţii lui Brian Kernighan şi Dennis Ritchie, şi a devenit un exemplu standard de program introductiv în marea majoritate a cărţilor de programare, indiferent de limbajul de programare. Programul afişează „Hello World!“ la ieşirea standard, care este de obicei un terminal sau monitor. Poate să fie totuşi şi un fisier sau alt dispozitiv hardware, depinzând cum a fost mapată ieşirea standard în momentul execuţiei programului.
#fff3f2e <stdio.h>
main()
{
printf("Hello, World!\n");
}
Programul prezentat mai sus va fi compilat corect de marea majoritate a compilatoarelor moderne. Totuşi, va produce unele mesaje de avertizare dacă va fi compilat de un compilator ce respectă standardul ANSI C. Mai mult, codul nu va fi compilat, returnând mesaje de eroare dacă compilatorul va respecta strict standardele C99, deoarece variabila de întors de tip
#fff3f2e <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
Urmează o discuţie linie cu linie a programului prezentat mai sus: #fff3f2e <stdio.h> Prima linie a programului reprezintă o directivă preprocesor, int main(void) Următoarea linie indică faptul că funcţia numită
{
Paranteza acoladă deschisă indică începutul codului pentru funcţia
printf("Hello World\n");
Aceasta linie apelează—caută şi execută codul—funcţia
return 0;
Această funcţie termină execuţia codului funcţiei } Paranteza acoladă închisă indică că aici se termină codul pentru funcţia Compatibilitatea totală cu alte compilatoare care respectă standardul C99 poate fi insă atinsă prin următorul cod:
#fff3f2e <stdio.h>
#fff3f2e <stdlib.h>
int main(void) {
printf("Hello world!\n");
return EXIT_SUCCESS;
}
Constanta [modifică] Tipuri de dateC are un sistem de tipuri de date similar cu cel al descendenţilor ALGOL cum ar fi Pascal, dar totuşi cu anumite diferenţe. Cuprinde tipuri de date cum ar fi întregi de diferite dimensiuni cu sau fără semn, numere în virgulă mobilă, enumerări ( C utilizează foarte mult pointerii, un tip de referinţă foarte simplu care păstrează adresa locaţiei din memorie. Adresa poate fi manipulată cu ajutorul atribuirilor şi a aritimeticii pointerilor. În momentul rulării unui program, un pointer reprezintă o adresă de memorie. În momentul compilării, un pointer este un tip de dată complex ce reprezintă atât adresa de memorie cât şi tipul de dată. Acest lucru permite expresiilor ce utilizează pointeri să fie evaluate după tipul de dată. Pointerii au mai multe utilizări în C. De exemplu, şirurile de caractere (text string) sunt adesea reprezentate printr-un pointer la un vector de caractere. Alocarea dinamică a memoriei este realizată tot cu ajutorul pointerilor. Un pointer null are o valoare rezervată indicând faptul că face referire la o locaţie nevalidă. Acest lucru este folositor în cazuri speciale cum ar fi pointerul next (următorul) în nodul final al unei liste înlănţuite. Dereferenţierea unui pointer null poate cauza un comportament nepredictibil al aplicaţiei. De asemenea, există şi pointeri de tip În C, tablourile sunt de dimensiune fixă, statică cunoscută la momentul compilării; în practică acest lucru nu reprezintă o piedică, având în vedere că se pot aloca blocuri de memorie în momentul rulării, tratându-le ca pe tablouri utilizând librăria standard. Spre deosebire de multe alte limbaje de programare, C reprezintă tablourile ca şi pe pointeri: o adresă şi un tip de dată. Prin urmare, valorile index pot depăşi dimensiunea actuală a unui tablou. De asemenea, C oferă posibilitatea de lucru cu tablouri multidimensionale. Din punct de vedere semantic tablourile multidimensionale sunt tablouri de tablouri, dar din punct de vedere fizic acestea sunt stocate ca un singur tablou unidimensional cu un offset calculat. C este adesea folosit în programarea de nivel scăzut, unde poate fi necesar ca un întreg să fie tratat ca o adresă de memorie, un număr în virgulă mobilă ca un întreg sau un tip de pointer ca un alt tip de pointer. Pentru astfel de cazuri C oferă operatorul de casting, care forţează explicit conversia unei valori dintr-un tip de dată în alt tip de dată. [modifică] Alocarea memorieiUna din cele mai importante funcţii ale unui limbaj de programare este ca acesta să furnizeze metode de management a memoriei şi al obiectelor stocate în memorie. C furnizează trei metode distincte de alocare a memoriei pentru obiecte:
Nu toate variabilele sunt automat alocate. Următoarele tipuri de variabilă sunt alocate static:
Variabilele alocate static au alocată locaţia lor de memorie şi iniţializată înainte ca funcţia Acolo unde este posibil, alocarea automată sau statică este preferată deoarece alocarea memoriei este coordonată de compilator, nemaifiind nevoie ca programatorul să aloce iar apoi să elibereze memoria - operaţie ce adesea generează erori. Totuşi, multe structuri de date sunt variabile în dimensini şi deoarece alocarea automată şi cea statică trebuie să fie de dimensiune fixă în momentul compilării, sunt multe situaţii în care alocarea dinamică trebuie folosită. Un exemplu ar fi tablourile de dimensiuni variabile. [modifică] Sintaxa
Spre deosebire de alte limbaje de programare cum ar fi Fortran 77, C-ul are o formă liberă, lăsând programatorul să-şi organizeze codul folosind spaţiile albe. Comentarii pot fi înserate oriunde în cadrul programului utilizând delimitatorii Fiecare fişier sursă conţine declaraţii de variabile şi definiţii de funcţii. Funcţiile, la rândul lor, conţin alte declaraţii de variabile şi comenzi. Declaraţiile de variabile fie definesc noi tipuri folosind cuvinte cheie precum Comenzile execută acţiuni cum ar fi cele de modificare ale valorii unei variabile sau afişarea unui text la consolă. Structurile de control sunt variabile pentru execuţii condiţionale sau iteraţii, realizate cu ajutorul cuvintelor rezervate [modifică] Istoric[modifică] Începuturile limbajului de programare CEtapa iniţială de dezvoltare a limbajului de programare C a avut loc în cadrul laboratoarelor AT&T Bell între anii 1969 şi 1973. După spusele lui Dennis Ritchie, cea mai creativă perioadă a avut loc în 1972. A fost denumit „C“ deoarece multe din caracteristicile sale au fost derivate din limbajul de programare „B“. Sunt multe legende despre originea limbajului C şi legătura sa cu sistemul de operare Unix, cum ar fi:
Începând cu anul 1973, limbajul de programare C a devenit destul de robust, astfel încât mare parte a kernelului Unix, scris iniţial în limbaj de asamblare pentru PDP 11/20, a fost rescris în C. Acesta a fost unul din primele kernele ale unui sistem de operare scris într-un limbaj de programare, altul decât limbajul de asamblare. Încercări anterioare au fost pentru scrierea sistemului Multics (scris în PL/I) şi TRIPOS (scris în BCPL). [modifică] K&R CÎn 1978, Dennis Rithie şi Brian Kernighan au publicat prima ediţie a cărţii Limbajul de programare C (eng. The C Programming Language). Această carte, cunoscută în cercul programatorilor sub numele K&R, a servit pentru mulţi ani ca un mijloc de informare asupra specificaţiilor limbajului C. Versiunea limbajului C descrisă este cunoscută sub numele K&R C. K&R aduce în discuţie următoarele caracteristici ale limbajului:
K&R C este adesea considerat limbajul de bază pe care orice compilator C trebuie să-l suporte. Pentru mulţi ani, chiar şi după introducerea standardului ANSI C, a fost considerat ca fiind „cel mai mic numitor comun“ pe care programatorii în C trebuie să-l respecte atunci când se vorbeşte de portabiliitate maximă, deoarece nu toate compilatoarele sunt scrise încă să suporte standardul ANSI C, iar o secvenţă de cod scrisă în K&R C respectă şi ANSI C. În primele versiuni C, numai funcţiile care returnau o valoare non-integer trebuiau să fie definite sau declarate înainte de folosire. Despre o funcţie folosită fără ca aceasta să fi fost declarată în prealabil se presupunea că întoarce un întreg. Parametrii funcţiilor nu erau verificaţi după tip, totuşi unele compilatoare afişau un mesaj de atenţionare dacă o funcţie era apelată cu un număr greşit de argumente. În anii ce au urmat publicaţiei K&C R, câteva caracteristici „neoficiale“ au fost adăugate limbajului C, fiind suportate de compilatoarele celor de la AT&T, precum şi de alţi producători. Acestea includ:
[modifică] ANSI C şi ISO CLa sfârşitul anilor 1970, C a început să înlocuiască limbajul BASIC devenind cel mai utilizat limbaj de programare. În anii 1980 a fost adoptat şi de calculatoarele IBM PC, popularitatea acestuia începând să crească semnificativ. În acest timp, Bjarne Stroustrup împreună cu alţi colegi de la Bell Labs au început să adauge limbajului C caracteristici ale programării orientate pe obiecte. Limbajul rezultat a fost denumit C++ şi este cel mai popular limbaj de programare pe sistemele de operare Microsoft Windows; totuşi C-ul rămâne cel mai popular limbaj de programare în Unix. Alt limbaj de programare dezvoltat în acea vreme se numeşte Objective-C care adaugă de asemenea C-ului caracteristici ale programării orientate pe obiecte. Deşi nu la fel de popular ca C++, Obejective-C este folosit pentru dezvoltarea aplicaţiilor pe ce folosesc interfaţa Cocoa a sistemului de operare Mac OS X. În 1983, American National Standards Institute (ANSI) a format un comitet, X3J11, pentru a stabili specificaţiile unui limbaj C standard. După un proces îndelungat, standardul a fost terminat în 1989 şi ratificat ca ANSI X3.159-1989 "Programming Language C". Această versiune a limbajului ne este cunoscută sub numele ANSI C. în 1990, standardul ANSI C (cu mici modificări) a fost adoptat de International Organization for Standardization (ISO) ca ISO/IEC 9899:1990. Una din ţintele procesului de standardizare ANSI C a fost acela de a produce un superset al K&R C, încorporând multe dintre caracteristicile neoficiale introduse secvenţial. Totuşi, comitetul pentru standardizare a introdus câteva caracteristici noi, cum ar fi prototipul funcţiilor (împrumutat din C++) şi un preprocesor mult mai capabil. ANSI C este suportat de marea majoritate a compilatoarelor folosite astăzi. Mare parte din codul C scris acum este bazat pe ANSI C. Orice program scris exclusiv în standardul C este garantat să funcţioneze corect pe orice platformă cu o implementare C conformă. Totuşi, multe programe sunt scrise astfel încât aceste vor putea fi compilate numai pe anumite platforme, sau folosind un anumit compilator, deoarece (i) se folosesc biblioteci non-standard, de exemplu pentru interfaţa grafică, (ii) unele compilatoare ce nu respectă standardul ANSI C, deci şi urmaşii lor în mod implicit sau (iii) bazarea pe dimensiunea unui anumit tip de date pe anumite platforme. [modifică] C99După procesul de standardizare ANSI, specificaţiile limbajului de programare C au rămas nemodificate pentru o perioadă, în timp ce C++ a continuat să evolueze. (Amendamentul Normativ I a creat o nouă versiune a limbajului C în 1995, dar această versiune este prea puţin cunoscută.) Totuşi, la sfârşitul anilor 1990, standardul a suferit o revizie, conducând la publicarea standardului ISO 9899:1999 în anul 1999. Acest standard este cunoscut sub numele „C99“. A fost adoptat ca standard ANSI în martie 2000. Noile aspecte ale limbajului C includ:
În ceea ce priveşte interesul în adoptarea noului standard C99, dacă GCC şi alte compilatoare suportă noile caracteristici C99, compilatoarele celor de la Microsoft şi Borland nu suportă C99 şi cele două companii nu par interesate în a oferi nici un fel de suport. [modifică] Diferenţe între C, C++ şi Pascal[modifică] Comparaţie cu limbajul Pascal
[modifică] C şi C++Limbajul de programare C++ a fost iniţial derivat din C. Totuşi, nu absolut orice program scris în C este valid C++. Deoarece C şi C++ au evoluat independent, au apărut, din nefericire, o serie de incompatibilităţi între cele două limbaje de programare [1]. Cea mai amplă revizie a limbajui C, C99, a creat un număr suplimentar de conflicte. Diferenţele fac să fie greu de scris programe şi biblioteci care să fie compilate şi să ruleze corect în calitate de cod C sau C++, şi produce confuzii celor care programează în ambele limbaje. Diferenţele fac ca fiecare din cele două limbaje de programare să împrumute din caracteristicile celuilalt limbaj de programare. Bjarne Stroustrup, creatorul limbajului C++, a sugerat de nenumărate ori [2] să se reducă incompatibilităţile pe cât de mult posibil pentru a maximiza interoperabilitatea dintre cele două limbaje de programare. Unii au argumentat că C şi C++ sunt două limbaje de programare distincte, compatibilitatea dintre ele fiind utilă dar nu vitală; potrivit acestei opinii, eforturile de a reduce incompatibilitatea nu trebuie să reducă eforturile de a aduce elemente noi în mod independent celor două limbaje de programare. Cele mai importante diferenţe sunt:
C99 a adoptat unele funcţionalităţi ce au apărut iniţial în C++. Printre acestea se enumeră:
[modifică] ExempluUn program care citeşte un număr întreg şi îl afişează. Pascal:
program test;
var i:integer;
begin
writeln('introduceti un nr:');
read(i);
end.
C:
#fff3f2e <stdio.h> // contine declaratiile functiilor de intrare/iesire
int main() // program principal
{
int i;
printf("Introduceti un nr:");
scanf("%d",&i); //citire
return 0;
}
C++:
#fff3f2e <iostream> // contine declaratiile functiilor de intrare/iesire
int main() // program principal
{
int i;
std::cout<<"Introduceti un nr:";
std::cin>>i; //citire
return 0;
}
[modifică] Vezi şi[modifică] Bibliografie
|
|||||||||||||||||||||||||||||||||||||||||||||||||