Sunteți pe pagina 1din 11

1.

Noţiuni introductive, definiţii, clasificări


1.1. Componenta firmware a unui sistem de calcul

1.2. Componenta software a unui sistem de calcul

1.3. Sistemul de programare al unui sistem de calcul

1. Noţiuni introductive, definiţii, clasificări


Un sistem de calcul constituie un ansamblu funcţional destinat prelucrării
automate a datelor. Pentru realizarea acestui obiectiv, sistemul de calcul are
nevoie atât de echipamentele care intră în alcătuirea sa (componentele hardware
ale sistemului), cât şi de un set de programe care determină prelucrările care se
fac asupra datelor, prin intermediul componentelor fizice ale sistemului de
calcul .

Conform celei mai generale clasificări, componentele unui sistem de calcul


aparţin uneia dintre următoarele categorii:

 hardware-ul, care reprezintă componenta fizică a unui sistem de calcul,


adică ansamblul de echipamente care alcătuiesc sistemul de calcul;
 software-ul, care reprezintă ansamblul de programe care fac posibilă
realizarea funcţiei sistemului de calcul de prelucrare a datelor şi care
constituie suportul logic de funcţionare al sistemului de calcul ;
 firmware-ul, care este componenta de programe încărcate în memoria
fixă ROM (Read Only Memory) de către producătorul sistemului de
calcul ; această componentă se află la limita dintre hardware şi software,
reprezentând partea de software integrat în hardware, prin metoda
microprogramării.

1.1. Componenta firmware a unui sistem de calcul

Setul de instrucţiuni microprogramate încărcate în memoria permanentă ROM


defineşte un anumit mod de funcţionare şi, implicit, de utilizare a sistemului de
calcul; din acest motiv, el trebuie să fie suficient de redus, pentru a nu
particulariza excesiv sistemul de calcul.
Prin utilizarea unor memorii cu citire/scriere nevolatile (memorie RAM
nevolatilă) alături de memoria ROM, se obţin componente cu microprogramare
dinamică, ce oferă un anumit grad de adaptabilitate secvenţei microprogramate:
se poate modifica secvenţa microprogramată prin modificarea unor parametri
memoraţi în memoria RAM ataşată.

Exemplu : componenta ROM-BIOS (Basic Input/Output System) a sistemelor


de calcul compatibile PC este o componentă firmware, realizată prin
microprogramare dinamică.

Rolul componentei BIOS este de interfaţă între hardware şi software, oferind


componentei software funcţiile de bază pentru utilizarea hardware-ului ; în felul
acesta este realizată o independenţă a componentelor software faţă de
caracteristicile hardware specifice ale sistemului de calcul, eliberând, în acelaşi
timp, componentele software de detaliile legate de modul de lucru al hardware-
ului.

Fiind realizată prin microprogramare dinamică, permite modificarea unor


parametri de funcţionare ai PC-ului într-o secvenţă specială derulată în timpul
procedurii de încărcare a sistemului de operare, la pornirea sistemului de calcul.

1.2. Componenta software a unui sistem de calcul

Componenta software a unui sistem de calcul cuprinde, la rândul ei, programe


grupate în mai multe categorii, după natura problemelor pe care le rezolvă.

Aceste categorii sunt :

a. Software de bază, alcătuit din programele care asigură servicii generale,


care se adresează tuturor utilizatorilor sistemului de calcul.

Software-ul de bază reprezintă totalitatea programelor care fac posibilă


funcţionarea şi utilizarea unui sistem de calcul. El include programe
ierarhizate, după natura problemelor pe care le rezolvă şi după
importanţa lor, pe următoarele paliere :

1. Sistemul de operare (SO) , care acţionează ca o interfaţă între


sistemul de calcul şi utilizator. Sistemul de operare are rolul de a
coordona şi supraveghea funcţionarea sistemului de calcul şi de a
realiza comunicarea între utilizator şi sistemul de calcul.
2. Sistemul de programare cuprinde componentele software care
permit utilizatorilor să realizeze programe executabile în sistemul
de calcul. Sistemul de programare cuprinde pachete de programe
dedicate, specifice fiecărui limbaj de programare folosit de
utilizator.
b. Sistemul de programe utilitare (software utilitar), care include
programe cu un grad mare de generalitate, puse la dispoziţia
utilizatorilor pentru a realiza anumite prelucrări specifice asupra
informaţiilor, prelucrări comune pentru toţi utilizatorii unui sistem de
calcul.

De exemplu :

 programe care permit exploatarea componentelor hardware ale


sistemului de calcul în condiţii optime ; aceste programe pot realiza
verificarea stării de funcţionare a echipamentelor hardware, configurarea
parametrilor lor de funcţionare, optimizarea modului de utilizare a
componentelor hardware ale sistemului de calcul ;
 programe pentru organizarea informaţiei pe suporturile de date :
programe de arhivare a datelor, programe pentru gestionarea
bibliotecilor de date, programe pentru organizarea datelor prin operaţii
de sortare, interclasare, compactare, programe pentru realizarea
conversiilor de suport, etc.
 programe editoare de texte: programe interactive destinate introducerii,
modificării, formatării şi tipăririi textelor;
 medii de prelucrare complexă a datelor organizate sub formă de text,
imagine, sunet sau sub formă de tabele ; aceste instrumente software pot
fi folosite direct de utilizatori neprofesionişti, pentru dezvoltarea unor
aplicaţii, sau pot fi folosite de proiectanţii de software, ca instrumente de
mare productivitate.
 suprafeţe de operare : aplicaţii specifice sistemelor interactive, care
înlocuiesc dialogul utilizatorului cu sistemul, prin intermediul limbajului
de comandă al sistemului de operare, cu interfeţe de lucru
« prietenoase », etc.

c. Software de aplicaţie, constituit din programe dedicate ale utilizatorilor,


care rezolvă probleme cu un nivel redus de generalizare (probleme
specifice fiecărui utilizator).
1.3. Sistemul de programare al unui sistem de calcul

Aşa cum am văzut, un sistem de calcul reprezintă un ansamblu funcţional


destinat prelucrării automate a informaţiei.

Prelucrarea automată a informaţiei se face conform unui algoritm. Algoritmul


de prelucrare descrie conţinutul şi succesiunea tuturor etapelor ce trebuiesc
parcurse în timpul procesului de prelucrare. Pentru a putea fi utilizat în scopul
unei prelucrări automate a informaţiei, într-un sistem de calcul, un algoritm
trebuie să aibă câteva proprietăţi esenţiale :

 generalitatea, proprietate ce reprezintă capacitatea algoritmului de a


descrie modul de rezolvare a unui anumit tip de problemă ;
 universalitatea: odată definit modul de rezolvare, algoritmul trebuie să
fie aplicabil, indiferent de setul de date pe care le prelucrează ;
 finitudinea garantează faptul că execuţia algoritmului se încheie, după
un număr finit de paşi, indiferent de setul de date care sunt prelucrate ;
 completitudinea este proprietatea care asigură faptul că algoritmul
rezolvă integral problema abordată : nu există variante ale prelucrării
netratate ;
 proprietăţi care definesc modalitatea de descriere a algoritmului, de
exemplu : concizia, claritatea şi rigurozitatea definirii acestuia ;
 executabilitatea este proprietatea algoritmului de a descrie prelucrările
numai prin intermediul unor operaţii care pot fi executate în sistemul de
calcul ;
 eficienţa algoritmului măsoară gradul în care executarea acestuia se
realizează în timp minim şi, în general, cu un consum cât mai redus de
resurse.

Un algoritm se codifică în secvenţe de instrucţiuni care alcătuiesc un program.


Instrucţiunile descriu codificat prelucrările automate care vor fi realizate asupra
informaţiilor, conform algoritmului de prelucrare. Codificarea prelucrărilor se
face prin intermediul unui limbaj de programare.

Limbajele de programare pot realiza codificarea prelucrărilor într-o manieră


mai apropiată de limbajul uman sau de limbajul domeniului modelat, fapt ce
uşurează utilizarea lor de către programatori ; în acelaşi scop, astfel de limbaje
de programare permit descrierea, la nivelul unei instrucţiuni, a unor prelucrări
complexe asupra datelor. Astfel de limbaje de programare se numesc limbaje
de programare de nivel înalt.
La polul opus sunt acele limbaje de programare ale căror instrucţiuni sunt mai
apropiate de forma în care ele pot fi interpretate de componentele sistemului de
calcul, pentru a fi executate ; acestea sunt limbajele de programare de nivel
scăzut, care folosesc o codificare mult mai abstractă, pentru a defini prelucrări,
de obicei elementare, asupra datelor.

Limbajul de programare cu cel mai mare grad de abstractizare, al cărui


instrucţiuni pot fi direct interpretate şi executate de sistemul de calcul se
numeşte limbaj maşină sau cod maşină. Limbajul maşină este propriu fiecărui
tip de sistem de calcul ; el cuprinde un set restrâns de instrucţiuni elementare,
de forma unor şiruri binare de lungime dată, corelată cu lungimea cuvântului de
memorie a sistemului. Complexitatea limbajului maşină al unui sistem de
calcul determină complexitatea circuitelor electronice necesare interpretării
instrucţiunilor sale, ce alcătuiesc unitatea de comandă şi de prelucrare a
sistemului de calcul.

Un alt tip de limbaj de nivel scăzut, mai puţin abstract decât codul maşină dar
puternic dependent de acesta este limbajul de asamblare. Instrucţiunile unui
limbaj de asamblare sunt definite prin nume care codifică operaţii elementare,
numite mnemonice, iar operanzii sunt definiţi, nu prin adrese, ci prin
identificatori.

Un program scris în limbaj maşină şi care este apt de a fi executat în sistemul


de calcul se numeşte program executabil. De obicei, programele nu sunt scrise
în limbaj maşină, ci într-un limbaj de programare de nivel înalt ; în acest caz,
programele se numesc programe sursă ; transformarea unui program sursă în
program executabil se realizează automat, prin intermediul unor programe care
sunt incluse în componenta software care defineşte sistemul de programare.

Sistemul de programare cuprinde acele instrumente software (programe sau


pachete de programe) care fac posibilă generarea programelor executabile în
sistemul de calcul. El poate fi alcătuit din următoarele categorii de software :

 programele editoare de text care permit introducerea şi modificarea


interactivă a informaţiei (de exemplu, a programelor sursă); aceste
programe editoare trebuie să aibă caracteristica WYSIWYG (What You
See Is What You Get) adică să nu introducă automat caractere
suplimentare în programul sursă editat ;
 programele translatoare pentru limbajele de programare, care
transformă programele sursă, scrise într-un limbaj de programare, în
programe obiect, scrise în limbaj maşină, prin operaţia de translatare
(traducere sau compilare). După natura transformării pe care o
realizează, programele translatoare pot fi :
o programe compilative, care realizează transformarea
programului sursă în program obiect ; acestă categorie de
programe include :
 programele asambloare, care traduc programe sursă scrise
într-un limbaj de asamblare
 programele compilatoare specifice fiecărui limbaj de
programare de nivel înalt ;
o programe interpretative, care, odată cu compilarea programului
sursă, realizează şi execuţia acestuia, instrucţiune cu instrucţiune ;
 programele editoare de legături, care transformă programele din
format obiect în programe executabile, realizând, dacă este cazul,
integrarea mai multor module obiect într-un singur program executabil ;
 programele depanatoare, interactive sau nu, care permit monitorizarea
execuţiei unui program în vederea localizării erorilor de execuţie ;
 mediile de programare, care reprezintă aplicaţii mai complexe, care
includ toate funcţiile prezentate mai sus, utilizate pentru generarea unui
program executabil.

Activitatea de compilare a unui program sursă poate fi descompusă în mai


multe faze, care corespunde, fiecare, unei funcţii logice asigurate de programul
translator, şi care asigură următoarele operaţii :

o analiza lexicală a programului sursă se realizează la nivelul


fiecărei linii program şi constă în :
 eliminarea caracterelor nesemnificative (de exemplu
spaţiile, comentariile, etc)
 identificarea unităţilor logice ale limbajului de programare,
de tipul operatorilor, cuvintelor rezervate, identificatorilor,
constantelor, etc. şi înscrierea acestora în structuri tabelare
numite tabele de simboluri ;
o analiza sintactică are ca obiectiv principal identificarea, în
programul sursă, a construcţiilor sintactice de bază (instrucţiuni,
expresii, liste, etc.) şi interpretarea conţinutului lor, prin generarea
unor structuri proprii de descriere a fiecăreia, prin intermediul
unei structuri arborescente, numită arbore de derivare ;
o analiza semantică ce are ca obiectiv interpretarea fiecărei
construcţii sintactice identificate ; pe baza arborelui de derivare
definit şi folosind tabela de simboluri, se generează seturile de
instrucţiuni elementare care corespund fiecărei construcţii
sintactice identificate ; aceste instrucţiuni sunt formulate într-un
format de trecere către codul maşină, numit cod intermediar, dar
încă sunt independente de acesta ;
o optimizarea codului intermediar, prin înlăturarea variabilelor
neutilizate, a instrucţiunilor redundante, etc ;
o alocarea memoriei, pentru entităţile din programul sursă care vor
fi încărcate în memoria internă, în timpul execuţiei programului ;
alocarea se face utilizând tabela de simboluri şi asociind la fiecare
astfel de entitate o locaţie de memorie, calculată relativ la adresa
de început a programului şi denumită adresă relocabilă ;
o optimizarea dependentă de calculator a codului intermediar,
prin alocarea regiştrilor de lucru ai procesorului şi generarea
codului obiect sunt operaţii care depind de calculator ;
o în toate etapele are loc detectarea şi înregistrarea erorilor de
utilizare a limbajului de programare, erori numite erori de
compilare.

Componentele programului compilator care definesc faze ce nu depind de


calculator reprezintă componenta portabilă a acestuia. Portabilitatea este
proprietatea unei componente software de a funcţiona, independent de
platforma de calcul folosită (sistemul de calcul, sistemul de operare, etc.).
Portabilitatea unui program compilator determină independenţa programelor
care folosesc limbajul de programare respectiv, faţă de sistemul de calcul : este
suficient ca în sistemul respectiv să fie implementată o variantă a
compilatorului.

Prin urmare, compilatoarele sunt, în mare măsură, programe independente de


sistemul de calcul şi, prin implementarea lor pe diverse platforme, permit
definirea de programe portabile.

Asambloarele sunt dependente de sistemul de calcul, pentru că traduc un limbaj


dependent de sistemul de calcul.

Fiind mai puţin complex, asamblorul este un program de dimensiuni mai reduse
decât un compilator sau un interpretor.

Interpretoarele au dezavantajul că translatarea se realizează repetat, pentru


fiecare execuţie a programului scris în limbaj interpretativ. Pentru unele
translatoare interpretative s-a dezvoltat funcţia care generează programul
executabil corespunzător unui program sursă ; în acest caz, sunt înglobate, în
programul executabil generat, toate funcţiile programului interpretor care sunt
utilizate pentru executarea fiecărei linii din programul sursă ; din acest motiv,
programul executabil obţinut are dimensiuni foarte mari.

Structurarea programelor sursă se poate realiza pe trei niveluri ierarhice :

o secţiunea
o segmentul
o programul.

Secţiunea reprezintă unitatea de program independentă, constituită dintr-o


secvenţă de date, care include definiţii pentru datele utilizate, şi o secvenţă de
instrucţiuni, grupate în proceduri. Atât datele cât şi procedurile definite pot fi
utilizate şi în afara secţiunii în care au fost definite, dacă există un mecanism
care să permită schimbul de informaţii între secţiuni.

Datele sau procedurile care pot fi utilizate în afara secţiunii în care sunt definite
sunt numite simboluri externe ; ele se caracterizează printr-un nume şi o
adresă relativă la începutul secţiunii în care sunt definite.

Pentru a permite schimbul de informaţii între secţiuni, este generat, la


compilarea fiecărei secţiuni, dicţionarul de legături, care conţine toate
elementele de comunicaţie între secţiunea respectivă şi alte secţiuni. Elementele
de comunicaţie pot fi :

o definiţii de simboluri declarate externe


o apeluri la simboluri externe.

Avantajul utilizării secţiunilor este că, fiind unităţi de program independente,


pot fi scrise de programatori diferiţi şi pot fi compilate separat, generându-se
module obiect.

Editorul de legături grupează mai multe module obiect (rezultate în urma


compilării sau preluate din biblioteci de module obiect) şi generează
segmentele programului executabil.

Segmentul reprezintă o colecţie ordonată de secţiuni, între care au fost


rezolvate legăturile definite prin elementele de comunicaţie. Un segment se
caracterizează prin nume, o adresă de intrare în segment, adică adresa primei
instrucţiuni executabile a segmentului, şi modulele obiect care îl alcătuiesc.

Pentru realizarea unui segment, editorul de legături îndeplineşte


funcţiile următoare:
o realizează definirea completă a dicţionarului de legături a fiecărei
secţiuni : pentru fiecare simbol extern apelat, verifică existenţa
unei intrări într-un dicţionar de legături, şi completează
dicţionarul de legături cu adresa acestuia ;
o alocă o zonă contiguă de memorie pentru segment, prin alocarea
de locaţii succesive de memorie tuturor secţiunilor care îl
alcătuiesc; pe baza acestei alocări se determină adresele de
încărcare a secţiunilor în memorie, relativ la adresa 0 de încărcare
a segmentului ;
o relocatează adresele ataşate simbolurilor externe, prin adunarea la
aceste adrese a adresei de încărcare a secţiunii în care sunt
definite.

Pentru programul executabil se poate defini o structură arborescentă de


segmente, dintre care unul este segmentul principal, numit rădăcină, iar
celelalte segmente sunt subordonate rădăcinii şi, eventual, unele faţă de altele.
Raportul de subordonare este determinat de ordinea de înlănţuire, în execuţie, a
segmentelor; segmentele de pe acelaşi nivel sunt cele între care nu sunt definite
elemente de comunicare; acestea se pot reacoperi în memoria internă, în timpul
execuţiei programului, sau se pot executa în paralel.

Segmentarea programului este procedeul de împărţire a unui program în


segmente, astfel încât să fie posibil ca în timpul execuţiei programului să fie
încărcat permanent, în memoria internă, numai segmentul rădăcină, segmentele
subordonate putând să fie încărcate pe rând, prin reacoperirea segmentelor între
care nu există raporturi de subordonare, sau să fie executate în paralel.

Pentru aceasta, odată cu generarea programului executabil, editorul de legături


construieşte şi tabela de legături asociată, în care sunt memorate informaţii
despre :

o numele segmentului rădăcină şi a celorlalte segmente


o adresele segmentelor, în programul executabil, relativ la adresa 0
de memorare a programului executabil
o lungimea fiecărui segment
o punctul de intrare în program, adică adresa primei instrucţiuni
executabile din program.

Pe baza acestor date, în timpul executării programului, se încarcă în memoria


internă segmentul rădăcină iar restul de segmente se încarcă succesiv, în
ordinea în care se execută, numărul segmentelor încărcate concomitent în
memorie fiind determinat în funcţie de memoria disponibilă, relaţiile de
subordonare şi de lungimea fiecărui segment implicat.

Activitatea de programare trebuie să aibă în vedere şi posibilitatea apariţiei


unor erori şi necesitatea depistării şi înlăturării acestora. Erorile care apar în
programe pot fi :

o erori de sintaxă, generate de nerespectarea regulilor de utilizare a


limbajului de programare folosit ; acestea sunt sesizate în etapa de
translatare a programului ;
o erori de asamblare, atunci când în program se fac referiri la
variabile sau proceduri nedefinite ; aceste erori sunt sesizate în
timpul operaţiei de editare de legături ;
o erori de execuţie, care pot fi generate de erori de logică în
algoritmul folosit sau de un anumit context de date care nu a fost
tratat corespunzător în algoritm ; de exemplu : valori nepermise
ale operanzilor, executarea necontrolată a instrucţiunilor
repetitive, încercarea de a accesa zone interzise din memoria
internă, etc.

Erorile de execuţie sunt, de obicei, erori de algoritm ; pentru înlăturarea lor este
necesară localizarea şi determinarea naturii acestora. Identificarea unei astfel de
erori se face comparând varianta ideală de execuţie a programului, conform
algoritmului, cu o execuţie concretă ; se compară rezultatele intermediare
obţinute şi ordinea de executare a instrucţiunilor.

Pentru sistemele interactive au fost dezvoltate programe care permit o depanare


dinamică, desfăşurată în timpul execuţiei programului. Aceste programe se
numesc programe depanatoare.

Activitatea unui program depanator constă în monitorizarea execuţiei


programului utilizator prin :

o lansarea în execuţie a acestuia


o executarea controlată a acestuia, prin posibilitatea de suspendare a
execuţiei şi de preluare a controlului :
 în momentul apariţiei unui eveniment deosebit, în timpul
execuţiei
 după executarea fiecărei instrucţiuni (execuţie pas cu pas)
 în puncte anume alese din program şi marcate ca puncte de
întrerupere a execuţiei (breakpoints) ;
o preluînd controlul, programul depanator pune la dispoziţia
utilizatorului instrumente specializate pentru evaluarea modului în
care se execută programul :
 posibilitatea vizualizării valorilor variabilelor din program
 evaluarea unor expresii definite de utilizator
 modificarea valorii unor locaţii de memorie aferente
programului, etc.

Programul depanator oferă, de asemenea, informaţii legate de contextul de


execuţie al programului, de modul de utilizare a resurselor sistem, etc.

După forma programului care se execută, depanatoarele sunt :

o depanatoare maşină care permit monitorizare execuţiei


programului la nivelul programului executabil. Activitatea de
depanare se face pornind de la imaginea programului executabil,
încărcată în memoria internă ; se lucrează cu adrese fizice, cod
maşină şi cu forma de reprezentare internă a datelor. Fiecare
sistem de operare dispune de un astfel de depanator : ODT pentru
RSX, DDT pentru CP/M, DEBUG pentru MS-DOS, adb pentru
UNIX ;
o depanatoare simbolice care monitorizează execuţia programului
utilizator la nivelul programului sursă, lucrând la nivel de linie
program şi identificator de variabilă ; de obicei, limbajele de
programare de nivel înalt sunt prevăzute cu depanator simbolic

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