Sunteți pe pagina 1din 26

5 ELABORAREA PROGRAMELOR Tehnologia produselor software [software engineering] caracterizeaz[ mul\imea tuturor metodelor ]i instrumentelor care permit elaborarea

produselor software. Dezvoltarea unei mari aplica\ii este o problem[ complex[ care nu const[ numai @n a programa, @n sensul strict al cuv`ntului, aceasta presupune parcurgerea unui anumit num[r de etape, ceea ce constituie ciclul de via\[ al unui produs software. #n plus, un mare proiect este dezvoltat de c[tre echipe de programatori, ceea ce oblig[ la descompunerea problemei @n subprobleme pentru fi repartizate @ntre echipe, asigurarea comunica\iei corespunz[toare @ntre echipe, controlul evolu\iei proiectului ]i a calit[\ii produsului software. Ciclul de via\[ se compune din fazele urm[toare: a) Analiza ]i formularea clar[ a problemei: const[ @n a stabili func\ionalit[\ile, restric\iile ]i obiectivele proiectului @n acord cu clientul/utilizatorul. Principala problem[ a acestei faze rezid[ @n comunicarea dintre conceptor ]i client. b) Specificarea: const[ @n determinarea func\ionalit[\ilor detaliate ale produsului software ce urmeaz[ a fi realizat, f[r[ o preocupare deosebit[ pentru modalitatea de implementare efectiv[. c) Concep\ia: este faza de definire a structurii modulare a produsului software, alegerea algoritmilor corespunz[tori precum ]i a limbajelor de programare adecvate. d) Programarea const[ @n implementarea efectiv[ a diferitelor module care compun produsul software. e) Testarea ]i validarea: const[ @n depistarea erorilor de concep\ie ]i de programare @nc`t s[ se poat[ oferi asigurarea c[ produsul software r[spunde bine exigen\elor formulate ini\ial. f) #ntre\inerea: este faza cea mai @ndelungat[ a ciclului de via\[ a unui produs software, care dureaz[ toat[ perioada de exploatare a produsului. #n timpul acestei faze se @ncearc[ s[ se r[spund[ cerin\elor utilizatorilor, fie corect`nd erorile ap[rute, fie efectu`nd modific[ri, fie ad[ug`nd noi func\ionalit[\i. g) Documentarea: const[ @n regruparea tuturor informa\iilor produse @n timpul ciclului de via\[. Documentarea nu este deci o faz[ proprie a ciclului de via\[, dar ea trebuie s[ se efectueze @n timpul fiec[rei faze @n paralel cu derularea acesteia. Documentarea trebuie

s[ permit[ @n\elegerea ]i modificarea ulterioar[ a produsului software. Trecerea de la o faz[ a ciclului de via\[ la urm[toarea este rareori definitiv[, se @nt`mpl[ frecvent s[ se revin[ la o faz[ anterioar[ pentru a se aduce un anumit num[r de modific[ri. #ntr-adev[r, este foarte dificil s[ se prevad[ @n avans toate aspectele ]i @n plus, @n timpul fazei de @ntre\inere, modific[rile importante cum ar fi crearea unei noi versiuni implic[ dezvoltarea complet[ pornind de la faza de specificare. Din acest aspect decurge no\iunea de ciclu. Etapele ciclului de via\[ ale unui produs software sunt prezentate schematic @n figura urm[toare: Analiza problemei Specificare

Concep\ie

Programare

Testare ]i validare

#ntre\inere

Conceptul de software este utilizat pentru a caracteriza toate programele care sunt executate de c[tre sistemul de calcul. Acest concept se opune aceluia de hardware care desemneaz[ aspectul material, fizic al sistemului de calcul. Execu\ia unui program care este elaborat @n faza de programare a ciclului de via\[ a unui produs software const[ @n a furniza sistemului de calcul o secven\[ de instruc\iuni direct interpretabile. #n mod obigatoriu, primele programe erau scrise @n binar ( limbajul ma]in[), activitate dificil[ ]i expus[ riscurilor de eroare, datorit[ secven\elor de bi\i a c[ror semnifica\ie era @nscris[ @ntr-o tabel[ descriind toate opera\iile posibile ]i semnifica\ia lor binar[. #n continuare, pentru u]urarea activit[\ii de programare s -au elaborat limbajele de asamblare. Scrierea de programe @n limbaj de asamblare r[m`ne o sarcin[ complicat[ ]i de asemenea programele depind de sistemul de calcul pe care au fost concepute. Limbaje evoluate, ca de exemplu, Fortran sau Pascal au adus o solu\ie (par\ial[) acestor probleme. Ca ]i @n cazul limbajelor de asamblare, programele scrise @n limbajele de programare evoluate trebuie s[ fie convertite @n limbaj ma]in[ pentru a fi executate, iar conversia se poate efectua @n dou[ moduri diferite: traducere sau interpretare. Traducerea const[ @n a genera un program echivalent programului surs[, dar codificat @n limbajul binar al calculatorului. Traducerea este un procedeu prin care, pornind de programul surs[, se genereaz[ un program obiect, care se poate @nc[rca ulterior @n memorie pentru execu\ie. Interpretarea efectueaz[ conversia ]i execu\ia unui program @ntr-o singur[ etap[: instruc\iunile sunt citite unele dup[ altele ]i sunt convertite imediat @n limbaj ma]in[ prin intermediul interpretorului care realizeaz[ execu\ia lor pe m[sura apari\iei. Totul se petrece ca ]i c`nd limbajul surs[ ar fi acceptat de c[tre ma]in[. Interpretarea este mai bine adaptat[ dezvolt[rii ]i punerii la punct a programelor deoarece execu\ia @ncepe imediat, iar traducerea este indicat[ pentru exploatarea programelor, c`nd nu mai este reluat[ traducerea. Limbajele evoluate dispun @n general de un traduc[tor ( compilator), dar pot dispune ]i de un intrerpretor (exemplul limbajului Pascal).

4.1 Limbajul de asamblare Limbajul de asamblare este utilizat ast[zi de c[tre speciali]tii @n informatic[, @n general pentru rezolvarea unor probleme de optimizare, atunci c`nd se impune exploatarea arhitecturii calculatorului ]i func\ionarea sa la nivelul opera\iilor elementare. Limbajul de asamblare este o variant[ simbolic[ a limbajului ma]in[. Activitatea de programare este facilitat[ de utilizarea codurilor de opera\ii mnemonice, etichete (adrese simbolice), literale (constante numerice) ]i directive (rezervare de spa\iu de memorie, declararea unei macroinstruc\iuni etc.). Spre deosebire de limbajele evoluate, limbajul de asamblare nu ascunde nimic programatorului, permi\`nd accesarea tuturor resurselor sistemului ]i exploatarea facilit[\ilor de prelucrare ale acestuia. O instruc\iune @n limbaj de asamblare este divizat[ @n mai multe c`mpuri care sunt separate @n general prin spa\ii. Num[rul operanzilor din al zona de adres[ variaz[ de la un sistem de calcul la altul @ntre 0 ]i 3. Dup[ acest c`mp este de dorit ad[ugarea comentariilor pentru documentare. Iat[ structura tipic[ a unei instruc\iuni @n limbaj de asamblare: eticheta cod opera\ie (mnemonic) operanzi

Codurile opera\iilor mnemonice Codurile opera\iilor sunt simbolizate @ntr-o tabl[ a codurilor mnemonice care urmeaz[ a fi consultat[ la scrierea de programe @n limbajul de asamblare, mai ales dac[ setul de instruc\iuni este complex (arhitecturi CISC). Operanzi ]i etichete Spre deosebire de limbajul ma]in[, limbajul de asamblare permite atribuirea de nume pentru variabile ]i etichete (adrese de instruc\iuni), ceea ce u]ureaz[ programarea. De asemenea, operanzii pot s[ posede un nume care permite referirea lor, iar fiecare registru are un nume predefinit, recunoscut de c[tre programul de traducere. Exemple de operanzi ]i etichete: Tab DS 1 Definirea unei variabile Tab de un cuv`nt;

Zece DC 10 Definirea constantei Zece care are val. 10; Ciclu: MOVE Zece, A 1 Transferul valorii 10 @n registrul A 1; MOVE A2,Tab Transfer valoare registru A 2 @n variabila Tab; JUMP Ciclu Salt necondi\ionat la adresa Ciclu.

Literale
Limbajul de asamblare permite definirea valorilor @ntregi sau reale @n diverse baze de numera\ie (2, 8, 10 sau 16) ca ]iruri de caractere, care sunt traduse de c[tre asamblor. Specificarea bazei de numera\ie se face prin plasarea unui caracter particular la @nceputul fiec[rei date. Absen\a caracterului particular specific[ o dat[ zecimal[. }irurile de caractere sunt de regul[ delimitate de caracterul . Directive Directivele sau pseudo-instruc\iunile sunt instruc\iuni neexecutabile (referite prin cod mnemonic) care nu au cod ma]in[ echivalent. Acestea sunt indica\ii pentru asamblor (programul de traducere) @n vederea traducerii programului. Exemple de directive: TTL Titlul programului Vec DS 50 Definire variabil[ Vec ]i rezervare 50 cuvinte; Zero DC 0 Definire constant[ Zero cu valoare 0; PLEN 50 50 linii pe pagin[ (PLEN=Page Length); END Sf`r]it de program. Expresii aritmetice Spre deosebire de limbajele evoluate, expresiile aritmetice utilizate pentru a calcula valoarea unei variabile, ca de exemplu @n atribuirea urm[toare: A = B + C / D, nu sunt admise @n limbajul de asamblare ]i de aceea trebuie programate prin mai multe instruc\iuni. Macroinstruc\iuni ]i subprograme Anumite asambloare permit structurarea programelor, ele ofer[ @n general posibilitatea de a grupa o secven\[ de instruc\iuni sub forma unui

subprogram sau a unei macroinstruc\iuni, @n scopul modulariz[rii programului ]i a evit[rii scrierii repetate a unor grupuri de instruc\iuni. Macroinstruc\iuni O macroinstruc\iune se construie]te prin izolarea unei secven\e de instruc\iuni c[reia i se atribuie un nume simbolic prin care poate fi referit[. Ori de c`te ori @n cadrul programului se face referire la acest nume, asamblorul, @n etapa de traducere, @nlocuie]te referin\a cu secven\a de instruc\iuni corespunz[toare. Utilizarea macroinstruc\iunilor prezint[ mai multe avantaje, ]i anume: extinderea setului de instruc\iuni, deoarece fiecare macroinstruc\iune se utilizeaz[ ca o alt[ instruc\iune; reducerea ]i structurarea programelor, care conduce la @n\elegerea ]i modificarea u]oar[ a acestora; economisirea timpului de programare. Instruc\iunile care servesc pentru definirea ]i delimitatea macroinstruc\iunilor (de exemplu, MACRO ]i ENDM) sunt cazuri tipice de directive; @n timpul asambl[rii, fiecare apel al unei macroinstruc\iuni este @nlocuit prin corpul macroinstruc\iunii ]i cele dou[ pseudo -instruc\iuni sunt eliminate. Exemplu: Calculul cubului unui num[r: MACRO CUB (val, valcub) MOVE val, D1 MOVE val, D2 MUL D1, D2 (D2:= D1 D2) MUL D1, D2 MOVE D2, valcub ENDM Subprograme Subprogramele sunt definite ca ]i macroinstruc\iunile, av`nd de asemenea scopul de a evita repetarea scrierii unei secven\e de instruc\iuni ce va fi utilizat[ de mai multe ori. O diferen\[ esen\ial[ fa\[ de macroinstruc\iune rezid[ @n faptul c[ instruc\iunile care compun subprogramul constituie o entitate bine separat[ de programul principal, iar aceast[ separare se p[streaz[ ]i dup[ traducere, @nc`t subprogramul se g[se]te o singur[ dat[ @n memorie ]i doar la execu\ia programului se satisfac referin\ele la un subprogram al s[u.

Aceast[ manier[ de abordare a program[rii conduce la avantaje suplimentare fa\[ de utilizarea macroinstruc\iunilor, deoarece permite minimizarea taliei codului executabil, ceea ce nu este cazul macroinstruc\iunilor. Figura urm[toare ilustreaz[ diferen\a dintre o macroinstruc\iune ]i un subprogram. macroinstruc\iune program subprogram subprogram salvare stare program program restaurare stare revenire program

apel macroinstruc\iune instruc\iune normal[

apel subprogram MACROINSTRUC|IUNE SUBPROGRAM

Problemele care se manifest[ @n situa\ia utiliz[rii subprogramelor se refer[ @n special la asigurarea salv[rii adresei de revenire @n timpul

execu\iei unui subprogram. Adresa de revenire este adresa instruc\iunii care urmeaz[ dup[ instruc\iunea de apel a subprogramului. Deci, principala diferen\[ @ntre o macroinstruc\iune ]i un subprogram este aceea c[ apelurile la o macroinstruc\iune sunt @nlocuite prin corpul macroinstruc\iunii @n timpul traducerii, pe c`nd apelurile la un subprogram sunt tratate @n timpul execu\iei. Transmiterea parametrilor Un program poate s[ schimbe date cu macroinstruc\iunile ]i subprogramele sale prin intermediul parametrilor. Un parametru este o variabil[ al c[rei nume este cunoscut, dar al c[rei con\inut nu este precizat dec`t @n momentul execu\iei. O macroinstruc\iune sau un subprogram se scrie utiliz`nd parametrii formali care vor fi @nlocui\i prin parametrii efectivi corespunz[tori datelor reale care sunt tratate. Substitu\ia parametrilor formali cu cei efectivi se realizeaz[ la traducere, pentru macroinstruc\iuni, ]i la execu\ie, pentru subprograme. Pentru subprograme exist[ mai multe tehnici de transmitere a parametrilor: a) Transmiterea prin valoare const[ @n recopierea valorii de transmis @ntr-o zon[ cunoscut[ de subprogram, care poate fi o zon[ de memorie sau un registru. #n acest fel, subprogramele ac\ioneaz[ asupra unei copii a parametrilor, orice modificare a parametrului nu este posibil[ dec`t @n interiorul subprogramului, iar la revenire @n programul apelant parametrul reg[se]te valoarea sa ini\ial[, ceea ce permite o anumit[ protec\ie a parametrilor. b) Transmiterea prin referin\[ const[ @n a transmite c[tre subprogram adresele parametrilor. Subprogramul lucreaz[ deci efectiv asupra datelor programului apelant, deci orice modificare a valorii parametrului @n interiorul subprogramului este reflectat[ la revenire @n programul apelant. Salvarea st[rii ma]inii Salvarea st[rii ma]inii const[ @n a salva starea registrelor CPU (@n alte registre CPU prev[zute @n acest scop sau @n memoria central[) pentru a permite executarea unui alt program ]i la sf`r]itul execu\iei acestuia, reluarea execu\iei primului. Spre deosebire de macroinstruc\iuni, unde expandarea (@nlocuirea apelului prin corpul macroinstruc\iunii) se realizeaz[ la traducere, @n cazul subprogramelor este necesar[ salvarea st[rii ma]inii la apelul acestora.

#ntr-adev[r, apelul unui subprogram const[ @n trecerea controlului CPUului acestui subprogram, care se comport[ ca un program independent ]i care trebuie s[ fie capabil s[ redea controlul programului apelant la sf`r]itul execu\iei sale. Primele instruc\iuni ale subprogramului servesc la salvarea st[rii diverselor registre, iar ultimele instruc\iuni restaureaz[ aceste valori salvate, revenind la contextul anterior apelului. Recursivitate Un subprogram este recursiv dac[ poate s[ se autoapeleze (direct sau indirect). Problema unui subprogram recursiv este c[ @n timpul fiec[rui apel, trebuie salvat[ starea ma]inii. Datorit[ faptului c[ nu se poate utiliza aceea]i zon[ de memorie pentru salvare, se adopt[ o solu\ie bazat[ pe utilizarea unei stive care lucreaz[ dup[ principiul LIFO [Last In, First Out], @n care se salveaz[ starea ma]inii pe m[sura activ[rii apelurilor recursive (este necesar[ o condi\ie de sf`r]it pentru apelurile recursive). 4.2 Limbaje de programare Un limbaj este o modalitate de exprimare ]i comunicare a g`ndurilor. Exist[ o multitudine de limbaje: limbaje orale, scrise, limbajul semnelor (de exemplu, limbajul surdo-mu\ilor) ]i multe alte limbaje care utilizeaz[ diverse moduri de transmisie (de exemplu, limbajul albinelor). Un limbaj informatic cuprinde: un alfabet: mul\imea simbolurilor elementare disponibile; nume sau identificatori: grupe de simboluri ale alfabetului (cu anumite restric\ii: num[r de caractere, tipul primului caracter etc.); fraze sau instruc\iuni: secven\e de nume ]i simboluri de punctua\ie care respect[ aspectele sintactice ]i semantice ale limbajului. Limbajele informatice, spre deosebire de limbajele naturale, sunt structurate, riguros neambigue ]i pot fi definite @n mod formal. Limbajele de asamblare au fost primele limbaje informatice ]i ele depind de arhitectura sistemelor de calcul. Limbajele evoluate [HLL: High Level Languages] au ap[rut mai t`rziu ]i permit comunicarea cu sistemul de calcul f[r[ a \ine seama de arhitectura sa. #n informatic[ se disting mai multe categorii de limbaje: limbajele de programare ]i limbajele de comand[ sunt cele mai utilizate, dar exist[ de

asemenea ]i limbaje de analiz[ ]i limbaje de specificare, care ajut[ @n timpul primelor faze de dezvoltare a produselor software. Scrierea unui program se realizeaz[ prin utilizarea simbolurilor limbajului de programare pentru constituirea frazelor sau instruc\iunilor care trebuie s[ respecte sintaxa limbajului. Cele dou[ modalit[\i de reprezentare a sintaxei unui limbaj sunt: nota\ia BNF [Backus Naur Form]; diagramele sintactice. Prezent[m @n continuare un exemplu de sintax[ a unui limbaj foarte simplu care permite definirea identificatorilor (@ncep @ntotdeauna cu o liter[), @ntregii f[r[ semn, expresiile aritmetice simple ]i instruc\iunea de atribuire. Pentru nota\ia BNF, semnul indic[ o alternativ[, semnele < ]i > delimiteaz[ obiectele limbajului ]i semnul := indic[ atribuirea. < liter[ > ::= a b c d . . .y z < cifr[ > ::= 0 1 2 3 4 5 6 7 8 9 < identificator > ::= < liter[ > <identificator > < liter[ > < identificator > < cifr[ > < @ntreg > ::= < cifr[ > < @ntreg > < cifr[ > < termen > ::= < @ntreg > < identificator > < operator > ::= + - / <expresie > ::= < termen > <termen> < operator><expresie> < atribuire > ::= < identificator > := < expresie > Utiliz`nd diagramele sintactice, prezent[m acela]i exemplu de definire a sintaxei limbajului: liter[ identificator liter[ cifr[ @ntreg cifr[

10

@ntreg termen identificator + operator / expresie termen operator

atribuire

identificator

:=

expresie

Concepte de baz[ ale limbajelor evoluate Limbajele evoluate permit u]urarea activit[\ii de programare printr -o apropiere de limbajul natural, dar cu respectarea exigen\elor de rigoare ]i neambiguitate. Primele concepte de baz[ ale limbajelor de programare evoluate se refereau la independen\a fa\[ de sistemul de calcul, ceea ce a permis elaborarea unor instruc\iuni posed`nd un nivel semantic superior limbajului de asamblare.

11

Elaborarea de limbaje de programare evoluate a vizat @nc[ de la @nceput trei direc\ii importante, ]i s-a concretizat prin trei categorii de limbaje: a) limbaje bazate pe conceptele de algoritm ]i prelucrarea datelor cu caracter ]tiin\ific (Fortran, Algol); b) limbaje bazate pe prelucrarea datelor (Cobol); c) limbaje bazate pe prelucrarea listelor (Lisp). Limbajele din primele dou[ categorii sunt limbaje procedurale care furnizeaz[ o descriere detaliat[ a algoritmilor de rezolvare a problemelor, iar limbajele din a treia categorie sunt limbaje func\ionale, care subliniaz[ aspectul func\ional al rezolv[rii unei probleme, f[r[ a intra @n detalii. Orientarea algoritmic[ a permis @n continuare dezvoltarea limbajelor Algol 60, Algol 68, Fortran II, Fortran IV, Fortran 66, Fortran 77, Fortran 90, Pascal, C, Modula-2, Ada ]i C++, care furnizeaz[ metodologii bazate pe conceptele de programare structurat[, abstractizare, modularitate etc. A doua orientare, bazat[ pe prelucrarea datelor a r[mas fidel[ limbajului Cobol, dar a evoluat spre sisteme de gestiune de baze de date care permit rezolvarea problemelor specifice bazelor de date. Limbajul Prolog, instrument de baz[ @n domeniul inteligen\ei artificiale, a rezultat din abordarea func\ional[ ]i aduce nou, @n afar[ de prelucrarea listelor, un mecanism de inferen\[ foarte util pentru realizarea sistemelor expert. Asist[m ast[zi la o oarecare convergen\[ @ntre limbajele orientate obiect ]i bazele de cuno]tin\e, ceea ce permite gruparea ]i unificarea conceptelor de baz[ ale diverselor orient[ri. Vom prezenta @n continuare o scurt[ descriere pentru c`teva limbaje de programare dintre cele mai utilizate: Fortran [Formula Translator] este primul limbaj algoritmic, utilizat @n principal pentru rezolvarea problemelor cu caracter ]tiin\ific. El produce cod eficace, utilizeaz[ o mare cantitate de biblioteci matematice ]i a introdus concepte importante, ca de exemplu, structurarea expresiilor aritmetice, subprograme, compilarea independent[ a subprogramelor. Limbajul a evoluat mereu, versiunea Fortran 90 permite programarea paralel[ ]i concurent[ specific[ supercalculatoarelor. Cobol [Common Business Oriented Language] este un limbaj destul de utilizat @n lume, ]i este adaptat aplica\iilor de gestiune care permit un acces u]or la fi]iere ]i baze de date. Inconvenientele

12

utiliz[rii sale provin din aspectul stufos al scrierii ]i dificultatea de structurare a programelor. Algol [Algorithmic Oriented Language] este un limbaj care a avut o influen\[ primordial[ asupra limbajelor actuale. Definit pentru aplica\ii ]tiin\ifice, limbajul nu a reu]it s[ se impun[ din cauza complexit[\ii sale, lipsei de soliditate a intr[rilor/ie]irilor ]i lipsa eficacit[\ii. Totu]i, Algol a introdus conceptul de structurare, cu structuri de blocuri, structuri de control, proceduri, recursivitate. Este primul limbaj definit @n nota\ia BNF ]i a evoluat @n Algol 60, Algol 68, Algol W dar nu a reu]it s[ p[r[seasc[ mediul academic. Lisp [List Processing] a fost conceput pentru manipularea expresiilor ]i func\iilor simbolice. Caracteristicile sale sunt: capacitatea de tratare a listelor, un num[r mic de operatori de baz[, un num[r mare de paranteze ]i recursivitatea care joac[ un rol de seam[ @n parcurgerea listelor. Limbajul este utilizat curent @n inteligen\a artificial[. Datorit[ lipsei de eficacitate pe sisteme de calcul tradi\ionale, anumi\i constructori au dezvoltat ma]ini Lisp, care accept[ acest limbaj ca limbaj ma]in[, av`nd o arhitectur[ particular[, bazat[ pe no\iunea de stiv[. Basic [Beginners All-purpose Symbolic Instruction Code] este un limbaj foarte rudimentar, care a fost dezvoltat doar @n scop didactic. El a devenit un limbaj foarte r[sp`ndit datorit[ dezvolt[rii microcalculatoarelor care, la @nceput nu aveau capacitatea de a utiliza alte limbaje. PL/1 [Programming Language number 1] este o realizare ambi\ioas[, un limbaj aproape universal, menit s[ @nlocuiasc[ limbajele Fortran, Algol ]i Cobol utilizate @n acea epoc[. Din cauza complexit[\ii sale, lipsa de omogenitate ]i de rigoare limbajul nu a cunoscut o mare r[sp`ndire, limit`ndu-se la calculatoarele din familia IBM. Pascal, care poart[ numele matematicianului francez creator al uneia dintre primele ma]ini aritmetice de calcul din secolul XVII, a fost dezvoltat de c[tre elve\ianul Niklaus Wirth. Acest limbaj provenit din Algol c[ruia @i preia conceptele, este bazat pe o mare simplitate ]i este destinat @nainte de toate @nv[\[rii program[rii. Modula-2 este @nc[ un limbaj dezvoltat de Wirth. Limbajul este un descendent al limbajului Pascal, c[ruia @i adaug[ no\iunea de modularitate care permite compilarea independent[ a modulelor.

13

Smalltalk este un limbaj care caracterizeaz[ o nou[ tendin\[ de programare bazat[ pe conceptul de obiect. El permite o interac\iune grafic[ cu sistemul, bazat[ pe utilizarea ferestrelor ]i a meniurilor, ceea ce constituie o inova\ie @n domeniul program[rii. Prolog [Programmation Logique] (elaborat @n 1972 de c[tre Colmerauer) este un limbaj care preia conceptele limbajului Lisp, ad[ug`nd un mecanism de inferen\[ utilizat la realizarea sistemelor expert. Japonezii ]i-au pus mari speran\e @n acest limbaj pentru proiectul de sisteme de calcul de genera\ia a cincea. C, un succesor al limbajelor BCPL ]i B, este un limbaj orientat spre programare de sistem. Succesul limbajului se datoreaz[ utiliz[rii sale pentru dezvoltarea sistemului de operare UNIX. C este un limbaj relativ simplu la nivel de concepte, codul generat de compilator este eficace, dar sintaxa permite scrierea @ntr-o linie a instruc\iunilor foarte complexe, care devin aproape ilizibile. Ada, al c[rui nume aduce omagiu Adei Byron (sec. XIX), considerat[ ca prima informatician[, este un limbaj conceput pentru departamentul ap[r[rii al SUA. El preia conceptele limbajelor Pascal ]i Modula-2, ad[ug`nd concepte de timp real, paralelism, genericitate ]i gestiunea excep\iilor. C++ este un succesor al limbajului C, dezvoltat de c[tre Bjarne Stroustrup la @nceputul anilor 80. Acest limbaj poate fi v[zut ca o evolu\ie natural[ a limbajului C, reia conceptele acestui limbaj, la care se adaug[ un anumit num[r de concepte legate de programarea orientat[ obiect, ca de exemplu, no\iunea de clas[ de obiecte, mo]tenire @ntre clase etc.

Orientarea obiect Evolu\ia program[rii clasice se poate rezuma @n felul urm[tor: a) Programarea procedural[ [procedural programming]: accentul este pus pe algoritmi, codul este repartizat @n proceduri, iar structurile de date nu sunt luate @n considerare. Este cazul limbajelor Fortran sau C. b) #ncapsularea ]i abstractizarea datelor [data hidding and abstraction]: apare no\iunea de modul, care permite descompunerea codului @n diferite module. Datele sunt @nchise @n interiorul modulelor ceea ce constituie tipurile abstracte de date [ADT:

14

c)

Abstract Data Type]. Practic, un ADT poate fi v[zut ca o cutie neagr[, iar seviciile (metode) sunt oferite prin intermediul unei interfe\e. Este cazul limbajelor Modula-2 ]i Ada. Programarea orientat[ obiect [object oriented programming]: reia conceptele de tipuri abstracte de date dar se insist[ asupra no\iunii de reutilizare a obiectelor sistemului. #n acest sens, se determin[ principalele modele de date necesare, care se vor numi clase de obiecte ]i @n continuare se stabilesc metodele care vor manipula aceste modele. Un program se compune deci dintr -un ansamblu de obiecte care interac\ioneaz[ @ntre ele trimi\`ndu-]i mesaje care activeaz[ metodele specifice fiec[rei clase de obiecte. Este cazul limbajelor Smalltalk, Eiffel, C++, Objective-C.

Tipuri abstracte de date Un tip abstract de date permite descrierea unei clase de structuri de date prin lista func\iunilor (metode) disponibile asupra structurilor de date ]i nu prin implementarea lor. Clase ]i obiecte O clas[ de obiecte corespunde implement[rii unui tip abstract de date. Defini\ia unei clase descrie comportamentul tipului s[u abstract prin specificarea interfe\ei tuturor opera\iilor (metode) care pot fi aplicate asupra tipului abstract. Defini\ia unei clase comport[ de asemenea detalii cu privire la implementarea unor astfel de structuri de date sau codul surs[ care implementeaz[ metodele. Un obiect [object] este o variabil[ a c[rei tip este o clas[. El reprezint[ o instan\[ (realizare) a unei clase. Ac\iunile pot fi aplicate asupra acestui obiect invoc`nd metodele definite @n clas[, care se realizeaz[ printr -un procedeu numit trimitere de mesaje obiectelor clasei. Clasele sunt entit[\i definite @n codul surs[ al unui program, ele descriu de o manier[ static[ o mul\ime de obiecte (pot fi considerate ]i ca tipuri de date), @n timp ce obiectele sunt elementele dinamice, ele nu exist[ dec`t la execu\ie ]i corespund instan\elor clasei.

15

Mesaje Obiectele pot comunica @ntre ele trimi\`ndu-]i mesaje prin care se solicit[ efectuarea unei anumite opera\ii asupra acestor obiecte. Mul\imea tipurilor de mesaje proprii unui obiect corespunde interfe\ei sale. Polimorfism Polimorfismul permite efectuarea unei ac\iuni prin trimiterea unui mesaj la un obiect pentru care sunt posibile mai multe instan\e de execu\ie. Aceast[ capacitate este foarte important[ atunci c`nd acela]i mesaj poate fi @ndeplinit @n moduri diferite pentru tipuri diferite de obiecte. Limbajele orientate obiect permit trimiterea mesajelor identice spre obiecte care apar\in unor clase diferite (dar derivate din clasa de baz[). Polimorfismul const[ @n esen\[ @n posibilitatea asocierii mai multor implement[ri ale aceluia]i mesaj, iar sistemul de calcul trebuie s[ fie @n m[sur[ s[ stabileasc[ implementarea corespunz[toare mesajului transmis. Acest[ decizie (const`nd @n legarea mesajului de implementarea corespunz[toare) se poate lua fie la compilare [early sau static bilding], fie la execu\ie [late sau dynamic bilding]. Mo]tenirea ]i ierarhizarea claselor Prin mecanismul mo]tenirii [inheritance], programarea orientat[ obiect permite definirea subclaselor. O subclas[, numit[ ]i clas[ derivat[ permite caracterizarea comportamentului unei mul\imi de obiecte care mo]tenesc caracteristicile clasei lor p[rinte, dar care poate de asemenea s[ posede caracteristici particulare proprii, pe care p[rintele nu le are. Utilizarea subclaselor permite diminuarea costului ]i complexit[\ii programelor, deoarece subclasele faciliteaz[ reutilizarea claselor existente, permi\`nd @n acela]i timp modificarea lor. Genericitate Genericitatea se exprim[ prin capacitatea de a defini clase parametrizabile. De exemplu, presupunem c[ este necesar[ o stiv[ de numere @ntregi ]i o stiv[ de numere reale. #n locul definirii celor dou[ tipuri de stiv[ se va proceda la definirea unei clase parametrizat[ numit[ stiv[, din care se vor genera cele dou[ clase dorite. Genericitatea ]i mo]tenirea corespund unor necesit[ti diferite ]i genereaz[ structuri diferite: mo]tenirea favorizeaz[ rafinamente succesive ale unei aceea]i clase rezult`nd astfel o structur[ pe vertical[, @n timp ce

16

genericitatea permite definirea unei clase de baz[ parametrizat[ care se poate instan\ia de mai multe ori cu tipuri diferite, rezult`nd astfel o structur[ pe orizontal[. Figura urm[toare eviden\iaz[ aceast[ situa\ie. Mo]tenire Genericitate

structur[ vertical[

structur[ orizontal[

Inteligen\a artificial[ ]i sistemele expert


Inteligen\a artificial[ este domeniul informaticii care propune simularea pe sistemele de calcul a comportamentului inteligent al omului. Sunt implicate domeniile perceperii, @n\elegerii, lu[rii deciziilor, @nv[\[rii. Aceast[ orientare a condus la unele rezultate notabile, @n special @n unele domenii: teoria jocurilor, demonstrarea teoremelor, recunoa]terea formelor, recunoa]terea parolelor, @n\elegerea limbajelor naturale, rezolvarea problemelor care necesit[ expertiz[ legat[ de un domeniu specific (de exemplu, diagnosticul medical), matematici simbolice etc. Inteligen\a artificial[ trebuie s[ permit[ rezolvarea problemelor pentru care abordarea algoritmic[ este ineficient[ sau chiar imposibil de aplicat. Un program al inteligen\ei artificiale se caracterizeaz[ prin utilizarea simbolurilor @n locul informa\iilor alfanumerice.

17

Sisteme expert Sistemele expert constituie cu siguran\[ domeniul inteligen\ei artificiale care a cunoscut cea mai mare dezvoltare. Un sistem expert este un program care utilizeaz[ intensiv cuno]tin\a @n scopul rezolv[rii problemelor care necesit[ @n mod normal expertiza uman[. #ntr-un sistem expert exist[ o separa\ie net[ @ntre programe ]i cuno]tin\e. Arhitectura de baz[ a unui sistem expert cuprinde trei p[r\i: a) Baza de fapte este un fel de baz[ de date care regrupeaz[ faptele ]i aser\iunile viz`nd problema tratat[; b) Baza de reguli con\ine cuno]tin\ele care permit manipularea faptelor din baza de fapte. Cuno]tin\ele se exprim[ sub form[ de reguli de produc\ie. O regul[ comport[ o parte st`ng[, exprim`nd o condi\ie (dac[) ]i o parte dreapt[ con\in`nd concluzii (atunci); c) Motorul de inferen\[ exploateaz[ baza de cuno]tin\e (baza de fapte + baza de reguli) asociind faptele ]i regulile pentru a formula un ra\ionament asupra problemei puse. Pentru aceasta, pornind de la baza de fapte, el determin[ mul\imea regulilor a c[ror parte st`ng[ este verificat[, faptele con\inute @n partea dreapt[ ad[g`ndu -se la baza de fapte. #n continuare, motorul de inferen\[ aplic[ aceste reguli (@nl[n\uire @nainte) pentru a ajunge la o concluzie, procesul oprindu-se c`nd nu se mai pot genera fapte noi. Se poate de asemenea porni de la concluzie, inferen\ele propag`ndu -se invers (@nl[n\uire @napoi). Ele determin[ noi subscopuri mai simplu de verificat p`n[ la g[sirea p[r\ilor st`ngi ale regulilor corespunz[toare faptelor din baza de fapte. Un anumit num[r de limbaje (Lisp ]i Prolog) permit dezvoltarea cu u]urin\[ a sistemelor expert simple. 4.3 Etapele dezvolt[rii unui program Dezvoltarea unui program, de la analiza problemei p`n[ la punerea sa la punct, necesit[ numeroase instrumente software constituite @ntr-un mediu de programare, care utilizeaz[ serviciile sistemului de operare, @n special sistemul de gestiune al fi]ierelor. Elementele clasice ale unui mediu de programare sunt urm[toarele: editorul de texte, traduc[torul (compilator sau asamblor), editorul de leg[turi, programul @nc[rc[tor ]i programul corector. Figura urm[toare prezint[ grafic un mediu de programare minim:

18

idee Editor de texte program surs[ Traduc[tor asamblor compilator program obiect subprograme de bibliotec[ subprograme traduse separat

Editor de leg[turi program obiect

#nc[rc[tor program executabil execu\ie Corector

19

Editorul de texte Un editor de texte [text editor] este un program interactiv care permite preluarea unui text pornind de la tastatur[ ]i stocarea sa @ntr-un fi]ier. Informa\iile con\inute @n fi]ier sunt de tip text, adic[ o mul\ime de caractere, @n general structurate @n linii. Principalele func\iuni ale unui editor de texte sunt: vizualizarea unei p[r\i a textului; deplasarea ]i pozi\ionarea @n fi]ier (se indic[ pozi\ia curent[); modificarea textului prin inserare, modificare, ]tergere; reg[sirea ]irurilor de caractere particulare. Editorul poate fi utilizat at`t pentru tastarea textului surs[ al unui program c`t ]i pentru introducerea datelor necesare programului. Vom eviden\ia dou[ dintre cele mai importante tipuri de editoare: a) editor sintactic, adaptat prelucr[rii programelor surs[, care verific[ sintaxa programelor pe m[sura tast[rii acestora, permi\`nd de asemenea gestionarea automat[ a structurilor sintactice proprii limbajului de programare utilizat; b) procesor de texte, destinat trat[rii textelor. Acest tip de editor ofer[ func\ionalit[\i mult mai pronun\ate pentru manipularea caracterelor: utilizarea literelor accentuate, fonturi diferite (adic[ diferite seturi de caractere), alinierea textului, inserare de desene etc., mai general se zice c[ aceste editoare ofer[ facilit[\i de punere @n pagin[ pentru scriere de scrisori, articole, c[r\i etc. Compilatorul Un compilator este un program sistem care traduce un program surs[ scris @ntr-un limbaj de programare de nivel @nalt @n program obiect. Activitatea compilatorului se divide @n dou[ mari componente: a) faza de analiz[, care cuprinde urm[toarele etape: analiza lexical[; analiza sintactic[; analiza semantic[. b) faza de sintez[, care cuprinde urm[toarele etape: generarea codului intermediar; optimizarea codului; generarea codului obiect. Activitatea compilatorului este prezentat[ schematic astfel:

20

program surs[

tabela de simboluri

analiza lexical[ analiza sintactic[ analiza semantic[ generarea codului intermediar optimizarea codului generarea codului obiect

arbore sintactic

Compilator

program obiect

Analiza lexical[ Analiza lexical[ este prima faz[ a compil[rii. Rolul s[u major const[ @n citirea secven\ei de caractere care constituie programul surs[ ]i producerea unor secven\e de elemente sintactice ale limbajului.

21

Identificatorii, de exemplu numele de variabile, sau de proceduri ca ]i atributele lor sunt stocate @ntr-o tabel[ de simboluri, @n timp ce informa\iile inutile pentru compilator (comentariile) sunt eliminate. Analiza sintactic[ Analizorul sintactic prime]te o list[ de elemente sintactice (cuvinte rezervate, identificatori, operatori aritmetici, semne de punctua\ie etc.) elaborat[ de c[tre analizorul lexical. El verific[ dac[ aceast[ list[ este corect[ @n raport cu sintaxa limbajului ]i pornind de la aceste elemente, analizorul sintactic genereaz[ arborele sintactic al programului. Sunt posibile dou[ abord[ri pentru generarea arborelui sintactic: ascendent[: se analizeaz[ elementele componentr ale frazei de tratat ]i se caut[ regulile care permit ascensiunea spre r[d[cin[; descendent[: se porne]te de la r[d[cin[ ]i se aplic[ regulile care permit construirea frazei dorite. Analiza semantic[ Analiza semantic[ se ocup[ de analiza sensului ]i a semnifica\iei frazelor limbajului, utiliz`nd arborele sintactic pentru a identifica operatorii ]i operanzii instruc\iunilor. Sarcina principal[ a unui analizor semantic este verificarea concordan\ei tipurilor, ceea ce revine la a verifica dac[ fiecare operator ac\ioneaz[ asupra operanzilor care sunt autoriza\i prin limbaj. Pentru efectuarea acestor verific[ri, analizorul semantic utilizeaz[ informa\iile care sunt stocate @n tabela de simboluri. Generarea codului intermediar Dup[ etapele fazei de analiz[, se procedeaz[ la generarea programului @n cod obiect. O metod[ r[sp`ndit[ const[ @n divizarea acestei sarcini @n dou[ etape: generarea codului intermediar ]i generarea codului obiect. Codul intermediar se poate defini ca un cod al unei ma]ini abstracte, care trebuie s[ posede dou[ propriet[\i: s[ fie u]or de generat pornind de la arborele sintactic al unui program ]i s[ fie u]or de tradus @n cod obiect. Deci, pornind de la arborele sintactic al unui program, compilatorul genereaz[ un flux de instruc\iuni simple care se aseam[n[ cu macroinstruc\iunile, dar contrar asamblorului, acestea nu fac referire explicit[ la registrele sistemului de calcul. Optimizarea codului

22

Optimizarea codului const[ @n ameliorarea codului pentru a -l face mai rapid de executat ]i mai pu\in @ncurcat @n memorie, ]i vizeaz[ @n special eliminarea redondan\elor ]i evaluarea expresiilor care utilizeaz[ constante. Deoarece optimizarea conduce la o cre]tere substan\ial[ a timpului de compilare, este de preferat evitarea acestei faze @n timpul dezvolt[rii ]i punerii la punct a programelor. Optimizarea codului joac[ un rol determinant pentru sistemele de calcul care utilizeaz[ un procesor RISC, datorit[ complexit[\ii compilatoarelor pentru astfel de ma]ini, care utilizeaz[ un num[r mare de registre @n vederea reducerii num[rului de accese la memoria central[. Generarea codului obiect Generarea codului obiect este faz[ final[ a compil[rii, care genereaz[ codul obiect relocabil, adic[ relativ la originea 0. Fiecare instruc\iune a codului intermediar este tradus[ @ntr-o secven\[ de instruc\iuni @n cod obiect. Generarea codului obiect atribuie pozi\ii @n memorie pentru datele ]i instruc\iunile programului. Tabela de simboluri #n timpul compil[rii este necesar[ descrierea identificatorilor ]i a caracteristicilor acestora. Tabela de simboluri permite gruparea acestor informa\ii care sunt puse la dispozi\ia diferitelor faze ale compilatorului. #n tabel[ se g[sesc numele variabilelor, constantelor ]i procedurilor. Fiec[rei intr[ri din tabel[ i se asociaz[ o @nregistrare care con\ine numele obiectului considerat ]i caracteristicile proprii (tip, adres[ numeric[, num[rul ]i tipul parametrilor etc.). Accesul la aceast[ tabel[ trebuie s[ fie rapid, deoarece toate fazele compil[rii pot utiliza tabela de simboluri. Tratarea erorilor #n activitatea practic[ de programare s-a constatat c[ este dificil[ scrierea programelor f[r[ erori ]i din aceast[ cauz[, un bun compilator trebuie s[ fac[ posibil[ detectarea ]i corectarea acestor erori. La sf`r]itul compil[rii se @ntocme]te un raport al erorilor depistate ]i se @ncearc[ specificarea cauzei care a generat eroarea precum ]i pozi\ia sa @n cadrul textului surs[. Un program scris @ntr-un limbaj de pogramare evoluat poate con\ine erori de natur[ diferit[: a) erori lexicale: erori de ortografiere a identificatorilor sau cuvintelor rezervate, caractere ilegale etc.

23

b) erori sintactice: constituie majoritatea erorilor de programare ]i se refer[ la: expresii aritmetice sau logice incorecte, erori de structurare a blocurilor, lipsa separatorilor etc. c) erori semantice: identificatori nedeclara\i, incompatibilitate @ntre operatori ]i operanzi etc. d) erori logice: erori aritmetice de tipul @mp[r\irii cu zero, r[d[cin[ p[trat[ dintr-un num[r negativ, dep[]irea limitelor unui tablou, ciclu infinit, adresare incorect[ etc. Erorile din primele trei categorii sunt detectate de compilator @n timpul analizei cu acela]i nume (analiza lexical[, sintactic[, semantic[), ]i sunt relativ u]or de corectat deoarece compilatorul indic[ prezen\a lor. Erorile logice sunt vizibile doar la execu\ie ]i au ca efect fie efectuarea unor calcule eronate, fie oprirea execu\iei programului. Acestea sunt erorile cele mai dificil de detectat ]i corectat, ]i la fiecare tentativ[ de corectare trebuie reluat ciclul compilare - execu\ie - testare. Editorul de leg[turi Un editor de leg[turi [linker, linkage editor] este un produs software care permite combinarea mai multor programe obiect, ob\in`ndu -se un singur modul obiect. Dezvoltarea unor programe complexe se realizeaz[ prin descompunerea acestora @n module care se traduc independent, deci un program poate fi constituit din mai multe fi]iere (sau subprograme), unul dintre fi]iere con\in`nd @n mod obligatoriu programul principal. Toate aceste fi]iere sunt traduse separat, ele pot utiliza subprograme care se g[sesc @n alte fi]iere, ceea ce d[ na]tere la referin\e exterioare. Exist[ dou[ tipuri de referin\e exterioare: a) posibilitatea ca un modul s[ apeleze alt modul sau subprogram de bibliotec[; b) posibilitatea ca un modul s[ fie referit de un alt modul; Referin\ele exterioare unui modul ridic[ probleme deosebite pentru programul traduc[tor care nu poate satisface referin\ele exterioare ci doar @ntocme]te o list[ a acestora pe care o transmite editorului de leg[turi. Editorul de leg[turi preia modulele independente, le grupeaz[ ]i satisface toate referin\ele exterioare pentru a forma un program complet, care este executabil. Figura urm[toare prezint[ un exemplu de editare de leg[turi pentru un program care con\ine dou[ subprograme traduse ]i stocate @n fi]iere

24

separate, ]i care face de asemenea apel la dou[ module de bibliotec[ care sunt traduse @n prealabil ]i conservate @n cod obiect. subprogram (cod surs[) program principal (cod surs[) subprogram (cod surs[)

traducere

traducere

traducere modul de modul de bibliotec[

subprogram program principal subprogram bibliotec[ (cod obiect) (cod obiect)

(cod obiect) (cod obiect) (cod obiect)

editare de leg[turi

program complet executabil

25

Programul @nc[rc[tor Programul obiect care rezult[ @n urma edit[rii de leg[turi, trebuie s[ fie @nc[rcat @n memoria calculatorului pentru a putea fi executat. Programul @nc[rc[tor [loader], care este de obicei cuplat cu editorul de leg[turi realizeaz[ @nc[rcarea programului obiect la adresa sa de @nc[rcare. Exist[ dou[ tipuri de programe @nc[rc[toare: a) @nc[rc[tor absolut, specific vechilor sisteme de calcul care permite @nc[rcarea programului (unic @n memorie) la o adres[ fixat[ @n avans, ca ]i toate adresele din cadrul programului. b) @nc[rc[tor relocabil, specific noilor tipuri de sisteme multiprogramate, care utilizeaz[ pentru @nc[rcare @n memorie tehnica reloc[rii. O modalitate de realizare a reloc[rii este aceea a utiliz[rii indicatorului de relocare de c[tre programul traduc[tor @n c`mpul de adres[ al instruc\iunii. Relocarea se mai poate realiza prin intermediul unui registru de baz[, astfel: se traduce programul @n raport cu adresa 0 ]i se realizeaz[ editarea de leg[turi; se alege un registru de baz[ printre cele disponibile; se depune @n registrul de baz[ adresa de baz[ (adresa absolut[ a programului); se @ncarc[ programul @n memorie, pornind de la adresa de baz[, f[r[ modificarea adreselor programului. #n timpul execu\iei, la fiecare referire a unei adrese, sistemul de calcul efectueaz[ opera\iile: adresa efectiv[ = adresa de baz[ + adresa referit[.

26

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