An Usability Study Of A Recommender System For Mash Ups For Learning
Carte C 2003
1. CUPRINS
CUPRINS............................................................................................I
Capitolul I...........................................................................................1
INTRODUCERE ÎN..........................................................................1
ARHITECURA SISTEMELOR DE CALCUL...............................1
1.1. Importanţa limbajului C....................................................1
1.2 Arhitectura de bază a unui calculator.................................4
1.2.1 Microprocesorul.........................................................7
1.2.2 Memoria.....................................................................8
1.2.3 Echipamentele periferice..........................................10
1.3. Programarea calculatorului.............................................13
1.3.1. Sistemul de operare.................................................14
1.3.2. Tipuri de fişiere.......................................................18
1.3.3. Construirea fişierului executabil.............................19
Capitolul II.......................................................................................24
REPREZENTAREA DATELOR ÎN CALCULATOR.................25
2.1. Reprezentarea internă/externă a numerelor....................26
2.2. Reprezentarea externă a numerelor.................................27
2.2.1. Reprezentarea externă a numerelor întregi..............28
2.2.2. Reprezentarea externă a numerelor reale................31
2.3 Reprezentarea internă a numerelor..................................33
2.3.1. Reprezentarea internă a numerelor întregi..............33
2.3.2 Adunarea, scăderea şi înmulţirea numerelor întregi.35
2.3.3 Reprezentarea internă a numerelor reale..................37
Game de reprezentare pentru numerele reale....................49
2.3.5. Codificare BCD.......................................................50
Capitolul III......................................................................................52
ELEMENTELE DE BAZĂ ALE LIMABJULUI C.....................52
3.1. Crearea şi lansarea în execuţie a unui program C...........52
3.2. Structura unui program C................................................54
3.3. Mulţimea caracterelor ....................................................56
3.3.1. Litere şi numere.......................................................57
I
2. 3.3.2. Caractere whitespace...............................................57
3.3.3. Caractere speciale şi de punctuaţie..........................57
3.3.4. Secvenţe escape.......................................................58
3.4. Identificatori....................................................................59
3.5. Cuvintele cheie ale limbajului C.....................................60
3.6. Constante.........................................................................60
3.6.1. Constante caracter...................................................61
3.6.2. Constante întregi.....................................................61
3.6.3. Constante în virgulă mobilă....................................61
3.6.4. Constante şir............................................................62
3.6.5. Constanta zero.........................................................63
3.6.6. Obiecte constante....................................................63
3.6.7. Enumerări ...............................................................64
Capitolul IV......................................................................................64
..........................................................................................................64
Operanzi şi operatori în C...............................................................64
4.1. Operanzi .........................................................................65
4.2. Operatori ........................................................................65
4.2.1. Operatori aritmetici.................................................66
4.2.2. Operatori de incrementare şi decrementare.............67
4.2.3. Operatori relaţionali................................................67
4.2.4. Operatori logici.......................................................68
4.2.5. Operatori logici la nivel de bit.................................69
4.2.6. Operatorul de atribuire............................................74
4.2.7. Operatorul sizeof.....................................................74
4.2.8. Operatorul ternar ?.................................................75
4.2.9. Operatorul virgulă...................................................76
4.2.10. Operatorul de forţare a tipului sau de conversie
explicită (expresie cast)........................................77
4.2.11. Operatorii paranteză..............................................77
4.2.12. Operatorul adresă..................................................78
4.2.13. Alţi operatori ai limbajului C................................78
4.2.14. Regula conversiilor implicite şi precedenţa
operatorilor...........................................................78
Capitolul V.......................................................................................80
..........................................................................................................80
II
3. Instrucţiuni.......................................................................................80
5.1. Instrucţiuni etichetate (instrucţiunea goto).....................80
5.2. Instrucţiuni expresie........................................................81
5.3. Instrucţiuni compuse.......................................................82
5.4. Instrucţiuni de selecţie....................................................82
5.4.1. Instrucţiunea if.........................................................82
5.4.2. Instrucţiuni de selecţie multiplă: if - else if.............84
5.4.3. Instrucţiunea switch.................................................85
5.5. Instrucţiuni repetitive......................................................87
5.5.1. Instrucţiunea for......................................................87
5.5.2. Instrucţiunea while..................................................90
5.5.3. Instrucţiunea do-while.............................................92
5.5.4. Bucle încuibate........................................................94
5.5.5. Instrucţiunea break..................................................96
5.5.6. Instrucţiunea continue.............................................97
Capitolul VI......................................................................................97
..........................................................................................................97
TIPURI DE DATE STRUCTURATE ...........................................97
6.1. Tablouri unidimensionale...............................................98
6.1.1. Constante şir............................................................99
6.1.2. Iniţializarea vectorilor de caractere.......................100
6.1.3. Funcţii pentru prelucrarea şirurilor (fişierul antet
string.h)...............................................................102
6.2. Tablouri cu două dimensiuni (matrice).........................104
6.2.1. Iniţializarea matricelor..........................................105
6.2.2. Tablouri bidimensionale de şiruri.........................106
6.3. Tablouri multidimensionale..........................................106
6.4. Structuri.........................................................................107
6.4.1. Tablouri de structuri..............................................109
6.4.2. Introducerea structurilor în funcţii........................115
6.4.3. Tablouri şi structuri în structuri.............................119
6.5. Uniuni...........................................................................119
6.6. Enumerări......................................................................121
Capitolul VII..................................................................................123
........................................................................................................123
POINTERI.....................................................................................123
III
4. 7.1. Operatori pointer...........................................................123
7.1.1. Importanţa tipului de bază.....................................125
7.1.2. Expresii în care intervin pointeri...........................125
7.2. Pointeri şi tablouri.........................................................130
7.2.1. Indexarea pointerilor.............................................131
7.2.2. Pointeri şi şiruri ....................................................133
7.2.3. Preluarea adresei unui element al unui tablou.......134
7.2.4. Tablouri de pointeri...............................................134
7.2.5. Pointeri la pointeri.................................................135
7.2.6. Iniţializarea pointerilor..........................................136
7.2.7. Alocarea dinamică a memoriei..............................137
7.2.8. Pointeri la structuri................................................139
7.2.9. Structuri dinamice liniare de tip listă...................142
Capitolul VIII.................................................................................155
FUNCŢII.......................................................................................155
8.1. Forma generală a unei funcţii.......................................155
8.2. Reîntoarcerea dintr-o funcţie........................................158
8.3. Valori returnate.............................................................159
8.4. Domeniul unei funcţii...................................................160
8.4.1. Variabile locale.....................................................160
8.4.2. Parametri formali...................................................162
8.4.3. Variabile globale...................................................163
8.5. Apelul funcţiilor............................................................167
8.6. Apelul funcţiilor având ca argumente tablouri.............168
8.7. Argumentele argc şi argv ale funcţiei main()...............172
8.8. Funcţii care returnează valori neîntregi........................173
8.9. Returnarea pointerilor...................................................174
8.10. Funcţii de tip void.......................................................177
8.11. Funcţii prototip............................................................178
8.12. Funcţii recursive..........................................................180
8.13. Clase de memorare (specificatori sau atribute)...........181
8.14. Pointeri la funcţii.........................................................187
Capitolul IX....................................................................................188
PREPROCESAREA.....................................................................189
9.1. Directive uzuale............................................................189
9.2. Directive pentru compilare condiţionată.......................191
IV
5. 9.3. Modularizarea programelor.........................................195
Capitolul X.....................................................................................200
........................................................................................................200
INTRĂRI/IEŞIRI...........................................................................200
10.1. Funcţii de intrare şi ieşire - stdio.h..............................200
10.2. Operaţii cu fişiere........................................................203
10.3. Nivelul inferior de prelucrare a fişierelor...................206
10.3.1. Deschiderea unui fişier........................................206
10.3.2. Scrierea într-un fişier...........................................210
10.3.3. Citirea dintr-un fişier...........................................212
10.3.4. Închiderea unui fişier...........................................214
10.3.5. Poziţionarea într-un fişier....................................214
10.3.6 Ştergerea unui fişier.............................................216
10.3.7. Exemple de utilizare a funcţiilor de intrare/ieşire de
nivel inferior.......................................................217
10.4. Nivelul superior de prelucrare a fişierelor..................222
10.4.1. Funcţia fopen()....................................................223
10.4.2. Funcţia fclose()....................................................224
10.4.3. Funcţiile rename() şi remove()...........................225
10.4.4. Funcţii de tratare a erorilor..................................225
10.4.5. Funcţii cu acces direct.........................................226
10.4.6. Funcţii pentru poziţionare...................................228
10.4.7. Ieşiri cu format....................................................229
10.4.8. Intrări cu format..................................................232
10.4.9. Funcţii de citire şi scriere a caracterelor..............235
Capitolul XI....................................................................................239
........................................................................................................239
Utilizarea ecranului.......................................................................239
în mod text.....................................................................................239
11.1. Setarea ecranului în mod text......................................240
11.2. Definirea unei ferestre.................................................241
11.3. Ştergerea unei ferestre.................................................241
11.4. Deplasarea cursorului..................................................241
11.5. Setarea culorilor..........................................................242
11.6. Funcţii pentru gestiunea textelor.................................243
Capitolul XII..................................................................................246
V
6. ........................................................................................................246
Utilizarea ecranului.......................................................................246
în mod GRAFIC............................................................................246
12.1. Iniţializarea modului grafic.........................................247
12.2. Gestiunea culorilor......................................................249
12.3. Setarea ecranului.........................................................251
12.4. Utilizarea textelor în mod grafic.................................251
12.5. Gestiunea imaginilor...................................................253
12.6. Desenarea şi colorarea figurilor geometrice...............254
Capitolul XIII.................................................................................260
Funcţii matematice .......................................................................260
13.1 Funcţii trigonometrice..................................................261
13.2 Funcţii trigonometrice inverse.....................................261
13.3 Funcţii hiperbolice.......................................................261
13.4 Funcţii exponenţiale şi logaritmice..............................262
13.5 Generarea de numere aleatoare....................................262
13.6 Alte tipuri de funcţii matematice.................................263
Capitolul XIV.................................................................................264
ELEMENTE DE PROGRAMARE AVANSATĂ.......................264
14.1 Gestionarea memoriei..................................................264
14.1.1 Memoria convenţională........................................264
14.1.2 Memoria expandată..............................................267
14.1.3 Memoria extinsă...................................................268
14.1.4 Stiva......................................................................268
14.2 Servicii DOS şi BIOS..................................................269
14.2.1 Serviciile BIOS....................................................270
14.2.2 Serviciile DOS......................................................274
14.3 Bibliotecile C...............................................................277
14.3.1 Reutilizarea unui cod obiect.................................278
14.3.2 Lucrul cu fişiere bibliotecă...................................278
14.3 Fişierele antet...............................................................279
BIBLIOGRAFIE............................................................................279
VI
7. Capitolul I
INTRODUCERE ÎN
ARHITECURA SISTEMELOR DE CALCUL
1.1. Importanţa limbajului C
Creat în anul 1972 de programatorii de sistem Dennis M.
Ritchie şi Brian W. Kernighan de la Bell Laboratories cu scopul de a
asigura implementarea portabilă a sistemului de operare UNIX, C-ul
este astăzi unul din cele mai cunoscute şi puternice limbaje de
programare. Eficient, economic şi portabil, C-ul este o alegere bună
pentru realizarea oricărui tip de programe, de la editoare de texte,
jocuri cu facilităţi grafice, programe de gestiune şi pentru calcule
ştiinţifice, până la programe de sistem, constituind unul dintre cele
mai puternice instrumente de programare.
Adesea referit ca limbaj portabil, C-ul permite transferul
programelor între calculatoare cu diferite procesoare şi în acelaşi timp
facilitează utilizarea caracteristicilor specifice ale maşinilor
particulare, programele scrise în C fiind considerate cele mai
portabile.
Dacă evoluţia limbajelor de programare a adus în prim plan
nume ca FORTRAN, LISP, COBOL, ALGOL-60 sau PASCAL, unele
cu răspândire mai mult ”academică” – fiind folosite pentru a prezenta
conceptele de bază sau conceptele avansate de programare – ca de
pildă ALGOL-60 sau PASCAL, altele cu răspândire industrială
masivă – ca de pildă FORTRAN şi COBOL – limbajul C a pătruns
mai lent, dar foarte sigur. Realitatea arată clar că, în momentul de faţă,
piaţa producătorilor de programe este dominată net de C şi de
variantele evoluate ale acestuia.
Elementele principale care au contribuit la succesul C-ului sunt
următoarele:
- modularizarea programelor – ce dă posibilitatea unui
singur programator să stăpânească relativ uşor programe
de zeci de mii de linii de sursă;
1
8. - capacitatea de programare atât la nivel înalt cât şi la
nivel scăzut – ceea ce dă posibilitatea utilizatorului de a
programa fie fără a ”simţi” sistemul de operare şi maşina
de calcul, fie la un nivel apropiat de sistemul de operare
ceea ce permite un control foarte bun al eficienţei
programului din punct de vedere viteză/memorie;
- portabilitatea programelor – ce permite utilizarea
programelor scrise în C pe o mare varietate de
calculatoare şi sisteme de operare;
- facilităţile de reprezentare şi prelucrare a datelor –
materializate printr-un număr mare de operatori şi funcţii
de bibliotecă ce fac programarea mult mai uşoară.
Prin anii ’80 interesul pentru programarea orientată pe obiecte a
crescut, ceea ce a condus la apariţia de limbaje care să permită
utilizarea ei în scrierea programelor. Limbajul C a fost dezvoltat şi el
în această direcţie şi în anul 1980 a fost dat publicităţii limbajul C++,
elaborat de Bjarne Stroustrup de la AT&T. La ora actuală, majoritatea
limbajelor de programare moderne au fost dezvoltate în direcţia
programării orientate pe obiecte.
Limbajul C++, ca şi limbajul C, se bucură de o portabilitate
mare şi este implementat pe o gamă largă de calculatoare începând cu
microcalculatoare şi până la cele mai mari supercalculatoare.
Limbajul C++ a fost implementat pe microcalculatoarele
compatibile IBM PC în mai multe variante. Cele mai importante
implementări ale limbajelor C++ pe aceste calculatoare sunt cele
realizate de firmele Microsoft şi Borland.
Conceptele programării orientate pe obiecte au influenţat în
mare măsură dezvoltarea limbajelor de programare în ultimul deceniu.
De obicei, multe limbaje au fost extinse astfel încât ele să admită
conceptele mai importante ale programării orientate pe obiecte. Uneori
s-au făcut mai multe extensii ale aceluiaşi limbaj. De exemplu,
limbajul C++ are ca extensii limbajul E ce permite crearea şi gestiunea
obiectelor persistente, lucru deosebit de important pentru sistemele de
gestiune a bazelor de date, limbajul O ce încearcă să îmbine facilităţile
de nivel înalt cu cele ale programării de sistem, limbajul Avalon/C++
destinat calculului distribuit, şi nu în ultimul rând binecunoscutul de
acum limbaj Java, specializat în aplicaţii Internet.
Interfeţele utilizator au atins o mare dezvoltare datorită
facilităţilor oferite de componentele hardware ale diferitelor
2
9. calculatoare. În principiu, ele simplifică interacţiunea dintre programe
şi utilizatorii acestora. Astfel, diferite comenzi, date de intrare sau
rezultate pot fi exprimate simplu şi natural utilizând diferite standarde
care conţin ferestre, bare de meniuri, cutii de dialoguri, butoane, etc.
Cu ajutorul mouse-ului toate acestea pot fi accesate extrem de rapid şi
uşor fără a mai fi nevoie să cunoşti şi să memorezi o serie întreagă
comenzi ale sistemului de operare sau ale limbajului de programare.
Toate acestea conduc la interfeţe simple şi vizuale, accesibile unui
segment foarte larg de utilizatori.
Implementarea interfeţelor este mult simplificată prin utilizarea
limbajelor orientate spre obiecte, aceasta mai ales datorită posibilităţii
de a utiliza componente standardizate aflate în biblioteci specifice.
Importanţa aplicării conceptului de reutilizare a codului rezultă din
faptul că interfeţele utilizator adesea ocupă 40% din codul total al
aplicaţiei.
Firma Borland comercializează o bibliotecă de componente
standardizate care pot fi utilizate folosind limbajul C++, bibliotecă
cunoscută sub numele Turbo Vision.
De obicei, interfeţele utilizator gestionează ecranul în mod
grafic. O astfel de interfaţă utilizator se numeşte interfaţă utilizator
grafică. Una din cele mai populare interfeţe utilizator grafice pentru
calculatoarele IBM PC este produsul Windows oferit de firma
Microsoft.
Windows este un mediu de programare ce amplifică facilităţile
oferite de sistemul de operare MS-DOS. Aplicaţiile Windows se pot
dezvolta folosind diferite medii de dezvoltare ca: Turbo C++ pentru
Windows, Pascal pentru Windows, Microsoft C++, Microsoft Visual
Basic, Visual C şi Visual C++.
Componentele Visual permit specificarea în mod grafic a
interfeţei utilizator, a unei aplicaţii, folosind mouse-ul, iar aplicaţia
propriu-zisă se programează într-un limbaj de tip Basic, C sau C++.
Dacă în ani ’70 se considera că o persoană este rezonabil să se
poată ocupa de o aplicaţie de 4-5 mii de instrucţiuni, în prezent, în
condiţiile folosirii limbajelor de programare orientate pe obiecte,
această medie a ajuns la peste 25 de mii de instrucţiuni.
Un limbaj de programare trebuie privit nu doar la suprafaţa sa –
sintaxă şi mod de butonare a calculatorului pentru o implementare
particulară – ci mai ales în profunzime, prin conceptele pe care se
bazează, prin stilul de programare, prin modul de structurare a
3
10. aplicaţiei şi, implicit, a programului, prin filozofia de rezolvare a
problemelor folosind limbajul. Din aceste puncte de vedere, C-ul nu
poate lipsi din cultura unui programator, iar pentru un profesionist C-
ul este, şi mai mult, o necesitate vitală, acesta fiind piatra de temelie
pentru înţelegerea şi utilizarea eficientă a limbajelor de nivel înalt
orientate pe obiecte şi Visual.
1.2 Arhitectura de bază a unui calculator
Calculatoarele de tip PC (calculatoare personale) reprezintă cele
mai răspândite şi mai utilizate dintre calculatoare, datorită gradului de
accesibilitate şi preţului relativ scăzut. Indiferent de tipul
calculatorului, modul general de concepţie, de alcătuire şi funcţionare
este acelaşi. Calculatorul este o maşină programabilă. Două dintre
principalele caracteristici ale unui calculator sunt:
1. Răspunde la un set specific de instrucţiuni într-o manieră bine
definită.
2. Calculatorul poate executa o listă preînregistrată de
instrucţiuni, numită program.
Calculatoarele moderne sunt electronice şi numerice.
Partea de circuite electrice şi electronice precum şi conexiunile
fizice dintre ele se numeşte hardware.
Totalitatea programelor precum şi datele aferente acestor
programe poartă denumirea de software.
4
11. Echipamente de ieşire
Echipamente de stocare date
(HDD, FDD, CD-ROM, etc.)
UPC
Unitatea de procesare
şi control Echipamente de intrare
Fig.1.1 Configuraţia standard pentru utilizator
Partea hardware a unui calculator este formată din totalitatea
componentelor sale fizice. Toate calculatoarele de uz general necesită
următoarele componente hardware:
memorie: Permite calculatorului să stocheze, cel puţin
temporar, date şi programe.
dispozitive de stocare externe: Permit calculatoarelor să
stocheze permanent programe şi mari cantităţi de date. Cele
mai uzuale dispozitive de stocare externă sunt HDD (hard
disk drives), FDD (floppy disk drive) şi CD-ROM (Compact
Disk-Read Only Memory) sau CD-R/W (Compact Disk-
Read/Write).
dispozitive de intrare : În mod uzual sunt reprezentate de
tastatură (keyboard) şi de mouse. Aceste dispozitive
reprezintă calea uzuală de introducere a datelor şi
instrucţiunilor care gestionează funcţionarea unui calculator.
dispozitive de ieşire: Reprezintă modalitatea prin care
calculatorul transmite utilizatorului uman rezultatele
execuţiei programelor. Ecranul monitorului sau imprimanta
sunt astfel de dispozitive uzuale.
unitatea de procesare şi control (UPC) : Este partea principală
a unui calculator deoarece este componenta care execută
instrucţiunile. În mod uzual această unitate de procesare şi
control este reprezentată de un microprocesor care se
5
12. plasează pe placa de bază (mainboard) a calculatorului
împreună cu memoria internă RAM. În plus faţă de aceste
componente orice calculator este prevăzut cu o magistrală
(bus) prin care se gestionează modalitatea de transmitere a
datelor între componentele de bază ale calculatorului.
Magistrala reprezintă o colecţie de trasee electrice care leagă
microprocesorul de dispozitivele de intrare/ieşire şi de
dispozitivele interne/externe de stocare a datelor. Putem
distinge magistrala de date, magistrala de adrese şi magistrala
de comandă şi control.
În figura 1.2 este prezentată interacţiunea dintre componentele
HARD principale ale unui calculator.
Calculatoarele pot fi în general clasificate după dimensiuni sau
putere de calcul. Nu se poate face însă la ora actuală o distincţie netă
între următoarele categorii de calculatoare:
PC (Personal Computer): Un calculator de dimensiuni mici,
monoutilizator (single-user), bazat pe un microprocesor. În plus
acesta este dotat standard cu tastatură, mouse, monitor şi
dispozitive periferice de stocare a datelor.
Memoria
secundară
Echipament UNITATEA Echipament
de intrare CENTRALĂ de ieşire
Memoria
principală
Fig. 1.2 Arhitectura minimală a unui sistem de calcul
staţii de lucru (workstation): Un calculator monoutilizator de
mare putere. Aceasta este asemănător unui PC dar are un
microprocesor mai puternic şi un monitor de înaltă calitate
(rezoluţie mai mare).
6
13. minicalculator (minicomputer): Un calculator multiutilizator
(multi-user) capabil să lucreze simultan cu zeci sau chiar sute
de utilizatori.
mainframe: Un calculator multiutilizator capabil să lucreze
simultan cu sute sau chiar mii de utilizatori.
supercomputer: Un computer extrem de rapid care poate
executa sute de milioane de operaţii într-o secundă.
1.2.1 Microprocesorul
Microprocesorul este cea mai importantă şi cea mai scumpă
componentă a unui calculator de performanţele acesteia depinzând în
mare măsură rezultatele întregului sistem.
Din punct de vedere fizic, microprocesorul este un cip ce
conţine un circuit integrat complex ce îi permite să prelucreze
informaţii prin executarea unor operaţii logice şi matematice diverse
(adunări, scăderi, înmulţiri, împărţiri, comparări de numere).
El este compus din două părţi importante: unitatea de execuţie
(EU – Execution Unit) şi unitatea de interfaţă a magistralei de date
(BIU – Bus Interface Unit). Prima componentă realizează efectiv
operaţiile, iar cea de-a doua are funcţia de transfer a datelor de la şi
înspre microprocesor.
Microprocesorul reprezintă de fapt unitatea centrală a unui
calculator şi îndeplineşte o serie de activităţi specifice cum ar fi:
execută operaţii aritmetice şi logice, decodifică instrucţiuni speciale,
transmite altor cipuri din sistem semnale de control. Toate aceste
operaţii sunt executate cu ajutorul unor zone de memorie ale
microprocesorului, numite registre. Orice microprocesor are un set
finit de instrucţiuni pe care le recunoaşte şi pe care le poate executa.
Calculatoarele IBM PC folosesc procesoare INTEL sau
compatibile, realizate de alte companii cum ar fi: AMD, NexGen,
CYRIX. Numele microprocesorului este folosit la identificarea
calculatorului. Se folosesc frecvent expresii de tipul calculator 386,
calculator 486, calculator Pentium II, etc.
În 1971 firma Intel a fost abordata de o companie Japoneza,
acum dispărută, pentru a construi un circuit dedicat pentru un nou
calculator. Designerul Ted Hoff a propus o soluţie programabilă, de uz
general, şi astfel s-a născut circuitul Intel 4004. Au urmat la scurt timp
chipurile 4040 si 8008 dar lor le lipseau multe din caracteristicile
microprocesoarelor aşa cum le ştim noi azi. În 1974 Intel a prezentat
7
14. pentru prima oară circuitul Intel 8080 care a fost folosit in sistemele
Altair şi IMSAI. Curând după aceea au apărut procesoarele Motorola
6800 şi 6502 de la MOS Technology. Doi dintre proiectanţii de la
Intel au părăsit firma, creând corporaţia ZILOG care a produs chipul
Z80 (compatibil cu 8080 dar cu set de instrucţiuni mai puternic şi de
două ori mai rapid.
Cipul Intel 4004 a fost primul procesor comercial, lansat la
sfârşitul anului 1971. La un preţ de circa 200$ şi înglobând 2300 de
tranzistori, cipul 4004 dezvolta mai multă putere de calcul decât
ENIAC, primul calculator electronic, cu 25 de ani în urma. Faţă de
cele 18.000 de tuburi cu vacuum ce ocupau 900 metri cubi, procesorul
4004 putea dezvolta 60.000 de operaţii pe secundă. Această invenţie a
contribuit la revoluţionarea domeniilor de aplicaţii ale computerelor,
dând startul unui adevărat galop de inovaţii tehnologice. Următorul
pas a fost în 1980, când IBM a inclus un procesor Intel în arhitectura
primului PC.
Astăzi PC-urile sunt pretutindeni în jurul nostru. Un copil care
lucrează la o maşina ce incorporează un procesor Pentium Pro
beneficiază de mult mai multă putere de calcul decât dispunea
guvernul SUA în perioada lansării primelor echipaje umane către
Lună.
Într-un număr aniversar al publicaţiei Communications of the
ACM, Gordon Moore, co-fondator al companiei Intel, era optimist în
privinţa evoluţiei PC-urilor şi a microprocesoarelor: "complexitatea
microprocesoarelor, care se măsoară prin numărul de tranzistori pe
cip, s-a dublat aproape constant la fiecare 18 luni, de la apariţia
primului prototip 4004. Aceasta evoluţie exponenţială a determinat o
continuă creştere a performanţelor PC-urilor şi o scădere a costului
procesului de calcul. Pe când în 1991 un PC bazat pe procesorul Intel
486 costa aproape 225$ pentru o performanţă de un milion de
instrucţiuni pe secundă (MIPS), astăzi, un sistem desktop ce utilizează
un cip Pentium Pro este evaluat la circa 7$ pe MIPS. Nu se întrevede
nici o dificultate care să frâneze această rată de dezvoltare".
1.2.2 Memoria
Microprocesorul are capacitatea de a memora date care urmează
a fi prelucrate, cât şi rezultatele intermediare. Se observă că rolul său
principal este de a prelucra şi transmite informaţiile şi rezultatele şi
deci capacitatea sa de memorare este mică neputând stoca programe.
8
15. De aceea, un calculator necesită şi o memorie care să găzduiască date
şi programe.
Memoria este formată din punct de vedere fizic din cipuri ce
stochează informaţia sub forma a două niveluri de tensiune ce
corespund valorilor 0 şi 1 din sistemul de numeraţie. Celulele de bază
ale memoriei (ce pot avea valoarea 0 sau 1) se numesc biţi şi ele
reprezintă particulele cele mai mici de informaţie din calculator.
Pentru citirea informaţiilor nu se folosesc biţi în mod individual ci
aceştia sunt grupaţi într-o succesiune. Astfel o succesiune de 8 biţi
formează un octet (sau un byte) aceasta reprezentând unitatea de
măsură a capacităţii de memorie. Deoarece reprezentarea numerelor în
calculator se face în baza 2 şi nu în baza 10, aşa cum suntem obişnuiţi
în mod normal să lucrăm, şi multiplii unui byte vor fi puteri ale lui 2,
astfel:
1 KB=210B=1024 B
1 MB=210KB=1 048 576 B
1 GB=210MB=230 B
Abrevierile K (kilo), M (mega), G (giga) se scriu de obicei cu
litere mari şi reprezintă mii, milioane şi, respectiv, miliarde.
Memoria unui calculator are două componente: memoria
principală (internă) şi memoria secundară (externă). Memoria internă
este memoria ce poate fi accesată în mod direct de către microprocesor
şi în care sunt încărcate programele înainte de a fi executate de către
microprocesor. Dacă primele procesoare puteau accesa doar 1 MB de
memorie astăzi un procesor Pentium poate accesa peste 256 MB.
Memoria principală este formată din două tipuri de circuite: cip-uri
ROM şi cip-uri RAM.
Circuitele de tip ROM (Read Only Memory) au memorate
programele care controlează iniţial calculatorul (sistemul de operare).
Aceste memorii pot fi doar citite (conţinutul lor nu poate fi modificat).
Înscrierea conţinutului acestor memorii se face de către fabricant, iar
operaţiunea de înscriere cu programe se mai numeşte „arderea
memoriilor”.
Circuitele de tip RAM (Random Acces Memory ) sunt memorii
la care utilizatorul are acces şi al căror conţinut se şterge la
deconectarea calculatorului. În memoria RAM informaţia este stocată
temporar. De exemplu, programele de aplicaţii curente şi datele
asociate acestor aplicaţii sunt încărcate în memoria RAM înainte de a
fi prelucrate de către microprocesor.
9
16. Deoarece capacitatea de memorie a unui calculator nu poate fi
atât de mare încât să poată păstra toate programele pe vrem să le
executăm, a apărut necesitatea existenţei unor memorii externe, care
să fie solicitate la nevoie. Rolul acestora îl joacă discurile şi ele pot fi
asemănate cu cărţile dintr-o bibliotecă pe care le putem consulta ori de
câte ori avem nevoie de anumite informaţii.
Primele discuri apărute pentru PC-uri, numite şi dischete,
floppy disk-uri sau discuri flexibile, permiteau stocarea a maximum
160 KB de informaţie. Astăzi mai există doar dischete cu diametrul de
3.5 inch cu capacitatea de 1,44 MB. Existenţa acestora pare a fi pusă
însă în pericol de apariţia CD-urilor reinscriptibile a căror capacitate
de memorare depăşeşte 700 MB iar evoluţia tehnologică, din ce în ce
mai rapidă, dă semne că lucrurile nu se vor opri aici.
Dischetele folosesc metode magnetice de memorare a
informaţiei motiv pentru care ele se mai numesc şi suporturi
magnetice de informaţie.
Principala componentă a unui calculator utilizată pentru
memorarea programelor o reprezintă hard discul. Acesta poate fi
asemănat cu o dischetă de mare capacitate, integrată într-o unitate
încapsulată. Iniţial, puţine PC-uri prezentau hard discuri, dar cum
preţurile acestora au scăzut considerabil, iar performanţele şi
capacităţile au crescut, în prezent toate calculatoarele prezintă acest
dispozitiv. În clipa de faţă, capacitatea de memorare a unui hard disc a
depăşit valoarea de 40 de GB.
1.2.3 Echipamentele periferice
Comunicarea om-maşină se realizează cu ajutorul
echipamentelor periferice prin intermediul cărora utilizatorul poate
programa sau da anumite comenzi calculatorului sau poate vizualiza
rezultatele obţinute de către anumite programe. Principalele
echipamente periferice ale unui calculator sunt următoarele: tastatura,
mouse-ul, scanner-ul, monitorul şi imprimanta. Ele pot fi grupate în
echipamente de intrare – cele prin care calculatorul primeşte
informaţii sau comenzi (tastatură, mouse, scanner) - şi echipamente de
ieşire – cele prin care calculatorul transmite informaţii în exterior
(monitor, imprimantă). În continuare sunt prezentate câteva
caracteristici ale fiecărui echipament.
Tastatura – este principalul dispozitiv de intrare al
calculatorului prin intermediul căruia se transmit comenzi către
10
17. unitatea centrală. Cuplarea la calculator a tastaturii se face prin
intermediul unui cablu de conectare.
Din punct de vedere al dispunerii tastelor, tastatura se aseamănă
destul de mult cu cea a unei maşini de scris dar are şi părţi care o
individualizează.
Primele tastaturi au avut 83/84 de taste, pentru ca, ulterior, ele
să fie îmbogăţite prin dublarea tastelor existente sau adăugarea altora
noi, ajungându-se la 101/102 taste.
Din punct de vedere al funcţionalităţii lor ele pot fi împărţite în
patru categorii:
- taste alfanumerice;
- taste cu scopuri speciale;
- taste direcţionale şi numerice;
- taste funcţionale.
Tastele alfanumerice conţin literele, cifrele şi semnele de
punctuaţie şi ocupă partea centrală a tastaturii. Acţionarea unei astfel
de taste determină apariţia caracterului corespunzător pe ecranul
calculatorului. Tastele cu scopuri speciale sunt aşezate în acelaşi bloc
cu tastele alfanumerice şi determină efectuarea anumitor acţiuni fără
înscrierea de caractere pe ecran. Tastele de mişcare se află situate în
partea dreaptă a tastaturii şi ele funcţionează în două moduri, care pot
fi comutate prin acţionarea altei taste, aflate deasupra lor, pe care scrie
NumLock. Dacă ledul corespunzător acestei taste este aprins, modul
de lucru este numeric, în caz contrar fiind comutat pe semnificaţia
direcţională. Tastele funcţionale sunt un grup de 12 taste situate în
partea de sus a tastaturii având pe ele litera F urmată de un număr între
1 şi 12. Acţionarea acestor taste determină efectuarea unor operaţii
specifice de la program la program.
Mouse-ul – este tot un echipament de intrare mai uşor de
manevrat decât tastatura dar care poate efectua mai puţine operaţii.
Totuşi, foarte multe aplicaţii (în special aplicaţiile grafice) nu mai pot
fi concepute fără mouse. Un mouse are aspectul unei bucăţi de săpun,
uşor manevrabil, având dedesubt o bilă poziţionabilă, cu sensibilitate
şi viteză reglabile.
Mişcarea maouse-ului pe o suprafaţă plană este corelată cu
deplasarea pe ecran a unui cursor cu o formă deosebită: cruciuliţă,
săgeată, etc. Declanşarea unei acţiuni se face prin poziţionarea
cursorului în zona corespunzătoare şi apăsarea unuia dintre butoanele
aflate pe partea posterioară. Iniţial un mouse avea două sau trei
11
18. butoane. Acum există mouse-uri cu 5 butoane şi 2 rotiţe ce îndeplinesc
o serie de funcţii corespunzătoare unor taste speciale.
Folosirea mouse-ului uşurează mult munca utilizatorilor,
nemaifiind necesar ca aceştia să memoreze numărul relativ mare de
comenzi corespunzător fiecărui produs, ca în situaţia în care se
foloseşte numai tastatura. Utilitatea mouse-ului este şi mai evidentă în
cazul aplicaţiilor grafice. De altfel, WINDOWS este un sistem de
operare creat special pentru lucrul cu mouse-ul.
Scanner-ul – reprezintă dispozitive care se cuplează la un PC şi
cu care, prin intermediul unui software adecvat, se pot capta imagini,
fotografii, texte etc., în vederea unei prelucrări ulterioare. Astfel se pot
manevra imagini foto, se pot crea efecte grafice speciale, care nu se
pot obţine prin metode tradiţionale. După captare, imaginea poate fi
prelucrată, mutată, mărită, micşorată, rotită, colorată, umbrită,
suprapusă cu altă imagine etc.
Cu un software de recunoaştere optică a caracterelor datele sau
documentele tipărite pe coli de hârtie pot fi transformate în fişiere,
putându-se realiza chiar o stocare a lor sub formă de arhivă.
Monitorul - Sistemul video este format din două părţi: un
adaptor (placă) video şi un monitor sau display. Adaptorul video
reprezintă dispozitivul care realizează legătura (interfaţa) cu
calculatorul şi se află în interiorul acestuia. El va fi corespunzător
tipului de monitor video care îi este ataşat. Adaptorul video realizează
o rezoluţie orizontală şi una verticală. Rezoluţia reprezintă numărul de
elemente, în cazul de faţă puncte – pixeli – care pot fi afişate pe ecran.
De exemplu, un monitor VGA, în mod video, are o rezoluţie de 640 x
480 pixeli.
Standardul VGA (Video Graphics Array) a fost introdus de
către IBM o dată cu calculatoarele PS/2, iar modurile video VGA
reprezintă un superset al standardelor video anterioare, CGA (Color
Graphics Adapter) şi EGA (Enhanced Graphics Adapter). Cea mai
importantă îmbunătăţire adusă de standardul VGA a fost rezoluţia
superioară a caracterelor în modul text, precum şi posibilitatea de a
afişa 256 de culori la un moment dat.
Monitorul, denumit uneori şi display, permite vizualizarea
datelor introduse de la tastatură sau rezultate în urma execuţiei unor
comenzi sau programe, fiind încadrat în categoria echipamentelor
periferice de ieşire. Ca piesă principală, monitorul conţine un tub de
12
19. vacuum, similar cu cel de la televizor şi trei tunuri de electroni
(corespunzătoare celor trei culori fundamentale).
Standardele video MDA, CGA şi EGA folosesc monitoare
digitale. Datele care descriu culorile pixelilor sunt trimise de adaptorul
video la monitor sub forma unor serii de semnale digitale care sunt
echivalente unor serii de biţi.
Standardul VGA a introdus un nou tip de monitor care
utilizează semnale analogice pentru transferul informaţiilor privind
culoarea de la adaptorul video la monitor. Dacă semnalele digitale
prezintă niveluri care indică prezenţa sau absenţa unui bit, semnalele
analogice pot prezenta orice valoare între una minimă şi una maximă.
Imprimanta - Reprezintă un dispozitiv care poate fi ataşat unui
calculator, cu scopul tipăririi de texte şi grafică, putând fi considerată
un fel de maşină de scris automată. Până în prezent au fost realizate un
număr destul de mare de tipuri de imprimante pentru PC-uri, ele
diferind atât prin performanţe, cât şi prin modalităţile tehnice de
ralizare. Fiecare dintre ele prezintă avantaje şi dezavantaje, ideal fiind
a o folosi pe cea care corespunde cel mai bine tipului de lucrări
executate. În funcţie de modul în care este realizată imprimarea se
disting următoarele tipuri de imprimante:
- imprimante matriceale cu 9, 18 sau 24 de ace –
realizează imprimarea prin impactul acelor peste o
bandă de hârtie;
- imprimante cu jet de cerneală – funcţionează prin
pulverizarea fină a unor picături de cerneală pe hârtia
de imprimat;
- imprimante laser – ce utilizează o rază laser sau mici
diode luminiscente care încarcă electrostatic un
tambur de imprimare, corespunzător caracterului care
urmează a fi imprimat;
- imprimante rapide de linii – ce imprimă mai multe
linii odată, fiind folosite mai mult la sisteme de calcul
de dimensiuni mari.
Calitatea imprimării creşte de la primul la ultimul tip prezentat,
dar în mod corespunzător şi preţul echipamentului.
1.3. Programarea calculatorului
13
20. Programele de calculator, cunoscute sub numele de software,
sunt constituite dintr-o serie de instrucţiuni pe care le execută
calculatorul. Când se creează un program, trebuie specificate
instrucţiunile pe care calculatorul trebuie să le execute pentru a realiza
operaţiile dorite. Procesul de definire a instrucţiunilor pe care le
execută calculatorul se numeşte programare.
Programele executate pe un calculator pot fi împărţite în trei
categorii:
• programe de aplicaţie – sunt acele programe care
interacţionează direct cu utilizatorul, specializate în
realizarea unei categorii de prelucrări. Editoarele de texte,
programele pentru gestiunea bazelor de date, programele
de tehnoredactare asistată de calculator, de grafică etc. sunt
programe de aplicaţie.
• utilitare – programe, care la fel ca programele de aplicaţie,
interacţionează direct cu utilizatorul, dar, spre deosebire de
acestea, realizează prelucrări de uz general. Utilitarele
realizează o serie de operaţii de „gospodărie” cum ar fi:
copierea fişierelor, pregătirea discurilor magnetice pentru
utilizare, crearea de copii de salvare, testarea
echipamentului, etc.
• programe de sistem – realizează legătura între
componentele electronice ale calculatorului şi programele
de aplicaţie şi utilitare. Rolul programului de sistem este
acela de a uşura sarcina programatorului, simplificând
îndeplinirea acelor sarcini care sunt comune marii
majorităţi a programelor de aplicaţie: alocarea memoriei,
afişarea caracterelor pe ecran şi la imprimantă, citirea
caracterelor de la tastatură, accesul la informaţiile stocate
pe disc magnetic, etc.
1.3.1. Sistemul de operare
Sistemul de operare este o parte componentă a software-ului
unui calculator, care mai cuprinde un număr variabil de programe
utilitare selectate conform cu necesităţile programatorilor.
Sistemul de operare este un program cu funcţii de coordonare şi
control asupra resurselor fizice ale calculatorului şi care intermediază
dialogul om-calculator. Sistemul de operare permite rularea
programelor şi păstrarea informaţiilor pe disc. În plus, fiecare sistem
14
21. de operare pune la dispoziţia aplicaţiilor o serie de servicii care permit
programelor să aloce memorie, să acceseze diferite echipamente
periferice, cum ar fi imprimanta, şi să gestioneze alte resurse ale
calculatorului.
Un sistem de operare trebuie să aibă capacitatea de a se adapta
rapid la modificările tehnologice, rămânând în acelaşi timp compatibil
cu hardware-ul anterior. Lanţul de comunicare utilizator – calculator
este prezentat în Figura 1.3:
Sistemul de operare este cel mai important program care rulează
pe un calculator. Orice calculator de uz general este dotat cu un sistem
de operare care permite execuţia altor programe. Sistemele de operare
execută operaţiuni de bază precum: recunoaşterea unei intrări de la
tastatură (preluare caracter), trimiterea unui caracter pentru afişare pe
ecranul monitorului, gestionarea fişierelor şi a directoarelor pe disc
(floppy-disk sau hard-disk), controlul fluxului de date cu
echipamentele periferice ca drivere de disc sau imprimante.
CALCULATOR
SISTEM DE
OPERARE
APLICAŢII
UTILIZATOR
Fig. 1.3. Comunicarea utilizator - calculator
15
22. Aplicaţie
Disk-drive
Sistem de
operare
Mouse
Monitor
Tastaturã Imprimantã
Fig. 1.4 Rolul sistemului de operare
Sistemul de operare al unui calculator este partea de software
necesară şi suficientă pentru execuţia oricăror alte aplicaţii dorite de
utilizator. Un calculator nu poate funcţiona decât sub gestiunea unui
sistem de operare. Orice aplicaţie lansată în execuţie de către un
utilizator apelează la resursele puse la dispoziţie de către sistemul de
operare. Sistemul de operare interfaţează calculatorul cu operatorul
uman de o manieră cât mai transparentă cu putinţă astfel încât
utilizatorul nu trebuie să facă eforturi mari de adaptare dacă lucrează
cu arhitecturi hardware diferite.
Pentru sisteme mai mari, sistemele de operare au
responsabilităţi şi capabilităţi şi mai mari. Ele acţionează ca un
gestionar al traficului de date şi al execuţiei programelor. În principal
sistemul de operare asigură ca diferite programe şi diferiţi utilizatori
să nu interfereze unele cu altele. Sistemul de operare este de asemenea
responsabil cu securitatea, asigurând inaccesibilitatea persoanelor
neautorizate la resursele sistemului.
Sistemele de operare se pot clasifica după cum urmează:
multi-user: Permit ca doi sau mai mulţi utilizatori să ruleze în
acelaşi timp programe (utilizatori concurenţi). Anumite
sisteme de operare permit sute sau chiar mii de utilizatori
concurenţi.
multiprocesor: Permit execuţia unui program pe mai mult de
un microprocesor.
16
23. multitasking: Permit mai multor programe să ruleze în acelaşi
timp (execuţie concurentă).
multithreading: Permit diferitelor părţi ale unui program să
fie executate concurent.
timp real (real time): Răspund instantaneu la diferite intrări.
Sistemele de operare de uz general, ca DOS sau UNIX nu
sunt sisteme de operare de timp real.
Sistemele de operare furnizează o platformă software pe baza
căreia alte programe, numite programe de aplicaţie, pot rula (pot fi
executate). Programele de aplicaţie trebuie să fie scrise pentru a rula
pe baza unui anumit sistem de operare. Alegerea unui anumit sistem
de operare determină în consecinţă mulţimea aplicaţiilor care pot fi
rulate pe calculatorul respectiv. Pentru PC-uri, cele mai populare
sisteme de operare sunt DOS, OS/2 sau Windows, dar mai sunt
disponibile şi altele precum Linux.
Ca utilizator se interacţionează cu sistemul de operare prin
intermediul unor comenzi. Spre exemplu, sistemul de operare DOS
acceptă comenzi precum COPY sau RENAME pentru a copia fişiere
sau pentru a le redenumi. Aceste comenzi sunt acceptate şi executate
de o parte a sistemului de operare numită procesor de comenzi sau
interpretor de linie de comandă.
Interfaţele grafice cu utilizatorul (GUI, Graphical user
interfaces) permit introducerea unor comenzi prin selectarea şi
acţionarea cu mouse-ul a unor obiecte grafice care apar pe ecran. Spre
exemplu, sistemul de operare Windows are un desktop ca intefaţă
garfică cu utilizatorul. Pe acest desktop (birou) se află diferite
simboluri grafice (icoane, icons) ataşate diferitelor aplicaţii
disponibile pe calculatorul respectiv. Utilizatorul are multiple
posibilităţi de configurare a acestei intefeţe grafice.
Primul sistem de operare creat pentru calculatoare a fost CP/M
(Control Program for Microcomputers), realizat pentru calculatoarele
pe 8 biţi. O dată cu perfecţionarea componentelor HARD s-a impus şi
necesitatea dezvoltării unui SOFT adecvat. Astfel, în 1981, a apărut
prima versiune a sistemului de operare MS-DOS. Sistemul de operare
MS–DOS (MicroSoft Disk Operating System) este destinat
gestionării resurselor software si hardware ale microcalculatoarelor cu
o arhitectura de tip IBM – PC sau compatibilă cu aceasta şi echipate
cu procesoare 8086 sau 80x86, Pentium. Odată cu creşterea
17
24. capabilităţilor hardware ale calculatoarelor, acesta s-a transformat,
prin dezvoltări succesive, în Windows.
Indiferent de sistemul de operare utilizat, din punctul de vedere
al utilizatorului, informaţiile sunt scrise pe disc sub forma unor fişiere.
Un fişier este o colecţie de informaţii grupate sub acelaşi nume. Un
fişier poate fi un program executabil, un text, o imagine, un grup de
comenzi sau orice altceva.
Un fişier este identificat prin numele său. Numele unui fişier
este format dintr-un şir de caractere (care în funcţie de sistemul de
operare este limitat la un anumit număr maxim de caractere), urmate
eventual de semnul punct (.) şi de încă maximum 4 caractere, numite
extensie, ca de exemplu: nume.ext.
Pentru a putea avea acces rapid la fişiere, sistemul de operare
creează nişte fişiere speciale, numite directoare, care pot fi asemănate
cu cuprinsul unei cărţi, deoarece ele conţin numele fişierelor şi adresa
de început a acestora. De asemenea, un director poate conţine la
rândul său alte directoare creându-se astfel o structură arborescentă de
directoare în care poate fi găsit foarte repede un anumit fişier.
1.3.2. Tipuri de fişiere
Fişierele se pot împărţi în două categorii – executabile şi
neexecutabile. În prima categorie intră acele fişiere al căror nume scris
în dreptul prompterului (în cazul sistemului de operare DOS)
determină executarea unor activităţi de către sistemul de operare. O
parte dintre fişierele executabile sunt programe şi sunt recunoscute
prin extensia lor care poate fi EXE sau COM, altele fiind constituite
în fişiere de comenzi proprii sistemului de operare, a căror extensie
este BAT.
Fişierele COM, numite adesea şi comenzi, conţin informaţii în
formatul imagine de memorie. Ele sunt mai compacte şi mai rapide
decât fişierele EXE, dar lungimea lor nu poate să depăşească 64 K.
Fişierele EXE pot să ajungă la dimensiuni mai mari prin segmentarea
programului în fragmente a căror dimensiune să fie de maximum 64K.
Dintre fişierele neexecutabile vom aminti câteva mai
importante:
• fişiere text ;
• fişiere cu extensia SYS sau DRV, cunoscute sub numele de
driver-e şi care conţin instrucţiuni despre modul în care
18
25. sistemul de operare trebuie să controleze diferite componente
hardware;
• surse de programe scrise în diferite limbaje (cu extensiile PAS
– limbajul Pascal, C – limbajul C, CPP – limbajul C++, etc.);
• fişiere care conţin informaţii intermediare între cele în limbaj
sursă şi cele executabile (extensiile OBJ, OVL);
• fişiere ce conţin imagini (extensiile JPEG, GIF, BMP);
• fişiere ce conţin sunete (extensiile WAV, MIDI, MP3) etc.
1.3.3. Construirea fişierului executabil
Instrucţiunile pe care le execută un calculator sunt de fapt
grupuri de 1 ş 0 (cifre binare) care reprezintă semnale electronice
produse în interiorul calculatorului. Pentru a programa primele
calculatoare (în anii 1940-1950), programatorii trebuiau să înţeleagă
modul în care calculatorul interpreta diferitele combinaţii de 0 şi 1,
deoarece programatorii scriau toate programele folosind cifre binare.
Cum programele deveneau din ce în ce mai mari, acest mod de lucru a
devenit foarte incomod pentru programatori. De aceea au fost create
limbaje de programare care permit exprimarea instrucţiunilor
calculatorului într-o formă mai accesibilă programatorului. După ce
programatorul scrie instrucţiunile într-un fişier - numit fişier sursă, un
al doilea program – numit compilator, converteşte instrucţiunile
limbajului de programare în şirurile 1 şi 0 – cunoscute sub numele de
cod maşină.
Pentru a obţine un program executabil, orice program sursă
trebuie eventual translatat (tradus) în limbaj cod maşină sau cod
obiect pe care îl poate înţelege microprocesorul. În urma acestui
proces, alături de fişierul sursă apare şi fişierul cod obiect (object file.)
Această translatare sau traducere este efectuată de către compilatoare,
interpretoare sau asambloare.
Compilatorul este folosit pentru transformarea codului sursă,
adică a programului scris într-un limbaj de programare de nivel înalt,
în cod obiect (object code). Acest cod obiect va fi transformat în faza
de editare de legături în cod maşină executabil de microprocesorul
sistemului de calcul.
Programatorii scriu programe într-o formă numită cod sursă.
Acest cod sursă parcurge apoi câţiva paşi înainte de a deveni program
executabil.
19
26. Pe scurt, un compilator este un program special care procesează
instrucţiuni scrise într-un limbaj de programare particular şi le
transformă în limbaj maşină sau cod maşină pe care îl poate executa
microprocesorul.
La ora actuală un limbaj de programare este inclus într-un
mediu de programare mai complex care include un editor de texte
pentru introducerea instrucţiunilor în limbajul de programare de nivel
înalt, un compilator şi un editor de legături folosite pentru translatarea
codului sursă în cod maşină.
În mod tipic, un programator scrie declaraţii într-un limbaj
precum Pascal, C sau MATLAB folosind un editor. Se creează astfel
un fişier numit fişier cod sursă ce conţine o colecţie de instrucţiuni şi
declaraţii scrise în limbajul respectiv.
Primul pas este prelucrarea codului sursă de către compilator, care
translatează instrucţiunile de nivel înalt într-o serie de instrucţiuni cod
obiect. Când este lansat în execuţie compilatorul acesta, într-o primă
etapă, lansează un analizor sintactic, gramatical, numit parser. Acesta
parcurge şi analizează sintactic, secvenţial, în ordinea în care au fost
introduse, toate instrucţiunile scrise în limbajul de nivel înalt. O
instrucţiune de nivel înalt se translatează într-una sau mai multe
instrucţiuni specifice microprocesorului pentru care a fost conceput
compilatorul. Aceste instrucţiuni ale microprocesorului sunt înlocuite
cu codurile lor binare, fiecare instrucţiune a microprocesorului fiind
codificată de către constructor. Codurile binare ale instrucţiunilor
microprocesorului împreună cu reprezentările interne ale datelor
manipulate formează codul obiect.
Deci în unul sau mai multe faze (parserul este una dintre faze)
din codul sursă de intrare se produce un cod de ieşire, numit în mod
tradiţional cod obiect. Este foarte important ca referiri la alte module
de cod să fie corect reprezentate în acest cod obiect.
Pasul final în producerea programului executabil, după ce
compilatorul a produs codul obiect, este prelucrarea codului obiect de
către un editor de legături (link-editor sau linker). Acest linker
combină diferitele module (le leagă) şi dă valori reale, efective, tuturor
adreselor simbolice existente în codul obiect. În urma acestei
prelucrări se obţine codul maşină, salvat într-un fişier cu extensia .exe.
Acest cod maşină poate fi executat secvenţial, instrucţiune cu
instrucţiune, de către microprocesor.
20
27. Cu alte cuvinte, un program executabil (executable program -
aflat pe disc cu extensia .exe) se obţine prin salvarea pe disc a codului
maşină obţinut prin prelucrarea succesivă a fişierului cod sursă de
către compilator (compiler) şi apoi de către link-editor (linker).
Fig. 1.5 Procesul de elaborare a unui program executabil
Procesul de obţinere a unui executabil este prezentat în figura
de mai jos. Blocurile tridimensionale reprezintă entităţile principale
ale mediului de programare: editorul de texte, compilatorul (compiler)
şi editorul de legături (linker). Blocurile dreptunghiulare reprezintă
fişierele rezultate în urma aplicării celor trei utilitare de sistem:
în urma utilizării editorului de texte obţinem fişierul text
sursă cod cu numele generic “nume”. Dacă folosim limbajul
de programare C spre exemplu, se obţine fişierul nume.c care
se va salva pe disc.
în urma lansării în execuţie a compilatorului, acesta preia
fişierul sursă şi îl prelucrează corespunzător, semnalizându-se
toate erorile fatale pentru program sau avertismente utile
programatorului în procesul de depanare. În cazul în care
compilarea se efectuează cu succes, se obţine un fişier cod
obiect, salvat pe disc sub numele nume.obj
în urma lansării în execuţie a editorului de legături, se preia
fişierul cod obiect nume.obj şi se leagă cu toate modulele
necesare (inclusiv funcţii de bibliotecă sau alte module
externe), obţinându-se un program executabil (cod maşină) cu
21
28. numele nume.exe la care adresele nu mai sunt simbolice ci
absolute relativ la adresa de început a programului. La
lansarea în execuţie a programului fluxul de informaţie este
complet controlat de către microprocesor, toate salturile de
adresă fiind făcute corespunzător.
Interpretorul (interpreter) este un program care execută
instrucţiuni scrise într-un limbaj de nivel înalt. Numai anumite limbaje
de nivel înalt, spre exemplu BASIC, LISP sau MATLAB, sunt
prevăzute cu un interpretor.
Există două modalităţi de a executa un program scris în limbaj
de nivel înalt. Cel mai comun mod este acela de a compila programul.
Cealaltă modalitate este “pasarea” programului unui interpretor.
Un interpretor translatează instrucţiunile de nivel înalt
într-o formă intermediară care este apoi executată. Prin
contrast, un compilator translatează instrucţiunile de
nivel înalt direct în limbaj maşină (cod maşină).
Programele compilate rulează în general mai rapid
decât cele interpretate. Un alt avantaj al programelor
compilate este acela al desprinderii din context în
sensul că programele executabile generate în urma
procesului de compilare pot fi executate direct sub
sistemul de operare al calculatorului. Un program
interpretat se execută sub mediul în care a fost creat.
Spre exemplu, pentru a rula un program scris în limbajul
BASIC se lansează în execuţie mediul BASIC, apoi se deschide
fişierul sursă-BASIC corespunzător şi se lansează interpretorul de
BASIC pentru execuţia sa.
Avantajul unui interpretor este acela al evitării procesului de
compilare consumator de timp în cazul în care avem programe de mari
dimensiuni. Interpretorul poate executa imediat programele sursă.
Pentru acest motiv interpretoarele se folosesc mai ales în procesul de
dezvoltare al programelor, când programatorul doreşte adăugarea unor
mici porţiuni de program pe care să le testeze rapid. De asemenea,
interpretoarele permit o programare interactivă fiind des folosite în
procesul de instrucţie.
În mediul de programare MATLAB, mediu interpretor, orice
comandă utilizator se execută imediat. Se pot edita şi fişiere script,
care conţin secvenţe de comenzi care se execută secvenţial.
22
29. Programele de descriere a paginii (Page Description Languages)
ca PostScript spre exemplu folosesc un interpretor. Fiecare
imprimantă PostScript are incorporat un interpretor care execută
instrucţiuni PostScript.
Asamblorul (assembler) este un program care face translaţia
unui program scris în limbaj de asamblare (limbaj de nivel scăzut,
corespunzător microprocesorului sistemului de calcul) în limbaj cod
maşină. Putem spune că asamblorul reprezintă pentru limbajul de
asamblare ceea ce reprezintă compilatorul pentru limbajele de nivel
înalt. Cum limbajul de asamblare conţine instrucţiuni mai puţin
complexe decât cele de nivel înalt, asamblorul face practic o
convertire biunivocă între mnemonicele limbajului de asamblare şi
codurile binare corespunzătoare acestor mnemonice (instrucţiuni).
23
30. Instrucţiunile în limbajul
de nivel înalt se introduc
de la tastaturã.
Tot ce se introduce de la
tastaturã este vizibil pe monitor
Editor de texte
(eventual incorporat în mediu)
Fişier text (fişier sursã)
cu extensia adecvatã:
nume.pas (limbaj Pascal)
nume.c (limbaj C)
nume.cpp (limbaj C++)
nume.bas (limbaj BASIC), etc. Fişierul sursã cu numele
“nume” şi extensia
corespunzãtoare se salveazã
din memoria RAM pe harddisk
Compilator
Se compileazã fişierul sursã
Se obţine fişierul cod obiect:
nume.obj
Se salveazã pe harddisk fişierul
nume.obj
Link-editare
(legarea tuturor modulelor necesare)
Se obţine fişierul cod maşinã
(executabil):
nume.exe Se salveazã pe harddisk fişierul
nume.exe
Lansarea în execuţie de cãtre
sistemul de operare
a executabilului nume.exe
Fig. 1.6 Detalierea procesului de generare a unui executabil
Capitolul II
24
31. REPREZENTAREA DATELOR ÎN
CALCULATOR
Se ştie că un calculator numeric prelucrează numere binare.
Acest lucru ţine de suportul fizic de manipulare, transport şi stocare a
datelor interne, mai bine zis este legat de faptul că semnalul fizic
purtător de informaţie este o tensiune continuă cu două valori: una
înaltă (High) şi una joasă (Low). Acestor două valori li se asociază
natural două valori logice: T (true, adevărat) şi F (false, fals) sau cele
două cifre binare1 şi 0.
Tensiune
High=’1’
Low=’0’
timp
Ca urmare a acestei asocieri spunem, prin abuz de limbaj, că un
calculator numeric prelucrează numere binare. Ca şi un număr
zecimal, un număr binar are mai multe cifre binare. Sistemul de
numeraţie binar folosit pentru reprezentarea informaţiei în calculatoare
este un sistem de numeraţie ponderal, întocmai ca sistemul de
numeraţie zecimal.
Reprezentarea naturală a numerelor la nivelul percepţiei umane
este cea zecimală, pe când reprezentarea proprie maşinilor de calcul
este cea binară. De aici rezultă necesitatea compatibilizării sau
interfaţării între aceste două moduri de reprezentare a numerelor. Cum
cele două sisteme de numeraţie sunt ponderale, o primă diferenţă este
aceea că sistemul zecimal foloseşte ca ponderi puterile întregi
(pozitive sau negative) ale lui 10 (zece) iar sistemul binar va folosi
puterile întregi (pozitive sau negative) ale lui 2.
În altă ordine de idei, dacă pentru reprezentarea externă sunt
semnificative simbolurile de reprezentare (cifre, semnele + sau -,
punct zecimal sau binar, mantisă sau exponent), pentru reprezentarea
25
32. internă sunt necesare convenţii de reprezentare: indiferent de tipul
datelor, acestea vor fi colecţii sau şiruri de cifre binare cărora, prin
convenţie, li se atribuie semnificaţii.
Într-o primă instanţă, este foarte important să facem o distincţie
între tipurile de date recunoscute de un calculator (sau mai bine zis de
microprocesorul cu care este dotat calculatorul personal) şi formatele
de reprezentare ale acestor date ce reprezintă convenţii pentru
reprezentarea tipurilor de date, atât la nivel intern (în memoria
calculatorului) cât şi la nivel extern, al percepţiei umane.
Din punctul de vedere al tipurilor de date care sunt
implementate în limbajul C putem spune că distingem două mari
categorii, date de tip întreg (integer) şi date de tip real (float).
Formatele de reprezentare internă/externă vor fi prezentate în cele ce
urmează. Cel mai simplu de reprezentat sunt numerele naturale. Se
face apoi trecerea la numerele întregi negative şi apoi la numerele
reale care au o parte întreagă şi una fracţionară.
2.1. Reprezentarea internă/externă a numerelor
Reprezentarea internă a numerelor se referă la modul în care se
stochează datele în memoria RAM a calculatorului sau în regiştrii
microprocesorului. În acest format se prelucrează numerele pentru
implementarea diverselor operaţii aritmetice. La nivelul calculatorului
informaţia nu poate fi decât binară. În această reprezentare putem scrie
numere întregi pozitive sau negative sau numere reale.
Există un standard IEEE care reglementează modul de
reprezentare internă a datelor.
Reprezentarea externă este reprezentarea numerelor la nivelul
utilizatorului uman, deci în principiu se poate folosi orice bază de
numeraţie pentru reprezentarea numerelor. La nivel de reprezentare
externă se foloseşte semnul “-” în faţa unui număr în cazul în care
acesta este negativ sau punctul care separă partea întreagă de cea
fracţionară. De asemenea, numerele întregi interpretate fără semn se
pot afişa şi în format binar, octal sau hexazecimal, deci în bazele 2, 8
sau 16.
În cele ce urmează ne vom pune următoarele probleme:
- cum se reprezintă extern un număr natural
- cum se reprezintă intern un număr natural
- cum se reprezintă extern un număr întreg negativ
26
33. - cum se reprezintă intern un număr întreg negativ
- cum se face conversia de la reprezentarea externă la cea
internă
- cum se face conversia de la reprezentarea internă la cea
externă
2.2. Reprezentarea externă a numerelor
În ceea ce priveşte reprezentarea externă, nu sunt nici un fel de
dificultăţi deoarece fiecare este familiarizat cu reprezentarea zecimală
a numerelor naturale sau reale. Trebuie menţionat de la început că
orice tip de reprezentare pe care o vom folosi este ponderală în sensul
că poziţia cifrelor în număr nu este întâmplătoare ci conformă cu o
pondere corespunzătoare unei puteri a bazei de numeraţie.
O caracteristică a reprezentărilor externe este folosirea unor
convenţii de format unanim acceptate şi de altfel foarte naturale pentru
un utilizator uman. Spre exemplu, pentru a exprima numere negative
se foloseşte semnul “-” iar pentru reprezentarea numerelor reale se
foloseşte punctul “.” pentru delimitarea părţii întregi de cea
fracţionară. De asemenea, suntem familiarizaţi şi cu notaţia ştiinţifică
în care intervine mantisa şi exponentul (în virgulă mobilă).
Reprezentarea zecimală este cea mai naturală pentru utilizatorul
uman. Vom oferi în continuare câteva exemple de reprezentări
zecimale externe:
Număr Reprezentare Reprezentare
normală ştiinţifică
37 37 0.37x102
-37 -37 -0.37x102
0.375 0.375 0.375x100
-0.375 -0.375 -0.375x100
0.00375 0.00375 0.375x10-2
-0.00375 -0.00375 -0.375x10-2
12.375 12.375 0.12375x102
-12.375 -12.375 -0.12375x102
În general dorim să obţinem rezultatele numerice ale
programelor pe care le concepem într-o formă de reprezentare
accesibilă. Totuşi, calculatorul trebuie informat asupra formatului de
reprezentare în care dorim să se afişeze datele necesare. Aceasta
înseamnă că va trebui să specificăm câte cifre se vor folosi la partea
27
34. întreagă şi câte la partea fracţionară sau dacă dorim reprezentare
ştiinţifică sau nu. De altfel şi operatorul uman face aceleaşi convenţii
1
de reprezentare. Spre exemplu ştim că numărul nu poate fi exact
3
reprezentat ca un număr zecimal, deci fixăm un format de
reprezentare. Dacă formatul ale se limitează la 4 cifre zecimale, atunci
1
vom scrie ≅ 0.3333
3
Limbajul C are o serie de funcţii de reprezentare cu format a
datelor numerice sau alfanumerice prin care programatorul poate
impune un format extern cu care se manipulează datele.
2.2.1. Reprezentarea externă a numerelor întregi
Numerele naturale se pot reprezenta fie în baza de numeraţie
10, fie în orice altă bază.
În general, un număr întreg în baza b se poate reprezenta cu un
număr predeterminat de cifre ci ∈ B = { 0,1,2,....., b − 2, b − 1} .
Mulţimea B reprezintă mulţimea cifrelor sau simbolurilor de
reprezentare. Spre exemplu:
b = 2 ⇒ B = { 0,1}
b = 7 ⇒ B = { 0,1,2,3,4,5,6}
b = 10 ⇒ B = { 0,1,2,3,4,5,6,7,8,9}
Noi suntem obişnuiţi să folosim mulţimea cifrelor zecimale.
Dacă totuşi se foloseşte o bază de reprezentare mai mare decât 10,
atunci mulţimea cifrelor zecimale nu mai este suficientă pentru
reprezentarea numerelor în acea bază. Spre exemplu să considerăm
baza b = 16 care va folosi 16 cifre hexazecimale (sau mai simplu
hexa). Prin convenţie, cele 16 cifre hexazecimale vor fi:
Cifra Simbol Cifra Simbol
0 0 8 8
1 1 9 9
2 2 10 A
3 3 11 B
4 4 12 C
5 5 13 D
6 6 14 E
7 7 15 F
28
35. Forma generală de reprezentare externă a numerelor întregi este
de forma:
N b = ±c n −1c n − 2 ......c 2 c1c 0
c k ∈ B = { 0,1,2,....., b − 2, b − 1}
Valoarea numerică zecimală a numărului N b va fi:
( ) ∑ ck ⋅ b k
n −1
N b = ± c n−1 ⋅ b n −1 + c n − 2 ⋅ b n− 2 + ... + c1 ⋅ b1 + c 0 ⋅ b 0 = ±
k =0
În continuare vom studia următoarele probleme:
- cum se face conversia unui număr din baza b = 10 în baza
b=2
- cum se face conversia inversă, din baza b = 2 în baza b = 10
- cum se face conversia dintr-o bază oarecare b1 în altă bază b2
Pentru a reprezenta un număr natural din baza 10 în baza 2, se
împarte succesiv numărul la 2 şi se utilizează resturile la aceste
împărţiri în ordinea inversă de cum au fost obţinute.
a) Conversia din baza 10 în baza 2 şi invers
Fie de exemplu numărul zecimal 37. Reprezentarea sa binară va fi
obţinută astfel:
3710 = 1001012
37 2
36 18 2
1 18 9 2
0 8 4 2
1 4 2 2
0 2 1
0
Conversia inversă, din baza 2 în baza 10 este simplă şi
utilizează ponderea 2:
25 24 23 22 21 20
1001012 = 1 0 0 1 0 1 = 1x25 + 1x22 + 1x20=37
Cu aceste numere naturale putem face o serie de operaţii
aritmetice. Adunarea numerelor naturale binare se face întocmai ca la
cele în reprezentare în baza 10, după regula:
0+0=0
29
36. 0+1=1
1+0=1
1+1=0, transport 1 spre rangul următor
Astfel, să facem adunarea 37+25 în binar:
37 1 0 0 1 0 1+
25 11001
62 111110
Se observă cum se obţine rezultatul corect.
Înmulţirea se face în mod asemănător, ca o adunare repetată.
Spre exemplu, să calculăm 37x25
37 1 0 0 1 0 1x
25 11001
100101
100101
100101
925 1110 011101
11100111012 = 1x20 + 1x22 + 1x23 +1x24 +1x27 +1x28+1x29 =
1+4+8+16+128+256+512 = 92510
b) Conversia dintr-o bază oarecare b1 într-o altă bază b2 .
Fie spre exemplu numărul 4911 care se doreşte scris în baza 13.
Pentru a realiza această conversie, vom folosi baza intermediară 10.
Vom converti mai întâi 4A11 în baza 10 şi apoi numărul zecimal
obţinut îl vom trece în baza 13. Se observă cum un număr în baza 11
poate conţine şi cifra A=10 iar un număr în baza 13 poate conţine
cifrele A=10, B=11, C=12.
4 A11 = 10 ⋅110 + 4 ⋅111 = 44 + 10 = 5410
54 13
52 4 13
2 0 0
4
5310 = 4213
4 A11 = 4213
30
37. 2.2.2. Reprezentarea externă a numerelor reale
Semnificativă pentru utilizatorul uman este reprezentarea
zecimală (în baza b=10) a numerelor reale, cu care suntem obişnuiţi.
Faţă de reprezentarea numerelor întregi, la numerele reale intervine
simbolul punct “.” care delimitează partea întreagă de partea
fracţionară. Cu alte cuvinte, cu ajutorul numerelor reale putem
reprezenta şi numere care nu sunt întregi. Forma generală a unui
număr real reprezentat într-o bază oarecare b este:
N b = ±c n −1c n − 2 ...c1c 0 • c −1c − 2 ...c − m +1c − m
c k ∈ B = { 0,1,2,..., b − 2, b − 1}
Valoarea zecimală a numărului de mai sus va fi:
( ) ∑ ck ⋅ b k
n− 1
N10 = ± cn − 1b n − 1 + cn − 2b n − 2 + c1b1 + c0b 0 + c− 1b − 1 + c− 2 ⋅ b − 2 + c− m + 1b − m + 1 + c− m b − m = ±
k= −m
Se observă cum punctul delimitează partea întreagă (exprimată
printr-o combinaţie de puteri pozitive ale bazei b) şi partea fracţionară
(exprimată printr-o combinaţie de puteri negative ale bazei b).
Semnificaţie pentru programator şi pentru producătorii de
software sau microprocesoare au bazele de reprezentare b = 10 şi
b = 2 , deoarece baza 10 este naturală pentru reprezentarea externă a
numerelor iar baza 2 este naturală pentru reprezentarea binară, internă,
a numerelor.
În formulele de mai sus avem o reprezentare a unui număr real
cu n cifre pentru partea întreagă şi m cifre pentru partea fracţionară.
Aşa cum în sistemul zecimal reprezentăm cu un număr finit de
cifre zecimale numerele reale, acelaşi lucru se va întâmpla şi în
sistemul binar. Punctul binar va avea o semnificaţie asemănătoare cu
punctul zecimal, care face separarea între partea întreagă şi cea
fracţionară. Cifrele binare situate după punctul binar vor corespunde
puterilor negative ale lui 2.
Astfel, în general, un număr real va avea reprezentarea binară:
(
N 2 = ± bm bm− 1...b1b0 .b− 1b− 2 ...b− n = bm 2 m + bm− 1 2 m− 1 + b1 21 + b0 20 + b− 1 2 − 1 + b− 2 2 − 2 + ... + b− n 2 − n )
Spre exemplu, numărul 12.25 va avea reprezentarea binară:
12.2510 = 1100.01 = 2 3 + 2 2 + 2 −2
31
38. Partea întreagă a unui număr real se reprezintă binar precum
numerele întregi (cu sau fără semn). Pentru a determina partea
fracţionară, se procedează în mod invers ca la partea întreagă.
Astfel, dacă partea fracţionară zecimală se reprezintă binar,
atunci aceasta se înmulţeşte succesiv cu 2. Dacă rezultatul depăşeşte
valoarea 1, atunci se înscrie un bit 1. Se continuă mai departe cu
dublarea valorii care depăşeşte 1. Dacă rezultatul nu depăşeşte
valoarea 1, atunci se înscrie un bit 0 şi se continuă multiplicarea cu 2.
Spre exemplificare, vom vedea cum se obţine reprezentarea binară a
lui 12.25. Partea întreagă este 12. Ea se reprezintă binar prin împărţiri
succesive la 2 şi considerarea resturilor. Partea fracţionară este 0.25
Partea P.F. x 2 Noua Bitul
fracţionară P.F. înscris
P.F.
0.25 0.5 0
0.5 1 0 1
0
Obţinem exact rezultatul căutat: 12.25 = 1100.01
Să mai considerăm un alt exemplu. Să reprezentăm numărul 5.37
Partea întreagă are reprezentarea 510 =1012
Partea P.F. x 2 Noua Bitul
fracţionară P.F. P.F. înscris
0.37 0.74 0.74 0
0.74 1.48 0.48 1
0.48 0.96 0.96 0
0.96 1.92 0.92 1
0.92 1.84 0.84 1
0.84 1.68 0.68 1
0.68 1.36 0.36 1
0.36 0.72 0.72 0
0.72 1.44 0.44 1
Etc.. Etc..
Obţinem: 5.3710 = 101.010111101...2
Cu cât mai multe cifre binare vom reţine după punctul binar, cu atât
vom fi mai aproape de valoarea exactă 5.37.
Obţinem un rezultat foarte important: Deşi un număr zecimal
poate avea un număr finit de cifre zecimale după punctul zecimal,
reprezentarea sa binară internă poate avea un număr infinit de cifre
binare. Este valabilă şi reciproca: un număr real zecimal cu un
32
39. număr infinit de cifre se poate reprezenta într-o altă bază pe un
1
număr finit de cifre ( ex: = 0.3333...3...10 = 0.13 ). Cum orice
3
reprezentare binară internă este pe un număr finit de biţi, numărul
poate să nu fie reprezentat exact în calculator, ci cu o anumită
aproximaţie. Acest lucru este decisiv pentru a înţelege importanţa
lungimii reprezentării numerelor în calculator. Cu cât un număr binar
se reprezintă pe un număr mai mare de biţi, cu atât precizia de
reprezentare creşte.
2.3 Reprezentarea internă a numerelor
Deoarece semnalul intern purtător de informaţie într-un
calculator este de tip binar, un număr zecimal (întreg sau real) se va
reprezenta intern în baza 2 cu ajutorul unui număr binar. O cifră binară
se numeşte bit (Binary Digit) şi poate fi fie 0 fie 1.
În reprezentarea externă a numerelor am văzut că se poate folosi
orice bază de numeraţie (cu cifrele corespunzătoare). De asemenea,
numerele pot fi prefixate cu un simbol de semn ± şi pot include în
reprezentare şi punctul de separaţie între partea întreagă şi cea
fracţionară.
În reprezentarea internă acest lucru nu mai este posibil deoarece
semnele plus (+), minus (-) sau punct (.) nu au nici o semnificaţie
pentru calculator. Orice număr (orice tip de dată) este reprezentat la
nivel intern de un număr prestabilit de biţi. Specialiştii din industria
software au ajuns la un consens de reprezentare concretizat prin
standardul IEEE 754 de reprezentare a internă a numerelor reale în
computere.
Reprezentarea internă a numerelor a impus în limbajul C
definirea aşa-numitelor tipuri de date.
Tipul unei date reprezintă modul în care microprocesorul
stochează în memorie şi prelucrează cu ajutorul regiştrilor interni o
dată. Tipul unei date se referă la lungimea sa de reprezentare (pe câţi
biţi se reprezintă data) precum şi ce semnificaţie au anumite câmpuri
de biţi din cadrul reprezentării.
2.3.1. Reprezentarea internă a numerelor întregi
33
40. Un număr binar este o colecţie de cifre binare ponderate fiecare
cu o putere a lui 2. Bitul corespunzător ponderii celei mai mari, situat
cel mai în stânga, se numeşte MSB (Most Significand Bit) iar cel
corespunzător ponderii celei mai mici, situat cel mai în dreapta, se
numeşte LSB (Less Significand Bit). În cazul reprezentării binare a
numerelor naturale, reprezentarea externă (cea percepută de operatorul
uman) şi cea internă (cea prelucrată de procesorul calculatorului) sunt
asemănătoare. Cum pentru operatorul uman operatorii ‘+’ sau ‘-‘
semnifică faptul că un număr este pozitiv sau negativ, este necesară o
convenţie pentru reprezentarea internă a numerelor întregi negative.
Această convenţie prevede folosirea MSB pentru reprezentarea
semnului numerelor întregi. Dacă numărul este pozitiv, se adaugă în
poziţia MSB bitul de semn ‘0’, iar dacă numărul este negativ se
utilizează în poziţia MSB bitul de semn ‘1’. Mai mult, numerele
negative se reprezintă în aşa numitul complement faţă de 2.
Reprezentarea numerelor întregi negative în complement faţă de 2
Această formă de reprezentare a numerelor negative necesită
parcurgerea următorilor paşi:
pas1. Se reprezintă modulul numărului negativ, folosind bit de
semn (egal cu 0, evident)
pas2. Se complementează toţi biţii numărului astfel obţinut.
Complementarea înseamnă transformarea bitului 0 în
bitul 1 şi a bitului 1 în bitul 0.
pas3. Numărul astfel obţinut se adună cu 1.
De exemplu, să reprezentăm numărul -37.
3710 = 1001012 = [ 0] 100101
pas1. |-37| = 37 bit
semn
pas2. 0100101---->1011010
pas3. 1011010 + 1 = 1011011 => -3710 = 10110112
Evident, MSB este bitul de semn şi este egal cu 1.
La o primă vedere, este posibil să credem că prin utilizarea
complementului faţă de 2 putem pierde semnificaţia numărului
negativ. Pentru a vedea ce număr negativ este reprezentat, putem
repeta procedeul de mai sus şi obţinem reprezentarea numărului
pozitiv dat de modulul său.
O modalitate mai simplă este alocarea ponderii corespunzătoare
bitului de semn dar pe care o considerăm că reprezintă un număr
negativ. Astfel:
34
41. 10110112 = -1x26 + 1x24 + 1x23 + 1x21 + 1x20 = -64 + 27 = -37
2.3.2 Adunarea, scăderea şi înmulţirea numerelor întregi
Aceste operaţii se execută folosind reprezentarea în
complement faţă de 2 a numerelor întregi, sau, mai bine zis, se execută
folosind în algoritmi bitul de semn ca pe un bit obişnuit.
De exemplu, dorim să calculăm:
37-25
25-37
(-25)x37
(-25)x(-37)
Pentru efectuarea acestor calcule, vom scrie reprezentările cu
bit de semn ale numerelor implicate:
2510 = 110012 = 011001
− 25 = 100111
10 2
3710 = 1001012 = 0100101
− 3710 = 1011011
Se observă că 25 şi (-25) se reprezintă pe 6 biţi iar 37 şi (-37) pe
7 biţi.
Deoarece am observat că biţii unui întreg cu semn nu au toţi
aceeaşi semnificaţie, este nevoie să reprezentăm numerele cu care
lucrăm pe un acelaşi număr de biţi. La adunări sau scăderi, biţii de
semn se vor afla în aceeaşi poziţie (vor avea aceeaşi pondere) şi vom
obţine astfel rezultate corecte. Pentru a avea o scriere pe un acelaşi
număr de biţi, se adaugă (completează) la stânga bitul de semn de un
număr corespunzător de ori. Astfel:
37 − 25 = 37 + (−25) = 0100101 + 1100111
0100101 +
− 2510 = 1001112 = 1100111
1100111
25 = 0110012 = 0011001 −−−−−−
0001100 = 1210
35
42. 25 − 37 = 25 + (−37) = 0011001 + 1011011
0011001 +
− 37 = 1011011
1011011
25 = 0110012 = 0011001
−−−−−−
1110100 = −64 + 52 = −12
În continuare vom pune în evidenţă importanţa gamei de
reprezentare, adică a domeniului de valori ale datelor. Să considerăm,
spre exemplu, adunarea a două numere cu semn reprezentate pe un
octet (8 biţi). Aceste numere sunt cuprinse în gama
[− 2 , 2 − 1]
7 7
= [ − 128, 127] .
Dacă vom dori să adunăm două numere din acest domeniu şi să
reprezentăm rezultatul tot pe un octet, putem avea surprize. De
exemplu, să considerăm operaţiile (117-12) şi (117+12). Se observă că
operanzii sunt în gama de reprezentare a numerelor cu semn pe 8 biţi.
Prin prima scădere, ne aşteptăm să obţinem un rezultat, 105, în aceeaşi
gamă de reprezentare.
117-12=117+(-12) = 01110101+11110100 = 01101001 = 10510,
rezultat corect.
117+12 = 01110101+00001100 = 10000001 = -12710,
rezultat evident incorect.
Incorectitudinea provine de la faptul că rezultatul a depăşit
gama de reprezentare. Dacă rezultatul este interpretat pe 9 biţi de
exemplu, gama de reprezentare devine [ − 256, 255] şi rezultatul va fi
117+12 = 001110101+000001100 = 010000001 = 12910, rezultat
corect.
Ca o concluzie preliminară, reţinem că pentru a obţine
rezultate corecte este necesar să precizăm dacă se lucrează sau nu cu
bit de semn şi pe câţi biţi se face reprezentarea, pentru că numai în
acest context interpretarea rezultatelor este corectă.
În ceea ce priveşte înmulţirea numerelor întregi cu semn (cu bit
de semn), aici problema nu mai are o rezolvare asemănătoare, în
sensul că nu putem trata biţii de semn la fel cu cei de reprezentare ai
valorii. Astfel, procesorul studiază biţii de semn şi ia o decizie în
privinţa semnului rezultatului. De fapt, se realizează funcţia logică
XOR a biţilor de semn. Numerele negative se vor lua în modul, iar
operaţiile de înmulţire se vor face numai cu numere pozitive. La final,
36
43. funcţie de semnul rezultatului, se ia decizia reprezentării corecte a
rezultatului.
Spre exemplu, să calculăm (-25)x37. Pentru aceasta, procesorul
va primi pentru procesare următoarele două numere:
37 x(−25) = [ 0]100101 × [1]100111
Se analizează separat biţii de semn şi se ia decizia că rezultatul va fi
negativ, deci, la final, se va reprezenta în complement faţă de 2. Mai
departe se va lucra cu 25, modulul numărului (-25), care se obţine prin
complementarea faţă de 2 a numărului binar 1100111:
11001110011000+1=0011001
Se va reţine pentru procesare numai numărul (fără semn) 11001, care
se va înmulţi cu numărul (fără semn) 100101, obţinând, aşa cum am
arătat mai sus, valoarea 1110011101. Mai departe, se adaugă bitul de
semn, 0 pentru numere pozitive, obţinându-se 01110011101. Acest
ultim număr se va complementa faţă de 2, obţinându-se
10001100010+1=[1]0001100011, adică valoarea -1024+99 = -925,
valoarea corectă.
Ca o concluzie, pentru a furniza rezultate corecte, procesorul va
trebui informat în permanenţă despre ce fel de numere prelucrează (cu
sau fără semn) şi care este lungimea lor de reprezentare (toate trebuie
să aibă aceeaşi lungime).
Reprezentarea în complement faţă de 2 se poate folosi şi pentru
numerele reale negative, bitul de semn fiind MSB de la partea
întreagă. Astfel, -12.25 poate avea reprezentarea:
12.2510 = 1100.012 → 01100.01
01100.01 → 10011.10 + 0.01 = 10011.11
10011.112 = −2 4 + 21 + 2 0 + 2 −1 + 2 −2 = −16 + 3 + 0.75 = −12.2510
Pentru înmulţirea numerelor reale rămân valabile considerentele
de la numere întregi.
În cazul de mai sus, problema reprezentării numărului negativ a
fost rezolvată cu ajutorul bitului de semn dar problema reprezentării
punctului binar va avea altă rezolvare.
2.3.3 Reprezentarea internă a numerelor reale
Din considerentele de la reprezentarea externă a datelor putem
trage alte concluzii importante din punct de vedere al reprezentării
37