Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Introducere in c

INTRODUCERE IN C


Ce ste un limbaj de programare cu scop general. El este puternic legat de sistemul UNIX, deoarece a fost dezvoltat pe acest sistem si deoarece UNIX-ul si software-ul sau sint scrise in C. Cu toate acestea, limbajul nu este legat de un anume sistem deoperaresau calculator; si, desi a fost numit 'limbaj de programare sistem', deoarece este util in scrierea sistemelor de operare, el a fost folosit la fel de bine in scrierea de programe importante ce trateaza probleme numerice, prelucrari de texte sau baze de date.


Cesteunlimbaj relativ'de nivel inferior'.Aceasta caracterizare nu este peiorativa; ea inseamna pur si simplu ca C opereazacuaceeasi clasa de obiecte cucare lucreaza majoritateacalculatoarelor,si anume caractere, numere si adrese.Acestea pot fi combinate si prelucrate cu operatori aritmetici si logici implementati pe actualele calculatoare.




C nu poseda operatii pentru a prelucra direct obiecte compuse, cum ar fi siruri decaractere, multimi,liste sau tablouri considerate ca un intreg. Nu exista nici o analogie, de exemplu, cu operatiile din PL/1 care manipuleaza un intreg tablou sau sir. Limbajulnudefineste nici o alta facilitate de alocare de memorieinafarade definitiile statice si de lucrul cu stiva folosite de variabilele locale ale functiilor;nu exista colectii reziduale sau de gramezi ca in Algol 68.In sfirsit, limbajul C in sine nu are facilitati de intrare-iesire: nu exista instructiuni READ sau WRITE si nici metode de acces la fisiere,'cablate' in limbaj. Toate aceste mecanisme de nivel inalt trebuiesc facute prin apeluri explicite de functii.


In mod similar,C ofera numai constructii directe, liniare decontrol alfluxului: teste, bucle, grupari, si subprograme,insanumultiprogramare,operatiiparalele, sincronizari sau corutine.


Cu toate ca absenta acestor caracteristici ar parea o grava deficienta('Vrei sa spui ca trebuie sa apelez ofunctie pentru a compara doua siruri de caractere?'),pastrarea limbajului la o dimensiune modesta a adus beneficii reale. Deoarece C este relativ mic, el poate fi descris intr-un spatiu redus si invatat repede.Un compilator pentru C poate fi simplu si compact. Compilatoarele sint deasemenea usor de scris; folosind tehnologia curenta, ne putem astepta la un timp de citeva luni pentru scrierea unui compilator nou si sa avem surpriza ca 80%din codul noului compilator este comun cu cele existente. Aceasta dovedeste marele grad de mobilitate a limbajului. Deoarece tipurile de date si structurile de control posedate de C sint suportate de majoritatea calculatoarelor existente,biblioteca necesara executiei [run - time] necesara pentru aimplementa programele independente este minuscula. Pe PDP-11, de exemplu, eacontine numai rutinele pentru inmultirea si impartirea pe 32 de biti si subrutinele ce realizeaza secventele de inceput si de sfirsit. Desigur, fiecare implementare poseda o biblioteca cuprinzatoaresi compatibila de functii pentru a indeplini functiile de I/O, a trata sirurile si operatiile de alocare de memorie dar,deoarece se apeleaza numai explicit, poate fi evitata daca e nevoie; ea poate fi scrisa portabil chiar in C.


Din nou, deoarece limbajul reflecta capacitatile calculatoarelor curente, programele C tind sa fie suficient de eficiente astfel ca nu exista nici o constringere pentrua le scrie in limbajul de asamblare. Cel mai evident exemplu in acest sens este chiar sistemul de operare UNIX, care este scris aproape in intregime in C. Din cele 13000 de linii de cod ale sistemului, numai aproximativ 800 de linii de la nivelul cel mai de jos sint scrise in limbajul de asamblare. In plus, software-ul pentru toate aplicatiile UNIX esentiale este scris in C; marea majoritate a utilizatorilor UNIX (inclusiv unul din autorii acestei carti) nici macar nu cunosc limbajul de asamblare al lui PDP-11.




CutoatecaC se potriveste cu caracteristicilemultor calculatoare,eleste independentde arhitectura oricarui calculator particular si astfel, cu putina grija,este usor a scrieprograme 'portabile', adica programe care pot fi rulate fara modificari pe varietate de calculatoare. In mediul nostru este deja un fapt obisnuit ca programele dezvoltate pe UNIX sa fie transportate pe sistemele Honeywell,IBM si Interdata. In realitate, compilatoarele de C si suportuldeexecutie pentru aceste patrutipuride calculatoaresintmai compatibiledecitversiunile presupuse standard ANSI pentru FORTRAN. Sistemul de operare UNIX insusi se executa acum atit pe PDP-11 cit si pe Interdata 8/32. In afara programelor care, in mod necesar, sint intrucitva dependente de tipul decalculator, ca: asamblorul, compilatorul, depanatorul - software-ul scris in

Cesteidenticpe ambele calculatoare.Chiar in cadrul sistemului de operare, 7000 de linii de cod, in afara suportului pentru limbajul de asamblare si handlerelor dispozitivelor de I/O este identic in proportie de 95%.


Pentruprogramatorii familiari cu alte limbaje,sepoate dovedi util sa mentionam citeva aspecte istorice, tehnice si filosofice legate de C, pentru contrast si comparatie.


Multe dincele mai importante idei din C isi au radacina in limbajul -de acum suficient de batrin, dar inca viabil - BCPL, dezvoltat de Martin Richards. Influenta lui BCPL asupra lui C apare indirect prin limbajul B, care a fost scris de Ken Thompson in 1970 pentru primul sistem UNIX pe un PDP-7.


Cu toate impartaseste multe caracteristici esentiale cu BCPL, limbajulC nu este in nici un sens un dialect al acestuia. Limbajele BCPL si B sintlimbaje 'faratipuri'[typeless]: singurul tip de data este cuvintul masina,si accesul la alte tipuri de obiecte se face cu operatori speciali sau apeluri de functii.In C obiectele (datele) fundamentale sint caracterele,intregii de diferite dimensiunisi numerele flotante. In plus, exista o ierarhie de tipuri de date derivate

create cu pointeri, tablouri, structuri, uniuni si functii.


Limbajul C poseda constructiile fundamentale pentru controlul fluxului necesare pentru programele bine structurate: grupare de instructiuni; luarededecizii ('if'); buclare cu test de terminare la inceput ('while', 'for') sau la sfirsit ('do'), selectare aunui caz dintr-o multime de cazuri posibile ('switch'). (Toate acestea erau valide si in BCPL, chiar daca cu o sintaxa diferita; acest limbaj anticipa voga pentru 'programare structurata' cu mai multi ani inainte).


Limbajul C foloseste pointeri si are abilitatea de a face aritmetica cu adrese.Argumentelefunctiilorsintpasate copiind valoarea argumentului si este imposibil pentru functia apelata sa modifice argumentul real din apelant. Cind se doreste sa se obtina un'apel prin referinta', se trimite explicit un pointer, iar functia poate modifica obiectul la care puncteaza pointerul. Numele detablourisinttrimise ca locatie a originii tabloului, asa ca argumentele tablouri sint efectiv apeluri prin referinta.




Oricefunctiepoatefi apelata recursivsivariabilele sale sint tipic 'automate' sau create nou cu fiecare invocare. Definitiile de functii nu pot fi imbricate dar variabilele pot fideclarate in maniera de bloc structurat. Functiileunui program C pot fi compilate separat.Variabilele pot fi interne uneifunctii, externedar cunoscute numai intr-unsingur fisier sursa, sau complet globale.Variabilele interne pot fi automate sau statice. Variabilele automate pot fi in registre pentru eficienta marita, dar declaratia de registru este numai interna compilatorului si nu se refera la vreun registru specific al calculatorului.

Limbajul C nu este un limbaj puternic tipizat in sensul lui PASCAL sau Algol - 68. El este relativ liberal in conversia de date, cu toate ca nu converteste automat tipurile de date cum ar fi PL/1. Compilatoarele existente nu poseda verificarela executie a indicilor elementelor de tablouri,tipurilor argumentelor, etc.

Pentru acele situatii in care se cere o puternica verificare a tipului, se foloseste o versiune separata a compilatorului. Acest program se numeste 'lint' deoarece triaza bitii dubiosi of fluff dintr-unprogram. El nu genereaza cod, verificanumai foartestrictmulte aspecte ale programelor asa cum pot fi verificatelacompilare si la incarcare. Eldetecteaza nepotrivirile de tip, folosirea inconsistenta a argumentelor, variabilele nefolosite sau aparent neinitializate, dificultatile potentiale de portabilitatesi alteasemeneaaspecte. Programelecare trec cu bine aceasta verificare, cu citeva exceptii, se elibereaza de erorile de tip la fel de complet ca si, de exemplu, programele scrise in Algol 68. Vom mentiona si alte capacitati ale lui 'lint' atunci cind ni se va ivi ocazia.

In fine, limbajul C, ca si alte limbaje, are defectele sale. Unii din operatori au o pondere gresita;o parte sau parti ale sintaxei ar fi putut fi mai bune; exista mai multe versiuni ale limbajului diferind foarte putin una de alta. Cu toate acestea, limbajul C s-a dovedit a fi un limbaj extrem de eficace si expresiv pentru o larga varietate de aplicatii de programare.

Restul cartii este organizat dupa cum urmeaza. Capitolul 1 este o initiere in partea centrala a limbajului C. Scopul lui este sa faca cititorul sa inceapa sa programeze in C cit mairepede posibil,deoarecenoi credem puternic ca singurul mod dea invataunlimbaj nou este de a se scrie programe in el. 'Initierea' presupune o cunoastere a elementelor de baza ale programarii;nusedauexplicatiidesprecalculatoare, compilatoaresi nicidespre semnificatiaunor expresii ca, de exemplu, n = n + 1. Cu toate ca am incercat pe cit posibil sa aratam tehnici de programare utile, cartea aceasta nu se vrea de referinta in structuri de date si algoritmi; cind am fost fortati sa alegem, ne-am concentrat asupra limbajului.



Capitolele2-6discuta diferite aspecte ale limbajului C mai detaliat si mai formal decit o face Capitolul 1,cu toate ca accentul cade tot pe exemple de programe utile complete sinu pe fragmente izolate.

Capitolul 2 se ocupa cu tipurile de date fundamentale, operatorii si expresiile.

Capitolul 3 trateaza controlul fluxului: if-else, while, for, etc.

Capitolul 4 acopera functiile si structura programului -variabile externe, reguli dedomeniu,si asa mai departe.

Capitolul5discuta pointerii si aritmetica adreselor.

Capitolul 6 contine detalii despre structuri si uniuni.

Capitolul7descriebiblioteca Cstandardde I/O care asigura o interfata bisnuita cu sistemul de operare. Aceasta biblioteca de I/O este tratata pe oate calculatoarele care suporta limbajul C, asa ca programele care o folosesc entruintrari, iesiri si alte functii sistem pot fi mutate de pe un sistem pe altul in principal fara modificari.

Capitolul 8 descrie interfata intre programele C si sistemul de operare UNIX, concentrindu-se asupraoperatiilor de intrare/iesire, sistemului de fisiere si portabilitatii.Cu toateca acest capitol este oarecum specific pentru UNIX, programatoriicare nu folosesc acest sistem pot gasi si aici un material util, inclusiv o privire asupra moduluiincare este implementata o versiune a bibliotecii standard, precum si sugestii pentru a obtine un cod portabil.

AnexaA contine manualul de referinta al limbajului C. Acesta este declaratia 'oficiala' a sintaxei si semanticii lui C si (exceptind compilatoarele proprii) arbitrul final al oricarui ambiguitati sau omisiuni din capitolele precedente.

Deoarece C este un limbaj in dezvoltare care exista pe o varietate de calculatoare,anumite parti din aceastacarte pot sa nu mai corespunda cu stadiul curent de dezvoltare pentru un sistem particular. Am incercat sa evitam aceste probleme si sa atentionam asupra potentialelor dificultati. Cind am fost in dubiu, am ales in general descrierea situatiei PDP-11 UNIX, care este mediul de lucru al majoritatii programatorilor inC. Anexa A contine deasemenea diferentele de implementarepentru C pe sistemele majore pe care el poate fi gasit.