Sunteți pe pagina 1din 45

Cuprins

Cuvnt nainte
Introducere

PARTEA I-A: Fundamentele programrii


Calculatorul este agenda, telefonul i televizorul secolului urmtor. tii s-l
folosii?
Capitolul I: Arhitectura calculatoarelor
Modul n care programm un calculator depinde direct de modul n care
acesta este construit. Nu putem gndi reprezentarea i prelucrarea
informaiilor fr s tim care sunt principiile constructive de baz ale
calculatorului pentru care gndim. De aceea, nainte de toate, s ncercm s
aflm cum funcioneaz un calculator modern.
Capitolul II: Limbaje de programare
Pentru a putea programa, este necesar s avem cu calculatorul un limbaj
comun, numit limbaj de programare, cu ajutorul cruia s descriem
informaiile pe care dorim s le prelucrm i modul n care acestea trebuiesc
prelucrate. Limbajele de programare actuale, dei foarte diferite ntre ele, ofer
n principiu aceleai tipuri de informaie primitiv i aceleai tipuri de operaii.
Capitolul III: Reprezentarea informaiilor cu obiecte
Programarea orientat pe obiecte este cea mai nou tehnologie de proiectare a
programelor de calculator. Aceasta ne permite, n esen, s modelm
informaiile cu care lucreaz calculatorul ntr-un mod similar cu acela n care

percepem obiectele reale: fiecare obiect este un uniune ntre proprieti i


comportament.

PARTEA A II-A: Descrierea limbajului Java


Despre un om care tie dou limbi se spune c este de dou ori mai detept.
Dar ce spunei despre un programator care tie dou limbaje?
Capitolul IV: Structura lexical Java
La nceputul prezentrii fiecrui limbaj de programare trebuie s definim
exact setul de caractere cu care lucreaz limbajul, modul de construcie a
identificatorilor, comentariilor i literalilor specifici, care sunt operatorii i
separatorii limbajului. n plus, trebuie s avem o list complet a cuvintelor
rezervate Java.
Capitolul V: Componente de baz ale programelor Java
Componentele de baz ale oricrui limbaj de programare sunt variabilele,
expresiile i instruciunile. Ca orice alt limbaj de programare, Java i
definete propriile tipuri de date, implementeaz principalele instruciuni ale
programrii structurate i i definete propriii operatori i modul n care pot fi
folosii acetia la construcia expresiilor.
Capitolul VI: Obiecte Java
Pentru a fi un limbaj orientat obiect, Java trebuie s defineasc o cale de a
crea noi clase de obiecte i de a le instania. n plus, limbajul trebuie s ofere
suport pentru principalele trsturi ale limbajelor orientate obiect: ncapsulare
i derivare.

PARTEA A III-A: Tehnici de programare n Java


A cunoate o limb nu este totul. Mai trebuie s ai i ceva de spus.
Capitolul VII: Modele de programare
Modul n care este lansat un program i modul n care evolueaz execuia sa
ulterioar depinde de limbajul n care a fost scris programul i de mediul
hardware i software n care ruleaz programul. Limbajul Java definete
dou moduri diferite pentru execuia programelor: aplicaiile Java i apleturile
Java.

Capitolul VIII: Structura programelor


n mod normal, sursele unui program complex sunt mprite n mai multe
fiiere pentru o administrare mai uoar. n Java, exist n mod normal cte
un fiier surs pentru fiecare clas de obiecte n parte. Limbajul Java
definete o serie de structuri sintactice care permit conectarea codului rezultat
n urma compilrii diferitelor clase precum i organizarea acestor clase ntr-o
structur ierarhic de pachete.
Capitolul IX: Fire de execuie i sincronizare
n contextul sistemelor de operare moderne, lucrul cu fire multiple de execuie
este n acelai timp o necesitate i o mod. Din pcate, fiecare sistem de
operare i definete propria sa bibliotec de funcii pentru a suporta aceast
facilitate. Limbajul Java, pentru a fi portabil cu adevrat, este obligat s-i
defineasc propriul su suport pentru firele multiple de execuie.
Bibliografie

JavaRo
(C) IntegraSoft 1996-1998

Cuvnt nainte
Dei trim ntr-o societate n care rata de schimb a tehnologiei a ajuns s ne
depeasc, exist domenii care se schimb mult prea lent fa de
ateptrile noastre. S lum de exemplu calculatoarele. Nu exist zi n care
s nu auzim de nouti n ceea ce privete viteza, numrul de culori sau
miniaturizarea. Nu exist zi n care s nu auzim de noi aplicaii i de noi
domenii n care a fost introdus informatica. i totui, nimic esenial nu s-a
schimbat n partea de fundamente. Aceeai arhitectur numeric
guverneaz ntreg spectrul de calculatoare aflate azi pe pia ca i acum
jumtate de secol.
n ceea ce privete comunicaia om-calculator, lucrurile nu stau cu mult
mai bine. Dei nu mai comunicm folosindu-ne de cifre binare i nici n
limbaje apropriate de main, comunicm n continuare folosindu-ne de
cteva primitive structurale de tip bucle sau condiii plus directive de calcul
i transfer al informaiilor. Abstracii precum programarea logic,
funcional sau orientat obiect nu extind blocurile de baz cu care
acionm asupra mainii, le fac doar mai accesibile pentru modul nostru de
a gndi.
ntr-un fel, programarea face exact aceeai greeal pe care a fcut-o i
logica clasic statund c orice enun nu poate fi dect adevrat sau fals,
fr nici o alt nuanare. n pasul imediat urmtor s-au stabilit cteva
enunuri adevrate fr demonstraie i s-a considerat c toate celelalte
enunuri trebuie deduse din ele. Programarea a fcut aceleai presupuneri
n ceea ce privete comunicaia om-calculator: exist cteva primitive
funcionale de baz i toat comunicaia trebuie s poat fi exprimat cu
ajutorul acestora.
n aceste condiii, este normal ca apariia fiecrui nou limbaj de programare
s trezeasc un interes major n lumea informatic. De fiecare dat, sperm
c noul limbaj ne va permite o exprimare mai uoar, mai flexibil, mai
bogat. De aceea, la apariia fiecrui limbaj de programare care promite s
ias din anonimat, ne grbim s aflm care sunt principalele faciliti care
ni se ofer.
Apariia limbajului Java a fost nsoit de mult publicitate i de mult
scepticism. Prerile au variat de la a spune c Java este o revoluie n
programarea calculatoarelor i, mai ales, a reelelor de calculatoare pn la
afirmaii care neag orice caracter novator al noului limbaj i care pun

succesul Java n exclusivitate pe seama renumelui de care se bucur firma


Sun i a campaniei publicitare inteligent condus de marketingul acestei
firme.
Indiferent ns de motivul pentru care limbajul Java a ajuns la cota
extraordinar de popularitate pe care o simim cu toii, sentimentul general
este acela c Java a devenit deja o realitate i va rmne aa pentru
suficient de mult timp. Suficient de mult pentru a fi interesai s apreciem
n cunotin de cauz care este adevrul despre acest nou limbaj. Oricum,
de la apariia limbajului C++, acum mai bine de un deceniu n urm, nici
un alt limbaj nu a nnegrit atta hrtie i nu a adus attea beneficii
vnztorilor de servicii Internet.
Sper ca aceast carte s ofere suportul de care avei nevoie pentru a v
putea forma propria prere: avem n fa o revoluie sau un alt fapt comun?
Trgu Mure, 24 aprilie 1996
[cuprins]
(C) IntegraSoft 1996-1998

Introducere
Scurt istoric
Ce este Java?
Despre aceast carte
Convenii utilizate n aceast carte
Sugestii i reclamaii
Alte surse de informaii
Mulumiri
Scurt istoric

Limbajul Java mpreun cu mediul su de dezvoltare i execuie au fost


proiectate pentru a rezolva o parte dintre problemele actuale ale
programrii. Proiectul Java a pornit cu scopul declarat de a dezvolta un
software performant pentru aparatele electronice de larg consum. Aceste
echipamente se definesc ca: mici, portabile, distribuite i lucrnd n timp
real. De la aceste aparate, ne-am obinuit s cerem fiabilitate i uurin n
exploatare.
Limbajul luat iniial n considerare a fost C++. Din pcate, atunci cnd s-a
ncercat crearea unui mediu de execuie care s respecte toate aceste
condiii s-a observat c o serie de trsturi ale C++ sunt incompatibile cu
necesitile declarate. n principal, problema vine din faptul c C++ este
prea complicat, folosete mult prea multe convenii i are nc prea multe
elemente de definiie lsate la latitudinea celor care scriu compilatoare
pentru o platform sau alta.
n aceste condiii, firma Sun a pornit proiectarea unui nou limbaj de
programare asemntor cu C++ dar mult mai flexibil, mai simplu i mai
portabil. Aa s-a nscut Java. Printele noului limbaj a fost James Gostling
care v este poate cunoscut ca autor al editorului emacs i al sistemului de
ferestre grafice NeWS. Proiectul a nceput nc din 1990 dar Sun a fcut
public specificaia noului limbaj abia n 1995 la SunWorld n San
Francisco.
Numele iniial al limbajului a fost Oak, numele unui copac care crete n
faa biroului lui James Gostling. Ulterior, s-a descoperit c numele fusese
deja folosit n trecut pentru un alt limbaj de programare aa c a fost
abandonat i nlocuit cu Java, spre deliciul programatorilor care iubesc

cafenelele i aromele exotice.


Ce este Java?

n primul rnd, Java ncearc s rmn un limbaj simplu de folosit chiar i


de ctre programatorii neprofesioniti, programatori care doresc s se
concentreze asupra aplicaiilor n principal i abia apoi asupra tehnicilor de
implementare a acestora. Aceast trstur poate fi considerat ca o reacie
direct la complexitatea considerabil a limbajului C++.
Au fost ndeprtate din Java aspectele cele mai derutante din C++ precum
suprancrcarea operatorilor i motenirea multipl. A fost introdus un
colector automat de gunoaie care s rezolve problema dealocrii memoriei n
mod uniform, fr intervenia programatorului. Colectorul de gunoaie nu
este o trstur nou, dar implementarea acestuia n Java este fcut
inteligent i eficient folosind un fir separat de execuie, pentru c Java are
ncorporate faciliti de execuie pe mai multe fire de execuie. Astfel,
colectarea gunoaielor se face de obicei n timp ce un alt fir ateapt o
operaie de intrare-ieire sau pe un semafor.
Limbajul Java este independent de arhitectura calculatorului pe care
lucreaz i foarte portabil. n loc s genereze cod nativ pentru o platform
sau alta, compilatorul Java genereaz o secven de instruciuni ale unei
maini virtuale Java. Execuia aplicaiilor Java este interpretat. Singura
parte din mediul de execuie Java care trebuie portat de pe o arhitectur
pe alta este mediul de execuie cuprinznd interpretorul i o parte din
bibliotecile standard care depind de sistem. n acest fel, aplicaii Java
compilate pe o arhitectur SPARC de exemplu, pot fi rulate fr recompilare
pe un sistem bazat pe procesoare Intel.
Una dintre principalele probleme ale limbajelor interpretate este viteza de
execuie, considerabil sczut fa de cea a limbajelor compilate. Dac nu v
mulumete viteza de execuie a unei astfel de aplicaii, putei cere mediului
de execuie Java s genereze automat, plecnd de la codul mainii virtuale,
codul specific mainii pe care lucrai, obinndu-se astfel un executabil
nativ care poate rula la vitez maxim. De obicei ns, n Java se compileaz
doar acele pri ale programului mari consumatoare de timp, restul
rmnnd interpretate pentru a nu se pierde flexibilitatea. Mediul de
execuie nsui este scris n C respectnd standardele POSIX, ceea ce l face
extrem de portabil.
Interpretorul Java este gndit s lucreze pe maini mici, precum ar fi

procesoarele cu care sunt dotate aparatele casnice. Interpretorul plus


bibliotecile standard cu legare dinamic nu depesc 300 Koctei. Chiar
mpreun cu interfaa grafic totul rmne mult sub 1 Moctet, exact ca-n
vremurile bune.
Limbajul Java este orientat obiect. Cu el se pot crea clase de obiecte i
instane ale acestora, se pot ncapsula informaiile, se pot moteni
variabilele i metodele de la o clas la alta, etc. Singura trstur specific
limbajelor orientate obiect care lipsete este motenirea multipl, dar pentru
a suplini aceast lips, Java ofer o facilitate mai simpl, numit interfa,
care permite definirea unui anumit comportament pentru o clas de obiecte,
altul dect cel definit de clasa de baz. n Java orice element este un obiect,
n afar de datele primare. Din Java lipsesc funciile i variabilele globale.
Ne rmn desigur metodele i variabilele statice ale claselor.
Java este distribuit, avnd implementate biblioteci pentru lucrul n reea
care ne ofer TCP/IP, URL i ncrcarea resurselor din reea. Aplicaiile Java
pot accesa foarte uor reeaua, folosindu-se de apelurile ctre un set
standard de clase.
Java este robust. n Java legarea funciilor se face n timpul execuiei i
informaiile de compilare sunt disponibile pn n momentul rulrii
aplicaiei. Acest mod de lucru face ca sistemul s poat determina n orice
moment neconcordana dintre tipul referit la compilare i cel referit n
timpul execuiei evitndu-se astfel posibile intruziuni ruvoitoare n sistem
prin intermediul unor referine falsificate. n acelai timp, Java detecteaz
referinele nule dac acestea sunt folosite n operaii de acces. Indicii n
tablourile Java sunt verificai permanent n timpul execuiei i tablourile nu
se pot parcurge prin intermediul unor pointeri aa cum se ntmpl n C/C+
+. De altfel, pointerii lipsesc complet din limbajul Java, mpreun cu
ntreaga lor aritmetic, eliminndu-se astfel una din principalele surse de
erori. n plus, eliberarea memoriei ocupate de obiecte i tablouri se face
automat, prin mecanismul de colectare de gunoaie, evitndu-se astfel
ncercrile de eliberare multipl a unei zone de memorie.
Java este un limbaj cu securitate ridicat. El verific la fiecare ncrcare
codul prin mecanisme de CRC i prin verificarea operaiilor disponibile
pentru fiecare set de obiecte. Robusteea este i ea o trstur de securitate.
La un al doilea nivel, Java are incorporate faciliti de protecie a obiectelor
din sistem la scriere i/sau citire. Variabilele protejate ntr-un obiect Java
nu pot fi accesate fr a avea drepturile necesare, verificarea fiind fcut n

timpul execuiei. n plus, mediul de execuie Java poate fi configurat pentru


a proteja reeaua local, fiierele i celelalte resurse ale calculatorului pe
care ruleaz o aplicaie Java.
Limbajul Java are inclus suportul nativ pentru aplicaii care lucreaz cumai
multe fire de execuie, inclusiv primitive de sincronizare ntre firele de
execuie. Acest suport este independent de sistemul de operare, dar poate fi
conectat, pentru o performan mai bun, la facilitile sistemului dac
acestea exist.
Java este dinamic. Bibliotecile de clase n Java pot fi reutilizate cu foarte
mare uurin. Cunoscuta problem a fragilitii superclasei este rezolvat
mai bine dect n C++. Acolo, dac o superclas este modificat, trebuie
recompilate toate subclasele acesteia pentru c obiectele au o alt structur
n memorie. n Java aceast problem este rezolvat prin legarea trzie
variabilelor, doar la execuie. Regsirea variabilelor se face prin nume i nu
printr-un deplasament fix. Dac superclasa nu a ters o parte dintre vechile
variabile i metode, ea va putea fi refolosit fr s fie necesar recompilarea
subclaselor acesteia. Se elimin astfel necesitatea actualizrii aplicaiilor,
generat de apariia unei noi versiuni de bibliotec aa cum se ntmpl, de
exemplu, cu MFC-ul Microsoft (i toate celelalte ierarhii C++).
Despre aceast carte

Aceast carte a fost scris pentru a veni n sprijinul acelora care doresc s
programeze n limbajul Java. Spre deosebire de majoritatea crilor existente
la ora actual pe piaa internaional, nu prea multe de altfel, cartea de fa
se focalizeaz asupra facilitilor pe care le ofer noul limbaj, lsnd pe
planul al doilea descrierea bibliotecilor standard, impresionante de altfel,
definite de ctre Sun i colaboratorii acestuia. Alegerea a fost fcut din
convingerea c bibliotecile vin i trec, se dezvolt, n timp ce limbajul
rmne.
Cartea se adreseaz n acelai timp nceptorilor i programatorilor
profesioniti. nceptorii vor gsi n prima parte noiuni fundamentale
necesare oricrui programator. Profesionitii, n schimb, vor gsi o referin
complet a limbajului Java.
Prima parte a crii i introduce cititorul pas cu pas n fundamentele
funcionrii i programrii calculatoarelor tratnd la un nivel accesibil
noiuni precum memoria i procesorul, datele i instruciunile, clasele de
obiecte mpreun cu trsturile fundamentale ale programrii orientate

obiect.
Partea a doua a crii prezint limbajul Java n detaliu mpreun cu o serie
de exemple simple. Aceast parte este conceput pentru a fi n acelai timp
o introducere n sintaxa Java pentru cei care au programat deja i o
introducere n constrngerile sintactice i semantica unui limbaj de
programare pentru nceptori.
Partea a treia a crii prezint cteva dintre aspectele fundamentale ale
programrii n Java precum aplicaiile, apleturile, pachetele de clase, firele
de execuie i tratarea excepiilor. Aceast parte este conceput de sine
stttoare i poate servi ca exemplu de programare n Java. Fiecare seciune
din aceast parte conine exemple extinse de aplicaii scrise n Java,
comentate n surs i n afara acesteia.
Cititorul nceptor n ale programrii trebuie s parcurg cartea de la
nceput pn la sfrit pentru a putea intra treptat n tainele programrii n
general i ale limbajului Java.
Pentru cititorii avansai, prima parte nu constituie un interes major i poate
fi srit fr implicaii majore n nelegerea materialului din prile
urmtoare. Aceti cititori pot s treac direct la partea a treia pentru a
urmri exemplele i abia dup aceea s revin la partea a doua pentru
informaii detaliate asupra sintaxei i facilitilor Java. Partea a doua poate
fi folosit i pe post de referin.
O singur excepie: ultima seciune din prima parte introduce noiunea de
interfa, puin cunoscut programatorilor n alte limbaje dect Java. Este
util ca aceast seciune s fie consultat de ctre toi cititorii, indiferent de
nivelul de pregtire n care se afl.
Convenii utilizate n aceast carte

Pentru descrierea sintacticii limbajului Java, am apelat la urmtoarele


convenii obinuite de reprezentare a regulilor gramaticale:

Cuvintele rezervate ale limbajului Java sunt scrise n caractere ngroate,


ca: while, do, final.

Cuvintele care in locul construciilor reale ale programului sunt scrise cu


caractere oblice, ca n:
if(Condiie) Instruciune1 else Instruciune2

Condiie, Instruciune1 i Instruciune2, care apar n descriere,


trebuiesc nlocuite cu condiiile adevrate, respectiv cu instruciunile
adevrate care trebuiesc executate n funcie de condiie. De exemplu,
o construcie real, care respect descrierea de mai sus ar putea fi:
if( i < j )
min = i;
else
min = j;

O list de termeni separai prin caractere |, se poate nlocui cu oricare


dintre termenii listei.

De exemplu:
public | private | protected

nseamn c n locul acestui termen poate s apar oricare dintre


cuvintele rezervate specificate n list, public, private sau protected.

Un termen pus ntre paranteze ptrate este opional. De exemplu, n


descrierea:

Tip NumeVariabil [Iniializator] ;


Partea de Iniializator poate s lipseasc.

Dac, dup un termen apare caracterul *, acesta reprezint faptul c


termenul se poate repeta de un numr arbitrar de ori, eventual niciodat.
De exemplu, n:

class NumeClas ClauzImplements*


caracterul * reprezint faptul c termenul notat
prinClauzImplements se poate repeta de un numr arbitrar de ori,
eventual niciodat.
Pe marginea din stnga a paginii, vei ntlni o serie de simboluri
grafice, cu specificaie precis, care v vor permite s navigai mai
uor n interiorul crii. Iat semnificaia acestora:
Semnul din stnga reprezint faptul c n paragraful marcat
introducedefiniia unui nou termen. Termenul nou introdus este reprezentat
n interiorul semnului i este scris cu caractere oblice n textul paragrafului.
n cazul de fa cuvntul nou introdus este cuvntul definiia. Atunci cnd
gsii o trimitere la un paragraf pentru explicaii, cutai acest semn pe

margine pentru a gsi mai repede definiia noiunii dorite.


Semnul din stnga reprezint o trimitere napoi ctre o noiune deja
prezentat n partea de fundamente. Aceast trimitere conine deasupra
simbolului grafic numele noiunii pe care trebuie s l cutai ntr-un simbol
de definiie, i sub simbolul grafic numrul paragrafului unde se afl
definiia. Cititorul nceptor ca i cel avansat poate urma aceste trimiteri
pentru a-i mprospta cunotinele sau pentru a se familiariza cu cuvintele
sau expresiile folosite pentru a desemna noiuni greu traductibile.
Semnul din stnga reprezint o referire n avans a unei noiuni care va fi
introdus mai trziu. Acest semn este destul de rar n interiorul crii, dar
este totui nevoie de el pentru a face referire la anumite faciliti care i
gsesc cel mai bine locul n paragraful n care apare semnul. Putei sri fr
probleme aceste precizri la prima citire a capitolului i s le luai n seam
doar atunci cnd folosii cartea pe post de referin pentru limbajul Java.
Semnul din stnga reprezint referirea unei noiuni care nu este descris n
carte. Acest semn apare atunci cnd se face o referin la una din clasele
standard ale mediului Java. Putei gsi informaii exacte despre clasa
respectiv la adresa www.javasoft.com, sau putei ncrca din Internet o
documentaie complet prin ftp de la adresa ftp.javasoft.com,
directorul/docs.
Semnul din stnga reprezint o trimitere ctre alt carte, n care noiunile
din paragraf sunt prezentate mai pe larg. Am folosit acest semn doar de
dou ori, pentru a trimite ctre o carte disponibil la aceeai editur cu
cartea prezent, despre HTML, scris de Dumitru Rdoiu. O putei gsi pe
prima poziie n bibliografie.
Sugestii i reclamaii

Posibilele erori care s-au strecurat n aceast carte cad n sarcina exclusiv
a autorului ei care i cere pe aceast cale scuze n avans. Orice astfel de
eroare sau neclaritate cu privire la coninutul crii poate fi comunicat
direct autorului pe adresa erotariu@agora.ro sau:
Eugen Rotariu
Computer Press Agora
Str. Tudor Vladimirescu, Nr. 63/1, Cod. 4300, Trgu Mure
Romnia

n Internet, putei s contactai editura Computer Press Agora la adresa


www.agora.ro. Pe server exist o pagin separat dedicat acestei cri.
Putei verifica periodic aceast pagin pentru eventuale corecturi, exemple
suplimentare sau adugiri la coninutul crii.
Alte surse de informaii

Subiectul Java este departe de a fi ncheiat n aceast carte aa c, dac


reacia dumneavoastr este pozitiv, voi ncerca s construiesc o a doua
carte dedicat claselor standard Java, mediilor de dezvoltare, din ce n ce
mai numeroase, ierarhiilor de baz de date, obiecte distribuite i aa mai
departe care i-au fcut apariia de la Sun sau din alt parte n ultimul
timp. Nu ezitai s-mi dai de tire dac vei considera util o asemenea
continuare.
Pn atunci ns, putei consulta crile listate n seciunea de bibliografie
de la sfritul acestei cri. Numai cri n limba englez n acest domeniu
deocamdat, dar m atept ca situaia s se schimbe dramatic n perioada
imediat urmtoare. Noi cri de Java dedicate cititorilor romni nu vor
ntrzia s apar.
Internet-ul este de asemenea o surs interminabil de informaii, situri Java
exist i vor continua s apar n ntreaga lume. Adresa de baz este
probabil www.javasoft.com, adres care v pune n legtur direct cu
firma care a creat i ntreine n continuare dezvoltarea Java. n plus, putei
consulta revista electronic JavaWorld de la
adresawww.javaworld.com care conine ntotdeauna informaii fierbini,
cursuri, apleturi i legturi ctre alte adrese unde v putei mbogi
cunotinele despre Java. Pentru documentaii, exemple i nouti n lumea
Java putei consulta i www.gamelan.com sau www.blackdown.org.
Pentru cei care doresc s dezvolte apleturi pe care s le insereze n propriile
pagini HTML, recomand n plus citirea crii lui Dumitru Rdoiu, HTML Publicaii Web, editat de asemenea la Computer Press Agora.
n fine, nu ncetai s cumprai revistele PC Report i Byte Romnia ale
aceleiai edituri, pentru c ele vor conine ca de obicei informaii de ultim
or, cursuri i reportaje de la cele mai noi evenimente din lumea
calculatoarelor.
Mulumiri

Mulumesc tuturor celor care, voit sau nu, au fcut posibil aceast carte.
Mulumesc celor de la editura Computer Press Agora i managerului ei
Romulus Maier pentru c mi-au facilitat publicarea acestei cri. Fr
munca lor, cartea s-ar fi aflat n continuare n vitrina proprie cu visuri
nerealizate. Mulumesc celor care mi-au druit o parte din timpul lor preios
pentru a citi i comenta primele versiuni ale crii: Iosif Fettich, Mircea i
Monica Cioat, Alexandru Horvath. Mulumesc celor cu care am discutat de
attea ori despre soarta calculatoarelor, programelor, Romniei i lumii n
general. Ei au fcut din mine omul care sunt acum: Mircea Srbu, Dumitru
Rdoiu, Szabo Laszlo, Mircea Pantea. Mulumesc celor care s-au ocupat de
designul i tehnoredactarea acestei cri n frunte cu Adrian Pop i Octav
Lipovan. Cel dinti lucru care v-a atras la aceast carte este munca lor.
Carmen, i mulumesc c nu te-ai dat btut. Va veni i vremea n care
srbtorim cu calculatoarele oprite.
[cuprins]
(C) IntegraSoft 1996-1998

Capitolul I
Arhitectura calculatoarelor
1.1 Modelul Von Neumann de arhitectur a calculatoarelor
1.2 Organizarea memoriei interne
1.3 Reprezentarea informaiilor n memoria intern
1.4 Modelul funcional al calculatoarelor
1.1 Modelul Von Neumann de arhitectur a calculatoarelor

Descrierea care urmeaz este o descriere a modelului Von Neumann de


construcie a calculatoarelor. Se pot aduce destule critici acestui model care
domin sever nc de la nceputurile mainilor de calcul electronic, dar el
continu s fie singurul model funcional.
Modelul Von Neumann definete calculatorul ca pe un ansamblu format
dintr-o unitate central i o memorie intern. Unitatea
central sauprocesorul este responsabil cu administrarea i prelucrarea
informaiilor n timp ce memoria intern servete la depozitarea acestora. n
terminologia calculatoarelor, depozitarea informaiilor n memoria intern a
calculatorului se numete memorare.
Acest ansamblu unitate central plus memorie intern comunic cu
exteriorul prin intermediul unor dispozitive periferice. Dispozitivele periferice
pot fi de intrare sau de ieire n funcie de direcia n care se mic datele.
Dac datele sunt furnizate de dispozitivul periferic i transferate spre
unitatea central, atunci dispozitivul este de intrare precum sunt tastatura
sau mausul. Dac datele sunt generate de unitatea central i transmise
spre dispozitivul periferic atunci dispozitivul este de ieire precum sunt
ecranul sau imprimanta. Exist i dispozitive mixte de intrare/ieire precum
sunt discurile pentru memorarea extern a informaiilor.
Tastatura calculatorului reprezint un set de butoane (taste) inscripionate
care ne permite transmiterea ctre unitatea central a unor litere, cifre,
semne de punctuaie, simboluri grafice sau comenzi
funcionale. Mausulreprezint un dispozitiv simplu, mobil, care ne permite
indicarea unor regiuni ale ecranului cu ajutorul unui cursor.
n plus, mausul ne permite activarea regiunilor respective cu ajutorul celor
1-2-3 butoane ale sale.

Ecranul este un dispozitiv cu ajutorul cruia calculatorul comunic


informaii spre exterior. Aceste informaii apar sub form de litere, cifre,
semne de punctuaie, simboluri grafice sau desene oarecare ntr-o varietate
mai mare sau mai mic de culori. Informaia de pe ecran se pierde odat cu
redesenarea acestuia. Pentru transferul acestor informaii pe hrtie i
ndosarierea lor s-au creat alte dispozitive periferice, numite imprimante.
Memoria intern pierde informaiile odat cu oprirea alimentrii
calculatorului. Pentru a salva informaiile utile, precum i programele de
prelucrare ale acestora este nevoie de dispozitive de memorare permanente.
Din aceast categorie fac parte discurile calculatorului. Exist mai multe
modele de discuri precum discurile fixe, discurile flexibile sau compactdiscurile, fiecare dintre acestea avnd caracteristici, viteze de acces i
capaciti de memorare diferite. Informaiile salvate pe discuri pot fi
ncrcate din nou n memoria intern la o pornire ulterioar a
calculatorului. V vei ntreba desigur de ce este nevoie de dou tipuri
distincte de memorie: pentru c discurile au viteze de acces mult prea mici
pentru a putea fi folosite direct de ctre unitatea central.

Figura 1.1 Modelul constructiv al calculatoarelor Von Neuman.

Dei modelul constructiv de baz al calculatoarelor nu a evoluat prea mult,


componenta tehnologic a acestora s-a aflat ntr-o permanent evoluie.
Transformarea vizeaz la ora actual viteza de lucru i setul de instruciuni
ale unitii centrale, capacitatea i viteza de stocare a memoriei interne

precum i tipurile i calitatea dispozitivelor periferice.


1.2 Organizarea memoriei interne

Memoria calculatoarelor actuale este, din punct de vedere logic, o niruire


de cifre binare, 0 sau 1. Alegerea bazei 2 de numeraie are n principal
raiuni constructive: este mult mai uor i mult mai fiabil s reprezini un
principiu binar ca absena/prezena sau plus/minus dect unul nuanat. O
cifr binar este numit, n termeni de calculatoare, bit.
Biii sunt grupai, opt cte opt, n uniti de memorare numite octei.
Iari, alegerea cifrei opt are raiuni istorice: era nevoie de o putere a lui doi
care s fie ct mai mare, pentru a putea permite transferuri rapide ntre
diversele componente ale calculatorului (unitate central, memorie,
dispozitive periferice), dar totodat suficient de mic pentru ca realizarea
dispozitivelor implicate, cu tehnologia existent, s fie posibil. Cifra opt
avea n plus avantajul c permitea reprezentarea tuturor caracterelor
tipribile necesare la ora respectiv precum: literele, cifrele sau semnele de
punctuaie. ntr-un octet se pot reprezenta pn la 256 (28) astfel de
caractere. n prezent octetul este depit datorit necesitii de reprezentare
a caracterelor tuturor limbilor scrise din lume.
Pentru a accesa o informaie n memorie este nevoie de un mod de a referi
poziia acesteia. Din acest motiv, octeii memoriei au fost numerotai unul
cte unul ncepnd de la 0 pn la numrul maxim de octei n memorie.
Numrul de ordine al unui octet l vom numi pentru moment adres.
Noiunea de adres i-a extins semnificaia n ultimul timp dar, pentru
nelegerea acestui capitol, explicaia de mai sus este suficient.
Zona fizic de memorie rezervat unei anumite informaii se
numete locaiainformaiei respective n memorie. n unele dintre locaiile
din memorie putem pstra chiar adresa unor alte locaii din memorie.
Informaia memorat n aceste locaii se numete referin. Cu alte cuvinte,
o referin este o informaie memorat ntr-o locaie de memorie care ne
trimite spre (se refer la) o alt locaie de memorie. O locaie de memorie se
poate ntinde pe mai mult dect un octet.
1.3 Reprezentarea informaiilor n memoria intern

Dup cum ai putut observa din cele prezentate pn acum, n memoria


calculatorului nu se pot nscrie dect numere naturale. Mai precis, fiecare
octet de memorie poate memora un numr de la 0 la 28-1, adic 255. Orice

alt informaie pe care dorim s o reprezentm n memoria calculatorului


trebuie redus la unul sau mai multe numere naturale mici.
Aceast trstur a modelului actual de memorare introduce un pas
suplimentar de abstractizare n procesul de proiectare de aplicaii, i anume
pasul n care se construiete un model de reprezentare n memorie a
datelor, necesar aplicaiei.
S presupunem, de exemplu, c o aplicaie necesit reprezentarea n
memoria calculatorului a unui set de culori. Pentru memorarea acestor
culori este nevoie de o convenie care s stabileasc o coresponden
biunivoc ntre setul de culori i setul de numere naturale folosite la
reprezentarea acestora. Corespondena este biunivoc pentru c ea trebuie
s ofere posibilitatea de a regsi n mod unic o culoare plecnd de la un
numr i, n acelai timp, s ofere o reprezentare unic, sub form de
numr, pentru fiecare culoare. De exemplu, putem pune n coresponden
culoarea neagr cu numrul 0, culoarea roie cu numrul 1, culoarea
albastr cu numrul 2 i aa mai departe. Ori de cte ori vom memora 2
vom memora albastru i ori de cte ori vom dori s memorm rou, vom
memora 1.
Ca rezultat al folosirii acestei abstractizri, datele aplicaiei devin
dependente de convenia de reprezentare utilizat. Presupunnd c o
aplicaie construiete n memorie o imagine grafic folosindu-se de o
anumit coresponden dintre culori i numere, oricare alt aplicaie care
vrea s utilizeze imaginea respectiv trebuie s foloseasc aceeai convenie.
O cale similar de rezolvare vom ntlni i la reprezentarea
caracterelor.Caracterele sunt denumirea ntr-un singur cuvnt a literelor,
cifrelor, semnelor de punctuaie sau simbolurilor grafice reprezentate n
memorie. Este nevoie de o convenie prin care atam fiecrui caracter cte
un numr natural memorabil ntr-un octet.
n cazul reprezentrii caracterelor, exist chiar un standard internaional
care definete numerele, reprezentabile pe un octet, corespunztoare
fiecrui caracter n parte, numit standardul ASCII. Alte standarde, cum ar fi
standardul Unicode, reprezint caracterele pe doi octei, ceea ce le d
posibilitatea s ia n considerare o gam mult mai larg de caractere.
Caracter

Reprezentare pe un octet (ASCII)

A-Z

65-90

a-z

97-122

0-9

48-57

195,227

206,238

194,226

170,186

222,254

Tabelul 1.1 Un fragment din codurile ASCII i Unicode de reprezentare a caracterelor


grafice n memoria calculatoarelor.

Desigur, este greu s inem minte codul numeric asociat fiecrui caracter
sau fiecrei culori. Este nevoie de pai suplimentari de codificare, care s
pun informaia n legtur cu simboluri mai uor de inut minte dect
numerele. De exemplu, este mult mai uor pentru noi s inem minte
cuvinte sau imagini. Dar s nu uitm niciodat c, pentru calculator, cel
mai uor este s memoreze i s lucreze cu numere.
1.4 Modelul funcional al calculatoarelor

Fiecare calculator definete un numr de operaii care pot fi executate de


unitatea sa central. Aceste operaii sunt n principal destinate memorrii
sau recuperrii informaiilor din memoria intern, calculelor aritmetice sau
logice i controlului dispozitivelor periferice. n plus, exist un numr de
instruciuni pentru controlul ordinii n care sunt executate operaiile.
O instruciune este o operaie elementar executabil de ctre unitatea
central a unui calculator. O secven de mai multe instruciuni executate
una dup cealalt o vom numi program.
Instruciunile care compun un program trebuiesc i ele reprezentate n
memorie, la fel ca orice alt informaie, din cauza faptului c unitatea
central nu are posibilitatea s-i pstreze programele n interior. Pentru
memorarea acestor instruciuni este nevoie de o nou convenie de
reprezentare care s asocieze un numr sau o secven de numere naturale

fiecrei instruciuni a unitii centrale.


Execuia unui program de ctre calculator presupune ncrcarea
instruciunilor n memoria intern i execuia acestora una cte una n
unitatea central. Unitatea central citete din memorie cte o instruciune,
o execut, dup care trece la urmtoarea instruciune. Pentru pstrarea
secvenei, unitatea central memoreaz n permanen o referin ctre
urmtoarea instruciune ntr-o locaie intern numit indicator de
instruciuni.
Modelul de execuie liniar a instruciunilor, n ordinea n care acestea sunt
aezate n memorie, este departe de a fi acceptabil. Pentru a fi util, un
program trebuie s poat s ia decizii de schimbare a instruciunii
urmtoare n funcie de informaiile pe care le prelucreaz. Aceste decizii pot
nsemna uneori comutarea execuiei de la o secven de instruciuni la alta.
Alteori, este necesar s putem executa o secven de instruciuni n mod
repetat pn cnd este ndeplinit o anumit condiie exprimabil cu
ajutorul informaiilor din memorie. Numrul de repetri ale secvenei de
instruciuni nu poate fi hotrt dect n momentul execuiei. Aceste
ramificri ale execuiei se pot simula destul de uor prin schimbarea valorii
referinei memorate n indicatorul de instruciuni.
[cuprins]
(C) IntegraSoft 1996-1998

Capitolul II
Limbaje de programare
2.1 Comunicaia om-main
2.2 Tipuri de numere reprezentabile n calculator
2.3 Valori de adevr
2.4 iruri de caractere
2.5 Tipuri primitive de valori ale unui limbaj de programare
2.6 Tablouri de elemente
2.7 Expresii de calcul
2.8 Variabile
2.9 Instruciuni
2.1 Comunicaia om-main

Pentru a executa un program de calculator este necesar s putem comunica


cu unitatea central pentru a-i furniza instruciunile necesare. Cel mai
simplu mod de a le comunica este nscrierea codului instruciunilor direct
n memoria calculatorului de unde pot fi citite de ctre unitatea central.
Aceast cale este ns extrem de anevoioas pentru programator pentru c
el trebuie s nvee s se exprime coerent ntr-un limbaj ale crui
componente de baz sunt coduri numerice.
O alternativ mai bun este folosirea unui limbaj de comunicaie format
dintr-un numr foarte mic de cuvinte i caractere speciale mpreun cu un
set de convenii care s ajute la descrierea numerelor i a operaiilor care
trebuiesc executate cu aceste numere. Limbajul trebuie s fie att de simplu
nct calculatorul s poat traduce singur, prin intermediul unui program
numit compilator, frazele acestui limbaj n instruciuni ale unitii centrale.
Ori de cte ori vom imagina un nou limbaj de comunicaie cu calculatorul
va trebui s crem un nou program compilator care s traduc acest limbaj
n instruciuni ale unitii centrale, numite uneori iinstruciuni main.
n realitate folosirea termenului de limbaj de comunicaie nu este extrem de
fericit pentru c de obicei noi doar instruim calculatorul ce are de fcut i
cum trebuie s fac acel lucru, fr s-i dm vreo ans acestuia s
comenteze sarcinile primite. n continuare vom numi aceste limbaje
simplificate limbaje de programare pentru a le deosebi de limbajele pe care le
folosim pentru a comunica cu ali oameni i pe care le vom numi limbaje
naturale.

Limbajele de programare trebuie s ne ofere o cale de descriere a modulului


n care dorim s reprezentm informaiile cu care lucreaz programul, o cale
de a specifica operaiile care trebuiesc executate cu aceste informaii i o
cale de a controla ordinea n care sunt executate aceste operaii.
n plus, limbajele de programare trebuie s respecte urmtorul principiu
fundamental: rezultatul execuiei unei comenzi dintr-un limbaj de
programare trebuie s fie complet determinat. Asta nseamn c n limbajele
de programare nu este permis nici o form de ambiguitate a exprimrii.
Informaiile reprezentate n memoria calculatorului i prelucrate de ctre un
program scris ntr-un limbaj de programare se numesc date. Tipurile de
date care se pot descrie direct cu un anumit limbaj de programare se
numesc tipurile de date elementare ale limbajului. Operaiile elementare
posibil de exprimat ntr-un limbaj de programare se numesc instruciuni ale
limbajului.
Limbajele de programare au evoluat foarte mult de la nceputurile
calculatoarelor. Tendina general este aceea de apropiere treptat de
limbajele naturale i de modul n care acestea descriu i utilizeaz
informaiile. Abstraciile exprimabile cu ajutorul limbajelor de programare
sunt din ce n ce mai multe i cuprind o gam din ce n ce mai larg a
noiunilor fundamentale cu care opereaz mintea uman.
Un alt aspect n care se reflect evoluia limbajelor de programare este
reprezentat de creterea profunzimii i calitii controlului pe care
compilatoarele l fac n momentul traducerii din limbaj de programare n
limbaj main, astfel nct ansa de a grei la descrierea programului s fie
ct mai mic.
Cu toate c limbajele de programare au fcut pai eseniali n ultimul timp,
ele au rmas totui foarte departe de limbajele naturale. Pentru a programa
un calculator, trebuie s poi gndi i s poi descrie problemele ntr-unul
dintre limbajele pe care acesta le nelege. Din acest motiv, scrierea
programelor continu s rmn o activitate rezervat unui grup de iniiai,
chiar dac acest grup este n continu cretere.
2.2 Tipuri de numere reprezentabile n calculator

Dei toate informaiile reprezentabile direct n memoria calculatorului sunt


doar numere naturale, constructorii calculatoarelor de astzi au diversificat
tipurile acestora prin stabilirea unor convenii de reprezentare pentru

numerele negative, reale i pentru caractere. Aceste convenii folosesc


numerele naturale pentru reprezentarea celorlalte tipuri de numere. Uneori,
reprezentrile ocup mai mult de un octet n memoria calculatorului,
dimensiunile obinuite fiind 1, 2, 4 sau 8 octei. Sau, echivalent, 8, 16, 32
sau 64 de bii.
Numerele naturale sunt ntotdeauna pozitive. Pentru reprezentarea
unuinumr ntreg cu semn pot fi folosite dou numere naturale. Primul
dintre acestea, avnd doar dou valori posibile, reprezint semnul
numrului i se poate reprezenta folosind o singur cifr binar. Dac
valoarea acestei cifre binare este 0, numrul final este pozitiv, iar dac
valoarea cifrei este 1, numrul final este negativ. Al doilea numr natural
folosit n reprezentarea numerelor ntregi cu semn conine valoarea absolut
a numrului final. Aceast convenie, dei are dezavantajul c ofer dou
reprezentri pentru numrul zero, un zero pozitiv i altul negativ, este foarte
aproape de reprezentarea numerelor cu semn folosit de calculatoarele
moderne.
n realitate, convenia care se folosete pentru reprezentarea numerelor
ntregi cu semn este aa numita reprezentare n complement fa de doi.
Aceasta reprezint numerele negative prin complementarea valorii lor
absolute bit cu bit i apoi adunarea valorii 1 la numrul rezultat.
Complementarea valorii unui bit se face nlocuind valoarea 1 cu 0 i
valoarea 0 cu 1. Dac avem de exemplu numrul 1, reprezentat pe un octet
ca un ir de opt cifre binare 00000001, complementarea bitcu bit a acestui
numr este numrul reprezentat pe un octet prin11111110.
Pentru a reprezenta valoarea -1 nu ne mai rmne altceva de fcut dect s
adunm la numrul rezultat n urma complementrii un 1 i reprezentarea
final a numrului ntreg negativ -1 pe un octet este 11111111.
n aceast reprezentare, numrul 00000000 binar reprezint numrul 0 iar
numrul 10000000, care mai nainte reprezenta numrul 0 negativ, acum
reprezint numrul -128. ntr-adevr, numrul 128 se poate reprezenta n
binar prin 10000000. Complementat, acest numr devine 01111111 i dup
adunarea cu 1, 10000000. Observai c numerele 128 i -128 au aceeai
reprezentare. Convenia este aceea c se pstreaz reprezentarea pentru
-128 i se elimin cea pentru 128. Alegerea este datorat faptului c toate
numerele pozitive au n primul bit valoarea 0 i toate cele negative valoarea
-1. Prin transformarea lui 10000000 n -128 se pstreaz aceast regul.

Folosind reprezentarea n complement fa de doi, numerele ntregi


reprezentabile pe un octet sunt n intervalul -128 pn la 127, adic
-27pn la 27 -1. n general, dac avem o configuraie de n cifre binare,
folosind reprezentarea n complement fa de doi putem reprezenta
numerele ntregi din intervalul nchis -2n-1 pn la 2n-1-1. n practic, se
folosesc numere ntregi cu semn reprezentate pe 1 octet, 2 octei, 4 octei i
8 octei, respectiv 8, 16, 32 i 64 de bii.
Dac dorim s reprezentm un numr real n memoria calculatorului, o
putem face memornd cteva cifre semnificative ale acestuia plus o
informaie legat de ordinul su de mrime. n acest fel, dei pierdem
precizia numrului, putem reprezenta valori foarte aproape de zero sau
foarte departe de aceast valoare.
Soluia de reprezentare este aceea de a pstra dou numere cu semn care
reprezint cifrele semnificative ale numrului real respectiv un exponentcare
d ordinul de mrime. Cifrele reprezentative ale numrului se numesc
mpreun mantis. Numrul reprezentat n final este 0.mantisaEexponent. E are
valoarea 256 spre deosebire de exponentul 10 pe care l folosim n uzual.
Dac valoarea exponentului estefoarte mare i pozitiv, numrul real
reprezentat este foarte departe de 0, nspre plus sau nspre minus. Dac
exponentul este foarte mare n valoare absoluti negativ, numrul real
reprezentat este foarte aproape de zero.
n plus, pentru a ne asigura de biunivocitatea corespondenei, avem nevoie
de o convenie care s stabileasc faptul c virgula este plasat imediat n
faa cifrelor semnificative i c n faa acesteia se gsete o singur cifr 0.
Numerele care respect aceast convenie se numesc numere normalizate.
Aceast mutare a virgulei imediat n faa cifrelor semnificative poate s
presupun modificarea exponentului care pstreaz ordinul de mrime al
numrului. Numerele fracionare se numesc n limbajul
calculatoarelornumere n virgul mobil sau numere flotante tocmai din
cauza acestei eventuale ajustri a poziiei virgulei.
Cu aceast convenie nu se poate reprezenta orice numr real, dar se poate
obine o acoperire destul de bun a unui interval al axei numerelor reale cu
valori. Atunci cnd ncercm s reprezentm n memoria calculatorului un
numr real, cutm de fapt cel mai apropiat numr real reprezentabil n
calculator i aproximm numrul iniial cu acesta din urm. Ca rezultat,

putem efectua calcule complexe cu o precizie rezonabil.


Descrierea conveniei exacte de reprezentare a numerelor reale n calculator
depete cadrul acestei prezentri. Unele dintre detalii pot fi diferite de cele
prezentate aici, dar principiul este exact acesta. Convenia de reprezentare a
numerelor reale este standardizat de IEEE n specificaia 754.
Desigur, n unele probleme, lipsa de precizie poate s altereze rezultatul
final, mai ales c, uneori, erorile se cumuleaz. Exist de altfel o teorie
complex, analiza numeric, conceput pentru a studia cile prin care
putem ine sub control aceste erori de precizie. Putem crete precizia de
reprezentare a numerelor reale prin mrirea spaiului rezervat mantisei. n
acest fel mrim numrul de cifre semnificative pe care l pstrm. n
general, unitile centrale actuale lucreaz cu dou precizii: numerele
flotante simple, reprezentate pe 4 octei i numerele flotante duble,
reprezentate pe 8 octei.
2.3 Valori de adevr

Uneori, avem nevoie s memorm n calculator valori de adevr. Exist doar


dou valori de adevr posibile: adevrat i fals. Uneori, aceste valori de
adevr se mai numesc i valori booleene. Dei pentru memorarea acestor
valori este suficient o singur cifr binar, n practic aceste valori sunt
reprezentate pe un ntreg octet pentru c operaiile la nivel de bit sunt de
obicei prea lente. Valorile booleene se pot combina ntre ele prin operaii
logice: i, sau, "negaie.
2.4 iruri de caractere

Dup cum spuneam mai nainte, dei orice informaie reprezentat n


calculator este n final un numr, mintea uman este obinuit s lucreze
cu cuvinte i imagini mai mult dect cu numere. De aceea, calculatorul
trebuie s aib posibilitatea s simuleze memorarea informaiilor de acest
fel.
n ceea ce privete cuvintele, ele pot fi reprezentate n memoria
calculatorului prin caracterele care le formeaz. niruirea acestor caractere
n memorie duce la noiunea de ir de caractere. Pe lng caracterele
propriu-zise care construiesc cuvntul, un ir de caractere trebuie s poat
memora i numrul total de caractere din ir, cu alte cuvinte lungimea sa.
n realitate, un ir de caractere nu conine doar un singur cuvnt ci este o
niruire oarecare de caractere printre care pot exista i caractere spaiu. De

exemplu, urmtoarele secvene sunt iruri de caractere: "Acesta este un ir


de caractere", "Eugen", "ABCD 0123", "HGkduI;.!".
Fiecare limbaj de programare trebuie s ofere o convenie de reprezentare a
irurilor de caractere n calculator precum i o convenie de scriere a
acestora n program. De obicei, cea de-a doua convenie este aceea c irul
de caractere trebuie nchis ntre apostroafe sau ghilimele. n paragraful
anterior de exemplu, am folosit ghilimele pentru delimitarea irurilor de
caractere.
Convenia de reprezentare n memorie difer de la un limbaj de programare
la altul prin modul n care este memorat lungimea irului, precum i prin
convenia de reprezentare n memorie a caracterelor: ASCII, Unicode sau
alta.
mpreun cu fiecare tip de dat, limbajele de programare trebuie s
defineasc i operaiile ce se pot executa cu datele de tipul respectiv. Pentru
irurile de caractere, principala operaie este concatenarea. Prin
concatenarea a dou iruri de caractere se obine un ir de caractere care
conine caracterele celor dou iruri puse n prelungire. De exemplu, prin
concatenarea irurilor de caractere "unu" i ", doi", rezult irul de
caractere: "unu, doi".
2.5 Tipuri primitive de valori ale unui limbaj de programare

Vom numi tipuri primitive de valori ale unui limbaj acele tipuri de valori care
se pot reprezenta direct ntr-un anumit limbaj de programare. Pentru ca
informaia reprezentabil s fie independent de calculatorul pe care
ruleaz programele, un limbaj de programare trebuie s-i defineasc
propriile sale tipuri primitive, eventual diferite de cele ale unitii centrale,
tipuri care s generalizeze tipurile primitive ale tuturor unitilor centrale.
Pentru fiecare dintre aceste tipuri primitive de valori, limbajul trebuie s
defineasc dimensiunea locaiei de memorie ocupate, convenia de
reprezentare i mulimea valorilor care pot fi reprezentate n aceast locaie.
n plus, limbajul trebuie s defineasc operaiile care se pot executa cu
aceste tipuri i comportarea acestor operaii pe seturi de valori diferite.
Tipurile primitive ale unui limbaj sunt de obicei: numere de diverse tipuri,
caractere, iruri de caractere, valori de adevr i valori de tip referin.
Totui, acest set de tipuri primitive, denumirea exact a tipurilor i
operaiile care se pot executa cu ele variaz mult de la un limbaj de

programare la altul.
2.6 Tablouri de elemente

Tipurile primitive mpreun cu referinele, adic tipurile de date elementare,


indivizibile ale unui limbaj, sunt insuficiente pentru necesitile unei
aplicaii reale. De obicei este nevoie de organizri de date mai complicate n
care avem structuri de date create prin asocierea mai multor tipuri de date
elementare. Aceste structuri de organizare a informaiilor pot conine date
de acelai tip sau date de tipuri diferite.
n cazul n care dorim s reprezentm o structur coninnd date de acelai
tip, va trebui s folosim o structur clasic de reprezentare a datelor
numit tablou de elemente. Practic, un tablou de elemente este o alturare
de locaii de memorie de acelai fel. Alturarea este continu n sensul c
zona de memorie alocat tabloului nu are guri. De exemplu, putem gndi
ntreaga memorie intern a calculatorului ca fiind un tablou de cifre binare
sau ca un tablou de octei.
Informaiile de acelai fel reprezentate ntr-un tablou se pot prelucra n mod
unitar. Referirea la un element din tablou se face prin precizarea locaiei de
nceput a tabloului n memorie i a numrului de ordine al elementului pe
care dorim s-l referim. Numrul de ordine al unui element se
numete indexul elementului. De aceea, tablourile se numesc uneori i
structuri de date indexate.
S presupunem c, la adresa 1234 n memorie, deci ncepnd cu octetul
numrul 1234, avem un tablou de 200 de elemente de tip ntregi cu semn
reprezentai pe 4 octei. Pentru a accesa elementul numrul 123 din tablou,
trebuie s i aflm adresa n memorie. Pentru aceasta, trebuie s calculm
deplasamentul acestui element fa de nceputul tabloului, cu alte cuvinte,
la ci octei distan fa de nceputul tabloului se gsete elementul
numrul 123.
Pentru calcului deplasamentului, este nevoie s tim cu ce index ncepe
numerotarea elementelor din tablou. De obicei aceasta ncepe cu 0 sau cu
1, primul element fiind elementul 0 sau elementul 1. S presupunem, n
cazul nostru, c numerotarea ar ncepe cu 0. n acest caz, elementul cu
indexul 123 este de fapt al 124-lea element din tablou, deci mai are nc
123 de elemente naintea lui. n aceste condiii, pentru a afla adresa
elementului dat, este suficient s adugm la adresa de nceput a tabloului,
deplasamentul calculat ca numrul de elemente din fa nmulit cu

dimensiunea unui element din tablou. Adresa final este 1234 + 123 * 4 =
1726.
Pentru a putea lucra cu elementele unui tablou este deci suficient s
memorm adresa de nceput a tabloului i indexul elementelor pe care
dorim s le accesm. Alternativa ar fi fost s memorm adresa locaiei
fiecrui element din tablou.
Unul dintre marile avantaje ale utilizrii tablourilor este acela c elementele
dintr-un tablou se pot prelucra n mod repetitiv, apelndu-se aceeai
operaie pentru un subset al elementelor din tablou. Astfel, ntr-un program
putem formula instruciuni de forma: pentru elementele
tablouluiT ncepnd de la al treilea pn la al N-lea, s se execute
operaia O. Numrul N poate fi calculat dinamic n timpul execuiei
programului, n funcie de necesiti.
Elementele unui tablou pot fi de tip primitiv, referin sau pot fi tipuri
compuse, inclusiv alte tablouri.
2.7 Expresii de calcul

Sarcina principal a calculatoarelor este aceea de a efectua calcule. Pentru


a putea efectua aceste calcule, calculatorul trebuie s primeasc o descriere
a operaiilor de calcul pe care le are de executat. Calculele simple sunt
descrise cel mai bine prin expresii de calcul.
Expresiile sunt formate dintr-o serie de valori care intr n calcul,
numiteoperanzi i din simboluri care specific operaiile care trebuiesc
efectuate cu aceste valori, numite operatori. Operatorii reprezint operaii de
adunare, nmulire, mprire, concatenare a irurilor de caractere, etc.
Operanzii unor expresii pot fi valori elementare precum numerele, irurile
de caractere sau pot fi referiri ctre locaii de memorie n care sunt
memorate aceste valori. Tot operanzi pot fi i valorile unor funcii predefinite
precum sinus, cosinus sau valoarea absolut a unui numr. Calculul
complex al valorii acestor funcii pentru argumentele de intrare este astfel
ascuns sub un nume uor de recunoscut.

Figura 2.1 Un exemplu de expresie i componentele acesteia


2.8 Variabile

Uneori, atunci cnd calculele sunt complexe, avem nevoie s pstrm


rezultate pariale ale acestor calcule n locaii temporare de memorie.
Alteori, chiar datele iniiale ale problemei trebuie memorate pentru o folosire
ulterioar. Aceste locaii de memorie folosite ca depozit de valori le vom
numi variabile. Variabilele pot juca rol de operanzi n expresii.
Pentru a regsi valoarea memorat ntr-o anumit variabil, este suficient
s memorm poziia locaiei variabilei n memorie i tipul de dat memorat
la aceast locaie, numit i tipul variabilei. Cunoaterea tipului variabilei
este esenial la memorarea i regsirea datelor. La locaia variabilei gsim
ntotdeauna o configuraie de cifre binare. Interpretarea acestor cifre binare
se poate face numai cunoscnd convenia de reprezentare care s-a folosit la
memorarea acelor cifre binare. Mai mult, tipul de variabil ne i spune ci
octei de memorie ocup locaia respectiv.
Pentru a putea referi variabilele n interiorul unui program, trebuie s
atribuim cte un nume pentru fiecare dintre acestea i s rezervm locaiile
de memorie destinate lor. Aceast rezervare a locaiilor se poate face fie la
pornirea programului fie pe parcurs.
Putem mpri variabilele n funcie de perioada lor de existen n variabile
statice, care exist pe tot parcursul programului i variabile locale care se
creeaz doar n seciunea de program n care este nevoie de ele pentru a fi
distruse imediat ce se prsete seciunea respectiv. Variabilele statice
pstreaz de obicei informaii eseniale pentru execuia programului precum
numele celui care a pornit programul, data de pornire, ora de pornire sau
numrul p . Variabilele locale pstreaz valori care au sens doar n
contextul unei anumite seciuni din program. De exemplu, variabilele care

sunt utilizate la calculul sinusului dintr-un numr, sunt inutile i trebuiesc


eliberate imediat ce calculul a fost terminat. n continuare, doar valoarea
final a sinusului este important.
n plus, exist variabile care se creeaz doar la cererea explicit a
programului i nu sunt eliberate dect atunci cnd programul nu mai are
nevoie de ele. Aceste variabile se numesc variabile dinamice. De exemplu, se
creeaz o variabil dinamic atunci cnd utilizatorul programului introduce
un nou nume ntr-o list de persoane. Crearea i tergerea acestui nume nu
are legtur cu faza n care se afl rularea programului ci are legtur cu
dorina celui care utilizeaz programul de a mai aduga sau terge un nume
n lista persoanelor cu care lucreaz, pentru a le trimite, de exemplu,
felicitri de anul nou.
2.9 Instruciuni

Operaiile care trebuiesc executate de un anumit program sunt exprimate n


limbajele de programare cu ajutorul unor instruciuni. Spre deosebire de
limbajele naturale, exist doar cteva tipuri standard de instruciuni care
pot fi combinate ntre ele pentru a obine funcionalitatea programelor.
Sintaxa de scriere a acestor tipuri de instruciuni este foarte rigid. Motivul
acestei rigiditi este faptul c un compilator recunoate un anumit tip de
instruciune dup sintaxa ei i nu dup sensul pe care l are ca n cazul
limbajelor naturale.
Tipurile elementare de instruciuni nu s-au schimbat de-a lungul timpului
pentru c ele sunt coninute n nsui modelul de funcionare al
calculatoarelor Von Neumann.
n primul rnd, avem instruciuni de atribuire. Aceste instruciuni presupun
existena unei locaii de memorie creia dorim s-i atribuim o anumit
valoare. Atribuirea poate s par o operaie foarte simpl dar realitatea este
cu totul alta. n primul rnd, valoarea respectiv poate fi rezultatul evalurii
(calculului) unei expresii complicate care trebuie executat nainte de a fi
memorat n locaia de memorie dorit.
Apoi, nsi poziia locaiei n memorie ar putea fi rezultatul unui calcul n
urma cruia s rezulte o anumit adres. De exemplu, am putea dori s
atribuim o valoare unui element din interiorul unui tablou. ntr-o astfel de
situaie, locaia de memorie este calculat prin adunarea unui deplasament
la adresa de nceput a tabloului.

n fine, locaia de memorie i valoarea pe care dorim s i-o atribuim ar


putea avea tipuri diferite. n acest caz, operaia de atribuire presupune i
transformarea, dac este posibil, a valorii ntr-o nou valoare de acelai tip
cu locaia de memorie. n plus, aceast transformare trebuie efectuat n
aa fel nct s nu se piard semnificaia valorii originale. De exemplu, dac
valoarea original era -1 ntreg iar locaia de memorie este de tip flotant,
valoarea obinut dup transformare trebuie s fie -1.0.
Transformarea valorilor de la un tip la altul se numete n termeni
informatici conversie. Conversiile pot aprea i n alte situaii dect
instruciunile de atribuire, de exemplu la transmiterea parametrilor unei
funcii, n calculul unei expresii.
Forma general a unei instruciuni de atribuire este:
Locaie = Valoare
Locaia poate fi o adres cu tip, un nume de variabil sau o expresie n
urma creia s rezulte o adres cu tip. Printr-o adres cu tip nelegem o
adres de memorie pentru care a fost specificat tipul valorilor care pot fi
memorate n interior. O adres simpl, fr tip, nu poate intra ntr-o
atribuire pentru c nu putem ti care este convenia de reprezentare care
trebuie folosit la memorarea valorii.
Al doilea tip de instruciune elementar este instruciunea condiional.
Aceast instruciune permite o prim form de ramificare a ordinii n care
se execut instruciunile. Ramificarea depinde de o condiie care poate fi
testat pe setul de date cu care lucreaz aplicaia. n funcie de valoarea de
adevr care rezult n urma evalurii condiiei se poate executa o
instruciune sau alta. Modelul de exprimare a unei expresii condiionale
este urmtorul:
Dac condiia este adevrat
execut instruciunea 1
altfel
execut instruciunea 2.
Cele dou ramuri de execuie sunt disjuncte n sensul c dac este
executat instruciunea de pe o ramur atunci cu siguran instruciunea

de pe cealalt ramur nu va fi executat. Dup execuia uneia sau a


celeilalte instruciuni ramurile se reunific i execuia i continu drumul
cu instruciunea care urmeaz dup instruciunea condiional.

Figura 2.2 Schema de funcionare a unei instruciuni condiionale

Condiia care hotrte care din cele dou instruciuni va fi executat este
de obicei un test de egalitate ntre dou valori sau un test de ordonare n
care o valoare este testat dac este mai mic sau nu dect o alt valoare.
Condiiile pot fi compuse prin conectori logici de tipul i, sau sau non,
rezultnd n final condiii de forma: dac variabila numit Temperatur este
mai mic dect 0 i mai mare dect -10, atunci
Instruciunile condiionale au i o variant n care, n funcie de o valoare
ntreag alege o instruciune dintr-un set de instruciuni i apoi o execut.
Aceast form este n realitate derivat din instruciunea condiional
clasic, ea putnd fi exprimat prin:
Dac Variabila este egal cu Valoarea 1 atunci
execut instruciunea 1
altfel, dac Variabila este egal cu Valoarea 2 atunci
execut instruciunea 2
altfel, dac Variabila

altfel
execut instruciunea implicit.
Un al treilea tip de instruciuni elementare sunt instruciunile de
ciclare saurepetitive sau buclele. Acestea specific faptul c o instruciune
trebuie executat n mod repetat. Controlul ciclurilor de instruciuni se
poate face pe diverse criterii. De exemplu se poate executa o instruciune de
un numr fix de ori sau se poate executa instruciunea pn cnd o
condiie devine adevrat sau fals.
Condiia de terminare a buclei poate fi testat la nceputul buclei sau la
sfritul acesteia. Dac condiia este testat de fiecare dat nainte de
execuia instruciunii, funcionarea ciclului se poate descrie prin:
Atta timp ct Condiia este adevrat
execut Instruciunea
Acest tip de instruciuni de ciclare poat numele de cicluri while,
cuvntulwhile nsemnnd n limba englez "atta timp ct. n cazul
ciclurilor while, exist posibilitatea ca instruciunea din interiorul ciclului
s nu se execute niciodat, dac condiia este de la nceput fals.

Figura 2.3 Schema de funcionare a unui ciclu while

Dac condiia este testat de fiecare dat dup execuia instruciunii,


funcionarea ciclului se poate descrie prin:
Execut Instruciunea
atta timp ct Condiia este adevrat.
Acest tip de instruciuni de ciclare poart numele de cicluri do-while,
cuvntul do nsemnnd n limba englez "execut. n cazul ciclurilor dowhile instruciunea din interiorul ciclului este garantat c se execut cel

puin o dat, chiar dac valoare condiiei de terminare a buclei este de la


nceput fals.

Figura 2.4 Schema de funcionare a unui ciclu do-while

Dup cum ai observat, probabil, dac instruciunea din interiorul buclei


nu afecteaz n nici un fel valoarea de adevr a condiiei de terminare a
buclei, exist ansa ca bucla s nu se termine niciodat.
Al patrulea tip de instruciuni sunt apelurile de proceduri. O procedur este
o secven de instruciuni de sine stttoare i parametrizat. Un apel de
procedur este o instruciune prin care form programul s execute pe loc
instruciunile unei anumite proceduri. Dup execuia procedurii, se
continu cu execuia instruciunii de dup apelul de procedur.
Procedurile sunt utile atunci cnd, n zone diferite ale programului, dorim
s executm aceeai secven de instruciuni. n aceste situaii, putem s
scriem secvena de instruciuni o singur dat i s-o apelm apoi oriunde
din interiorul programului.
De exemplu, ori de cte ori vom dori s tergem toate semnele de pe ecranul
calculatorului, putem apela la o procedur, pentru a nu fi nevoii s scriem
de fiecare dat secvena de instruciuni care duce la tergerea ecranului.
Procedura n sine, o vom scrie o singur dat i i vom da un nume prin
care o vom putea apela ulterior ori de cte ori avem nevoie.
Uneori secvena de instruciuni dintr-o procedur depinde de
niteparametri adic de un set de valori care sunt precizate doar n
momentul apelului procedurii. n aceste cazuri, procedura se poate
comporta n mod diferit n funcie de valorile de apel ale acestor parametri.
n funcie de tipul declarat al unor parametri i de tipul real al valorilor care
sunt trimise ca parametri ntr-un apel de procedur, se poate ntmpla ca

nainte de apelul propriu-zis s fie necesar o conversie de tip.


De exemplu, n cazul procedurii care calculeaz valoarea sinusului unui
numr, parametrul de intrare este nsui numrul pentru care trebuie
calculat sinusul. Rezultatul acestui calcul va fi diferit, n funcie de valoarea
la apel a parametrului. n mod normal, parametrul va fi un numr flotant
iar dac la apel vom transmite ca parametru o valoare ntreag, ea va fi
convertit spre o valoare flotant.
n urma apelului unei proceduri poate rezulta o valoare pe care o vom
numivaloare de retur a procedurii. De exemplu, n urma apelului procedurii
de calcul a sinusului unui numr, rezult o valoare flotant care este
valoarea calculat a sinusului. Acest tip de proceduri, care ntorc valori de
retur se mai numesc i funcii. Funciile definesc ntotdeauna un tip al
valorii de retur pe care o ntorc. n acest fel, apelurile de funcii pot fi
implicate i n formarea unor expresii de calcul sub form de operanzi,
expresia cunoscnd tipul de valoare care trebuie ateptat ca valoare a
apelului unei anumite funcii.
Analogia cu funciile pe care le-ai studiat la matematic este evident dar
nu total. n cazul funciilor scrise ntr-un limbaj de programare, dou
apeluri consecutive ale aceleiai funcii cu aceleai valori ca parametri se
pot comporta diferit datorit dependenei de condiii exterioare sistemului
format din funcie i parametrii de apel. n plus, se poate ntmpla ca modul
de comportare al funciei i valoarea de retur s nu fie definite pentru
anumite valori de apel ale parametrilor. Dei scrierea acestui tip de funcii
este nerecomandabil, n practic ntlnim astfel de funcii la tot pasul.
[cuprins]
(C) IntegraSoft 1996-1998

Capitolul III
Reprezentarea informaiilor cu obiecte
3.1 Obiecte
3.2 ncapsularea informaiilor n interiorul obiectelor
3.3 Clase de obiecte
3.4 Derivarea claselor de obiecte
3.5 Interfee spre obiecte
3.1 Obiecte

Informaiile pe care le reprezentm n memoria calculatorului sunt rareori


att de simple precum culorile sau literele. n general, dorim s
reprezentm informaii complexe, care s descrie obiectele fizice care ne
nconjoar sau noiunile cu care operm zilnic, n interiorul crora culoarea
sau o secven de litere reprezint doar o mic parte. Aceste obiecte fizice
sau noiuni din lumea real trebuiesc reprezentate n memoria
calculatorului n aa fel nct informaiile specifice lor s fie pstrate la un
loc i s se poat prelucra ca un tot unitar. S nu uitm ns c, la nivelul
cel mai de jos, informaia ataat acestor obiecte continu s fie tratat de
ctre compilator ca un ir de numere naturale, singurele informaii
reprezentabile direct n memoria calculatoarelor actuale.
Pentru a reprezenta n memoria intern obiecte fizice sau noiuni, este
nevoie s izolm ntregul set de proprieti specifice acestora i s l
reprezentm prin numere. Aceste numere vor ocupa n memorie o zon
compact pe care, printr-un abuz de limbaj, o vom numi, ntr-o prim
aproximare, obiect. Va trebui ns s avei ntotdeauna o imagine clar a
deosebirii fundamentale dintre un obiect fizic sau o noiune i
reprezentarea acestora n memoria calculatorului.
De exemplu, n memoria calculatorului este foarte simplu s crem un nou
obiect, identic cu altul deja existent, prin simpla duplicare a zonei de
memorie folosite de obiectul pe care dorim s-l dedublm. n realitate ns,
este mult mai greu s obinem o copie identic a unui obiect fizic, fie el o
simpl foaie de hrtie sau o bancnot de 10000 de lei.
S revenim ns la numerele naturale. Din moment ce ele sunt singurele
entiti reprezentabile n memoria calculatorului, este firesc ca acesta s fie
echipat cu un set bogat de operaii predefinite de prelucrare a numerelor.
Din pcate, atunci cnd facem corespondena dintre numere i litere de

exemplu, nu ne putem atepta la un set la fel de bogat de operaii


predefinite care s lucreze cu litere. Dar, innd cont de faptul c n cele din
urm lucrm tot cu numere, putem construi propriile noastre operaii
specifice literelor, combinnd n mod corespunztor operaiile numerice
predefinite.
De exemplu, pentru a obine dintr-o liter majuscul, s spunem A,
corespondenta ei minuscul a, este suficient s adunm un deplasament
numeric corespunztor, presupunnd c literele mari i cele mici sunt
numerotate n ordine alfabetic i imediat una dup cealalt n convenia de
reprezentare folosit. n setul ASCII deplasamentul este 32, reprezentarea
lui A fiind 65 iar reprezentarea lui a fiind 97. Acest deplasament se
pstreaz pentru toate literele din alfabetul englez i romn, la cel din urm
existnd totui o excepie n cazul literei .
Putem s extindem cerinele noastre mai departe, spunnd c, atunci cnd
analizm un obiect fizic sau o noiune pentru a le reprezenta n calculator,
trebuie s analizm nu numai proprietile acestora dar i modul n care
acestea pot fi utilizate i care sunt operaiile care pot fi executate asupra lor
sau cu ajutorul lor. Acest set de operaii va trebui ulterior s-l redefinim n
contextul mulimii de numere care formeaz proprietile obiectului din
memoria calculatorului, i s l descompunem n operaii numerice
preexistente. n plus, trebuie s analizm modul n care reacioneaz
obiectul atunci cnd este supus efectului unor aciuni exterioare. Uneori,
setul de operaii specifice unui obiect mpreun cu modul n care acesta
reacioneaz la stimuli exteriori se numete comportamentul obiectului.
De exemplu, dac dorim s construim un obiect care reprezint o minge de
form sferic n spaiu, este necesar s definim trei numere care s
reprezinte coordonatele x, y i z relativ la un sistem de axe dat, precum i o
valoare pentru raza sferei. Aceste valori numerice vor face parte din setul de
proprieti ale obiectului minge. Dac mai trziu vom dori s construim o
operaie care s reprezinte mutarea n spaiu a obiectului minge, este
suficient s ne folosim de operaiile cu numere pentru a modifica valorile
coordonatelor x, y i z.
Desigur, obiectul minge este insuficient descris prin aceste coordonate i,
pentru a simula n calculator obiectul real este nevoie de multe proprieti
suplimentare precum i de multe operaii n plus. Dar, dac problema pe
care o avem de rezolvat nu necesit aceste proprieti i operaii, este
preferabil s nu le definim n obiectul folosit pentru reprezentare. Rezultatul

direct al acestui mod de abordare este acela c vom putea defini acelai
obiect real n mai multe feluri pentru a-l reprezenta n memoria intern.
Modul de definire depinde de problema de rezolvat i de programatorul care
a gndit reprezentarea. De altfel, aceste diferene de percepie ale unui
obiect real exist i ntre diveri observatori umani.
Din punctul de vedere al programrii, un obiect este o reprezentare n
memoria calculatorului a proprietilor i comportamentului unei noiuni
sau ale unui obiect real.

Figura 3.1 Modelul de reprezentare al unui obiect n memorie. Stratul exterior reprezint
doar operaiile care ofer calea de a interaciona cu proprietile obiectului i nu are
corespondent direct n zona de memorie ocupat de obiect.
3.2 ncapsularea informaiilor n interiorul obiectelor

Exist situaii n care accesul din exterior la proprietile unui obiect poate
s pun probleme acestuia. Ce s-ar ntmpla de exemplu dac s-ar putea
accesa direct valorile care definesc funcionalitatea corpului uman?
Desigur, exist cazuri n care acest lucru ar fi mbucurtor. N-ar mai fi
nevoie s acionm indirect asupra concentraiilor de enzime n corp ci am
putea s modificm aceste valori n mod direct. Dar, n acelai timp, am
putea provoca mari necazuri n cazul n care am modifica aceste valori n
afara pragului suportabil de ctre organism. Din aceste motive, este
preferabil s lsm modificarea acestor parametri n sarcina exclusiv a
unor operaii definite de ctre obiect, operaii care vor verifica noile valori
nainte de a le schimba n interiorul obiectului. n lipsa acestui filtru, putem
s stricm coerena valorilor memorate n interiorul unui obiect, fcndu-l
inutilizabil.
Din acest punct de vedere, putem privi obiectul ca pe un set de valori care
formeaz miezul obiectului i un set de operaii care mbrac aceste valori,

protejndu-le. Vom spune c proprietile obiectului sunt ncapsulate n


interiorul acestora. Mai mult, obiectul ncapsuleaz i modul de funcionare
a operaiilor lui specifice, din exterior neputndu-se observa dect modul de
apelare a acestor operaii i rezultatele apelurilor. Cu alte cuvinte, procesul
de ncapsulare este procesul de ascundere a detaliilor neimportante sau
sensibile de construcie a obiectului.
Dar nu numai proprietile unui obiect trebuiesc protejate ci i operaiile
definite de ctre acesta. Unele dintre operaiile definite pentru un obiect,
cum ar fi de exemplu procesul respirator al omului, sunt periculos de lsat
la dispoziia oricui. Este preferabil s putem controla foarte exact cine ce
operaii poate apela pentru un anumit obiect. n acest mod, din punctul de
vedere al unui observator strin, omul este perceput ca un obiect mult mai
simplu dect este n realitate, pentru c acel observator nu poate vedea
dect acele valori i nu poate apela dect acele operaii care sunt fcute
publice.
Desigur, n practic este nevoie de o oarecare rafinare a gradului de
protejare a fiecrei operaii sau proprieti n aa fel nct nsui accesul
observatorilor exteriori s poat fi nuanat n funcie de gradul de
similitudine i apropiere al observatorului fa de obiectul accesat.
Rafinarea trebuie s mearg pn la a putea specifica pentru fiecare
proprietate i operaie n parte care sunt observatorii care au acces i care
nu.
Aceast protejare i ncapsulare a proprietilor i operaiilor ce se pot
executa cu ajutorul unui obiect are i o alt consecin i anume aceea c
utilizatorul obiectului respectiv este independent de detaliile constructive
ale obiectului respectiv. Structura intern a obiectului poate fi astfel
schimbat i perfecionat n timp fr ca funcionalitatea de baz s fie
afectat.
3.3 Clase de obiecte

n lumea real se pot identifica uor familii de obiecte. Este greu s


descriem ntr-un limbaj de programare fiecare minge din lume dar, pentru a
putea folosi orice minge din lume, este suficient s descriem o singur dat
care sunt proprietile unei mingi n general, precum i operaiile care pot fi
executate cu aceasta. Aceasta nu nseamn c toate obiectele minge din
lume sunt identice. Diferena dintre ele se afl reprezentat n primul rnd
n valorile proprietilor lor care sunt mrimi numerice variabile, adic

difer de la un obiect de acelai fel la altul. De exemplu, n fiecare obiect


minge vom avea un numr natural care reprezint culoarea mingii. Acest
numr poate s difere de la o minge la alta exact aa cum, n realitate,
culoarea difer de la o minge la alta. La fel coordonatele poziiei mingii la un
moment dat sau raza mingii precum i materialul din care este
confecionat au valori care variaz de la o minge la alta.
Cu alte cuvinte, fiecare minge din lume are acelai set de proprieti, dar
valorile acestora pot s difere de la o minge la alta. Modelul de reprezentare
n memorie a unui obiect este ntotdeauna acelai, dar valorile memorate n
locaiile corespunztoare proprietilor sunt n general diferite.
n ceea ce privete operaiile, acestea sunt ntotdeauna aceleai dar
rezultatul aplicrii lor poate s difere n funcie de valorile proprietilor
obiectului asupra cruia au fost aplicate. De exemplu, atunci cnd aruncm
o minge spre pmnt ea va ricoa din acesta ridicndu-se din nou n aer.
nlimea la care se va ridica ns, este dependent de dimensiunile i
materialul din care a fost confecionat mingea. Cu alte cuvinte, noua
poziie n spaiu se va calcula printr-o operaie care va ine cont de valorile
memorate n interiorul obiectului. Se poate ntmpla chiar ca operaia s
hotrasc faptul c mingea va strpunge podeaua n loc s fie respins de
ctre aceasta.
S mai observm c operaiile nu depind numai de proprietile obiectului
ci i de unele valori exterioare acestuia. Atunci cnd aruncm o minge spre
pmnt, nlimea la care va ricoa aceasta depinde i de viteza cu care a
fost aruncat mingea. Aceast vitez este un parametru al operaiei de
aruncare. Nu are nici un rost s transmitem ca parametrii ai unei operaii
valorile proprietilor unui obiect pentru c acestea sunt ntotdeauna
disponibile operaiei. Nici o operaie nu se poate aplica asupra unui obiect
fr s tim exact care este obiectul respectiv i ce proprieti are acesta.
Este absurd s ne gndim la ce nlime se va ridica o minge n general, fr
s facem presupuneri asupra valorilor proprietilor acesteia. S mai
observm ns c, dac toate mingile ar avea aceleai valori pentru
proprietile implicate n operaia descris mai sus, am putea s calculm
nlimea de ricoeu n general, fr s fim dependeni de o anumit minge.
n concluzie, putem spune c obiectele cu care lucrm fac parte
ntotdeauna dintr-o familie mai mare de obiecte cu proprieti i
comportament similar. Aceste familii de obiecte le vom numi n
continuareclase de obiecte sau concepte n timp ce obiectele aparinnd unei

anumite clase le vom numi instane ale clasei de obiecte respective. Putem
vorbi despre clasa de obiecte minge i despre instanele acesteia, mulimea
tuturor obiectelor minge care exist n lume. Fiecare instan a clasei minge
are un loc bine precizat n spaiu i n timp, un material i o culoare. Aceste
proprieti difer de la o instan la alta, dar fiecare instan a aceleiai
clase va avea ntotdeauna aceleai proprieti i aceleai operaii vor putea fi
aplicate asupra ei. n continuare vom numi variabile aceste proprieti ale
unei clase de obiecte i vom numi metode operaiile definite pentru o
anumit clas de obiecte.
Pentru a clarifica, s mai relum nc o dat: O clas de obiecte este o
descriere a proprietilor i operaiilor specifice unui nou tip de obiecte
reprezentabile n memorie. O instan a unei clase de obiecte este un obiect
de memorie care respect descrierea clasei. O variabil a unei clase de
obiecte este o proprietate a clasei respective care poate lua valori diferite n
instane diferite ale clasei. O metod a unei clase este descrierea unei
operaii specifice clasei respective.
S mai precizm faptul c, spre deosebire de variabilele unei clase, metodele
acesteia sunt memorate o singur dat pentru toate obiectele. Comportarea
diferit a acestora este dat de faptul c ele depind de valorile variabilelor.
O categorie aparte a claselor de obiecte este categoria acelor clase care
reprezint concepte care nu se pot instania n mod direct, adic nu putem
construi instane ale clasei respective, de obicei pentru c nu avem destule
informaii pentru a le putea construi. De exemplu, conceptul de om nu se
poate instania n mod direct pentru c nu putem construi un om despre
care nu tim exact dac este brbat sau femeie. Putem n schimb instania
conceptul de brbat i conceptul de femeie care sunt nite subconcepte ale
conceptului om.
Clasele abstracte, neinstaniabile, servesc n general pentru definirea unor
proprieti sau operaii comune ale mai multor clase i pentru a putea
generaliza operaiile referitoare la acestea. Putem, de exemplu s definim n
cadrul clasei de obiecte om modul n care acesta se alimenteaz ca fiind
independent de apartenena la conceptul de brbat sau femeie. Aceast
definiie va fi valabil la amndou subconceptele definite mai sus. n
schimb, nu putem dect cel mult s precizm faptul c un om trebuie s
aib un comportament social. Descrierea exact a acestui comportament
trebuie fcut n cadrul conceptului de brbat i a celui de femeie. Oricum,
este interesant faptul c, indiferent care ar fi clasa acestuia, putem s ne

bazm pe faptul c acesta va avea definit un comportament social, specific


clasei lui.
Cele dou metode despre care am vorbit mai sus, definite la nivelul unui
superconcept, sunt profund diferite din punctul de vedere al subconceptelor
acestuia. n timp ce metoda de alimentaie este definit exact i amndou
subconceptele pot s o foloseasc fr probleme, metoda de comportament
social este doar o metod abstract, care trebuie s existe, dar despre care
nu se tie exact cum trebuie definit.
Fiecare dintre subconcepte trebuie s-i defineasc propriul su
comportament social pentru a putea deveni instaniabil. Dac o clas de
obiecte are cel puin o metod abstract, ea devine n ntregime o clas
abstract i nu poate fi instaniat, adic nu putem crea instane ale unei
clase de obiecte abstracte.
Altfel spus, o clas abstract de obiecte este o clas pentru care nu s-au
precizat suficient de clar toate metodele astfel nct s poat fi folosit n
mod direct.
3.4 Derivarea claselor de obiecte

O alt proprietate interesant a claselor de obiecte este aceea de ierarhizare.


Practic, ori de cte ori definim o nou clas de obiecte care s reprezinte un
anumit concept, specificm clasa de obiecte care reprezint conceptul
original din care provine noul concept mpreun cu diferenele pe care le
aduce noul concept derivat fa de cel original. Aceast operaie de definire
a unei noi clase de obiecte pe baza uneia deja existente o vom numiderivare.
Conceptul mai general se va numi superconcept iar conceptul derivat din
acesta se va numi subconcept. n acelai mod, clasa original se va
numi superclas a noii clase n timp ce noua clas de obiecte se va
numisubclas a clasei derivate.
Uneori, n loc de derivare se folosete termenul de extindere. Termenul vine
de la faptul c o subclas i extinde superclasa cu noi variabile i metode.
n spiritul acestei ierarhizri, putem presupune c toate clasele de obiecte
sunt derivate dintr-o clas iniial, s-i spunem clasa de obiecte generice, n
care putem defini proprietile i operaiile comune tuturor obiectelor
precum ar fi testul de egalitate dintre dou instane, duplicarea instanelor
sau aflarea clasei de care aparine o anumit instan.

Ierarhizarea se poate extinde pe mai multe nivele, sub form arborescent,


n fiecare punct nodal al structurii arborescente rezultate aflndu-se clase
de obiecte. Desigur, clasele de obiecte de pe orice nivel pot avea instane
proprii, cu condiia s nu fie clase abstracte, imposibil de instaniat.

Figura 3.2 O ierarhie de clase de obiecte n care clasele sunt reprezentate n cmpuri
eliptice iar instanele acestora n cmpuri dreptunghiulare. Clasele abstracte de obiecte
au elipsa dublat.

Desigur, este foarte dificil s construim o ierarhie de clase de obiecte


complet, care s conin clase de obiecte corespunztoare fiecrui concept
cunoscut. Din fericire, pentru o problem dat, conceptele implicate n
rezolvarea ei sunt relativ puine i pot fi uor izolate, simplificate i definite.
Restrngerea la minimum a arborelui de concepte necesar rezolvrii unei
anumite probleme fr a se afecta generalitatea soluiei este un talent pe
care fiecare programator trebuie s i-l descopere i s i-l cultive cu
atenie. De alegerea acestor concepte depinde eficiena i flexibilitatea
aplicaiei.
O clas de obiecte derivat dintr-o alt clas pstreaz toate proprietile i
operaiile acesteia din urm aducnd n plus proprieti i operaii noi. De
exemplu, dac la nivelul clasei de obiecte om am definit forma biped a
acestuia i capacitatea de a vorbi i de a nelege, toate acestea vor fi
motenite i de ctre clasele derivate din clasa om, i anume clasa
brbailor i cea a femeilor. Fiecare dintre aceste clase de obiecte derivate i
vor defini propriile lor proprieti i operaii pentru a descrie diferena
dintre ele i clasa original.
Unele dintre proprietile i operaiile definite n superclas pot fi redefinite
n subclasele de obiecte derivate. Vechile proprieti i operaii sunt
disponibile n continuare, doar c pentru a le putea accesa va trebui s fie

specificat explicit superclasa care deine copia redefinit. Operaia de


redefinire a unor operaii sau variabile din interiorul unei clase n timpul
procesului de derivare o vom numi rescriere.
Aceast redefinire ne d de fapt o mare flexibilitate n construcia ierarhiei
unei probleme date pentru c nici o proprietate sau operaie definit ntr-un
punct al ierarhiei nu este impus definitiv pentru conceptele derivate din
acest punct direct sau nu.
Revenind pentru un moment la protejarea informaiilor interne ale unui
obiect s precizm faptul c gradul de similitudine de care vorbeam mai sus
este mrit n cazul n care vorbim de dou clase derivate una din cealalt.
Cu alte cuvinte, o subclas a unei clase are acces de obicei la mult mai
multe informaii memorate n superclasa sa dect o alt clas de obiecte
oarecare. Acest lucru este firesc innd cont de faptul c, uneori, o subclas
este nevoit s redefineasc o parte din funcionalitatea superclasei sale.
3.5 Interfee spre obiecte

Un obiect este o entitate complex pe care o putem privi din diverse puncte
de vedere. Omul de exemplu poate fi privit ca un mamifer care nate pui vii
sau poate fi privit ca o fiin gnditoare care nv s programeze
calculatoare sau poate fi privit ca un simplu obiect spaio-temporal care are
propria lui form i poziie n funcie de timp.
Aceast observaie ne spune c trebuie s dm definiii despre ce nseamn
cu adevrat faptul c un obiect poate fi privit ca un mamifer sau ca o fiina
gnditoare sau ca un obiect spaio-temporal. Aceste definiii, pe care le vom
numi n continuare interfee, sunt aplicabile nu numai clasei de obiecte om
dar i la alte clase de obiecte derivate sau nu din acesta, superclase sau nu
ale acesteia. Putem s gsim o mulime de clase de obiecte ale cror
instane pot fi privite ca obiecte spaio-temporale dar care s nu aib mare
lucru n comun cu omul. Practic, atunci cnd construim o interfa,
definim un set minim de operaii care trebuie s aparin obiectelor care
respect aceast interfa. Orice clas de obiecte care declar c respect
aceast interfa va trebui s defineasc toate operaiile.
Operaiile ns, sunt definite pe ci specifice fiecrei clase de obiecte n
parte. De exemplu, orice obiect spaial trebuie s defineasc o operaie de
modificare a poziiei n care se afl. Dar aceast operaie este diferit la un
om, care poate s-i schimbe singur poziia, fa de o minge care trebuie
ajutat din exterior pentru a putea fi mutat. Totui, dac tim cu

siguran c un obiect este o instan a unui clase de obiecte care respect


interfaa spatio-temporal, putem linitii s executm asupra acestuia o
operaie de schimbare a poziiei, fr s trebuiasc s cunoatem amnunte
despre modul n care va fi executat aceast operaie. Tot ceea ce trebuie s
tim este faptul c operaia este definit pentru obiectul respectiv.
n concluzie, o interfa este un set de operaii care trebuiesc definite de o
clas de obiecte pentru a se nscrie ntr-o anumit categorie. Vom spune
despre o clas care definete toate operaiile unei interfee c implementeaz
interfaa respectiv.
Cu alte cuvinte, putem privi interfeele ca pe nite reguli de comportament
impuse claselor de obiecte. n clipa n care o clas implementeaz o
anumit interfa, obiectele din clasa respectiv pot fi privite n exclusivitate
din acest punct de vedere. Interfeele pot fi privite ca nite filtre prin care
putem privi un anumit obiect, filtre care nu las la vedere dect
proprietile specifice interfeei, chiar dac obiectul n vizor este mult mai
complicat n realitate.
Interfeele creaz o alt mprire a obiectelor cu care lucrm. n afar de
mprirea normal pe clase, putem s mprim obiectele i dup
interfeele pe care le implementeaz. i, la fel cu situaia n care definim o
operaie doar pentru obiectele unei anumite clase, putem defini i operaii
care lucreaz doar cu obiecte care implementeaz o anumit interfa,
indiferent de clasa din care acestea fac parte.
[cuprins]
(C) IntegraSoft 1996-1998

S-ar putea să vă placă și