Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


ELABORAREA PROGRAMELOR

calculatoare



+ Font mai mare | - Font mai mic



ELABORAREA PROGRAMELOR

Tehnologia produselor software software engineering caracterizeaza multimea tuturor metodelor si instrumentelor care permit elaborarea produselor software.



Dezvoltarea unei mari aplicatii este o problema complexa care nu consta numai in a programa, in sensul strict al cuvantului, aceasta presupune parcurgerea unui anumit numar de etape, ceea ce constituie ciclul de viata al unui produs software.

in plus, un mare proiect este dezvoltat de catre echipe de programatori, ceea ce obliga la descompunerea problemei de rezolvat in subprobleme pentru fi repartizate intre diversele echipe, asigurarea comunicatiei corespunzatoare intre echipe, controlul evolutiei proiectului si a calitatii produsului software produs.

Ciclul de viata se compune din fazele urmatoare:

a)      Analiza si formularea clara a problemei: consta in a stabili functionalitatile, restrictiile si obiectivele proiectului in acord cu clientul/utilizatorul. Principala problema a acestei faze rezida in comunicarea dintre conceptor si client.

b)      Specificarea: consta in determinarea functionalitatilor detaliate ale produsului software ce urmeaza a fi realizat, fara o preocupare deosebita pentru modalitatea de implementare efectiva.

c)      Conceptia: este faza de definire a structurii modulare a produsului software, alegerea algoritmilor corespunzatori precum si a limbajelor de programare adecvate.

d)      Testarea si validarea: consta in depistarea erorilor de conceptie si de programare incat sa se poata oferi asigurarea ca produsul software raspunde bine exigentelor formulate initial.

e)      intretinerea: este faza cea mai indelungata a ciclului de viata a unui produs software, care dureaza toata perioada de exploatare a produsului. in timpul acestei faze se incearca sa se raspunda cerintelor utilizatorilor, fie corectand erorile aparute, fie efectuand modificari, fie adaugand noi functionalitati.

f)        Documentarea: consta in regruparea tuturor informatiilor produse in timpul ciclului de viata. Documentarea nu este deci o faza proprie a ciclului de viata, dar ea trebuie sa se efectueze in timpul fiecarei faze in paralel cu derularea acesteia. Documentarea trebuie sa permita intelegerea si modificarea ulterioara a produsului software.

Trecerea de la o faza a ciclului de viata la urmatoarea este rareori definitiva, se intampla frecvent sa se revina la o faza anterioara pentru a se aduce un anumit numar de modificari. intr-adevar, este foarte dificil sa se prevada in avans toate aspectele si in plus, in timpul fazei de intretinere, modificarile importante cum ar fi crearea unei noi versiuni implica dezvoltarea completa pornind de la faza de specificare. Din acest aspect decurge notiunea de ciclu.

Etapele ciclului de viata ale unui produs software sunt prezentate schematic in figura urmatoare:

Analiza problemei

Specificare


Conceptie

Programare


Testare si validare


intretinere

Conceptul de software este utilizat pentru a caracteriza toate programele care sunt executate de catre sistemul de calcul. Acest concept se opune aceluia de hardware care desemneaza aspectul material, fizic component al sistemului de calcul.

Executia unui program care este elaborat in faza de programare a ciclului de viata a unui produs software consta in a furniza sistemului de calcul o secventa de instructiuni direct interpretabile.

in mod obigatoriu, primele programe erau scrise in binar (limbajul masina), activitate dificila si expusa riscurilor de eroare, datorita secventelor de biti a caror semnificatie era inscrisa intr-o tabela descriind toate operatiile posibile si semnificatia lor binara.

in continuare, pentru usurarea activitatii de programare s-au elaborat limbajele de asamblare.

Scrierea de programe in limbaj de asamblare ramane o sarcina complicata si de asemenea programele depind de sistemul de calcul pe care au fost concepute. Limbaje evoluate, ca de exemplu, Fortran sau Pascal au adus o solutie (partiala) acestor probleme.

Ca si in cazul limbajelor de asamblare, programele scrise in limbajele de programare evoluate trebuie sa fie convertite in limbaj masina pentru a fi executate, iar conversia se poate efectua in doua moduri diferite: traducere sau interpretare.

Traducerea consta in a genera un program echivalent programului sursa, dar codificat in limbajul binar al calculatorului. Traducerea este un procedeu prin care, pornind de programul sursa, se genereaza un program obiect, care se poate incarca ulterior in memorie pentru executie.

Interpretarea efectueaza conversia si executia unui program intr-o singura etapa: instructiunile sunt citite unele dupa altele si sunt convertite imediat in limbaj masina prin intermediul interpretorului care realizeaza executia lor pe masura aparitiei. Totul se petrece ca si cand limbajul sursa ar fi acceptat de catre masina.

Interpretarea este mai bine adaptata dezvoltarii si punerii la punct a programelor deoarece executia incepe imediat, iar traducerea este indicata pentru exploatarea programelor, cand nu mai este reluata traducerea.

Limbajele evoluate dispun in general de un traducator (numit compilator), dar pot dispune si de un intrerpretor (de exemplu, limbajul Pascal).

1 Limbajul de asamblare

Limbajul de asamblare este utilizat astazi de catre specialistii in informatica, in general pentru rezolvarea unor probleme de optimizare, atunci cand se impune exploatarea arhitecturii calculatorului si functionarea sa la nivelul operatiilor elementare.

Limbajul de asamblare este o varianta simbolica a limbajului masina. Activitatea de programare este facilitata de utilizarea codurilor de operatii mnemonice, etichete (adrese simbolice), literale (constante numerice) si directive (rezervare de spatiu de memorie, declararea unei macroinstructiuni etc.).

Spre deosebire de limbajele evoluate, limbajul de asamblare nu ascunde nimic programatorului, permitand accesarea tuturor resurselor sistemului si exploatarea facilitatilor de prelucrare ale acestuia.

O instructiune in limbaj de asamblare este divizata in mai multe campuri care sunt separate in general prin spatii. Numarul operanzilor din al 3-lea camp variaza de la un sistem de calcul la altul intre 0 si 3. Dupa acest camp este de dorit adaugarea comentariilor pentru documentare. Iata structura tipica a unei instructiuni in limbaj de asamblare:

eticheta cod operatie (mnemonic) operanzi

Codurile operatiilor mnemonice

Codurile operatiilor sunt simbolizate intr-o tabla a codurilor mnemonice care urmeaza a fi consultata la scrierea de programe in limbajul de asamblare, mai ales daca setul de instructiuni este complex (arhitecturi CISC).

Operanzi si etichete

Spre deosebire de limbajul masina, limbajul de asamblare permite atribuirea de nume pentru variabile si etichete (adrese de instructiuni), ceea ce usureaza programarea.

De asemenea, operanzii pot sa posede un nume care permite referirea lor, iar fiecare registru are un nume predefinit, recunoscut de catre programul de traducere.

Exemple de operanzi si etichete:

Tab DS 1 Definirea unei variabile Tab de un cuvant;

Zece DC 10 Definirea constantei Zece care are val. 10;

Ciclu: MOVE Zece, A1 Transferul valorii 10 in registrul A1;

MOVE A2,Tab Transfer valoare registru A2 in variabila Tab;

JUMP Ciclu Salt neconditionat la adresa Ciclu.

Literale

Limbajul de asamblare permite definirea valorilor intregi sau reale in diverse baze de numeratie (2, 8, 10 sau 16) ca siruri de caractere, care sunt traduse de catre asamblor. Specificarea bazei de numeratie se face prin plasarea unui caracter particular la inceputul fiecarei date. Absenta caracterului particular specifica o data zecimala. }irurile de caractere sunt de regula delimitate de caracterul ' ' '.

Directive

Directivele sau pseudo-instructiunile sunt instructiuni neexecutabile (referite prin cod mnemonic) care nu au cod masina echivalent. Acestea sunt indicatii date asamblorului (programul de traducere) in vederea traducerii programului.

Exemple de directive:

TTL 'Titlul programului'

Vec DS 50 Definire variabila Vec si rezervare 50 cuvinte;

Zero DC 0 Definire constanta Zero cu valoare 0;

PLEN 50 50 linii pe pagina (PLEN=Page Length);

END Sfarsit de program.

Expresii aritmetice

Spre deosebire de limbajele evoluate, expresiile aritmetice utilizate pentru a calcula valoarea unei variabile, ca de exemplu in atribuirea urmatoare: A = B + C / D, nu sunt admise in limbajul de asamblare si de aceea trebuie programate din mai multe instructiuni.

Macroinstructiuni si subprograme

Anumite asambloare permit structurarea programelor, ele ofera in general posibilitatea de a grupa o secventa de instructiuni sub forma unui subprogram sau a unei macroinstructiuni, in scopul modularizarii programului si a evitarii scrierii repetate a unor grupuri de instructiuni.

Macroinstructiuni

O macroinstructiune se construieste prin izolarea unei secvente de instructiuni careia i se atribuie un nume simbolic prin care poate fi referita. Ori de cate ori in cadrul programului se face referire la acest nume, asamblorul, in etapa de traducere inlocuieste referinta cu secventa de instructiuni corespunzatoare.

Utilizarea macroinstructiunilor prezinta mai multe avantaje, si anume:

extinderea setului de instructiuni, deoarece fiecare macroinstructiune se utilizeaza ca o alta instructiune;

reducerea si structurarea programelor, care conduce la intelegerea si modificarea usoara a acestora;

economisirea timpului de programare.

Instructiunile care servesc pentru definirea si delimitatea macroinstructiunilor (de exemplu, MACRO si ENDM) sunt cazuri tipice de directive; in timpul asamblarii, fiecare apel al unei macroinstructiuni este inlocuit prin corpul macroinstructiunii si cele doua pseudo-instructiuni sunt eliminate.

Exemplu: Calculul cubului unui numar:

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 si macroinstructiunile, avand de asemenea scopul de a evita repetarea scrierii unei secvente de instructiuni ce va fi utilizata de mai multe ori.

O diferenta esentiala fata de macroinstructiune rezida in faptul ca instructiunile care compun subprogramul constituie o entitate bine separata de programul principal, iar aceasta separare se pastreaza si dupa traducere, incat subprogramul se gaseste o singura data in memorie si doar la executia programului se satisfac referintele la un subprogram al sau.

Aceasta maniera de abordare a programarii conduce la avantaje suplimentare fata de utilizarea macroinstructiunilor, deoarece permite minimizarea taliei codului executabil, ceea ce nu este cazul macroinstructiunilor.

Problemele care se manifesta in situatia utilizarii subprogramelor se refera in special la asigurarea salvarii adresei de revenire in timpul executiei unui subprogram. Adresa de revenire este adresa instructiunii care urmeaza dupa instructiunea de apel a subprogramului.

Figura urmatoare ilustreaza diferenta dintre o macroinstructiune si un subprogram.

macroinstructiune program subprogram subprogram

salvare

stare

program

program

restaurare

stare

revenire

program


apel macroinstructiune



instructiune normala


apel subprogram

MACROINSTRUC|IUNE SUBPROGRAM

Deci, principala diferenta intre o macroinstructiune si un subprogram este aceea ca apelurile la o macroinstructiune sunt inlocuite prin corpul macroinstructiunii in timpul traducerii, pe cand apelurile la un subprogram sunt tratate in timpul executiei.

Transmiterea perametrilor

Un program poate sa schimbe date cu macroinstructiunile si subprogramele sale prin intermediul parametrilor. Un parametru este o variabila al carei nume este cunoscut, dar al carei continut nu este precizat decat in momentul executiei. O macroinstructiune sau un subprogram se scrie utilizand parametrii formali care vor fi inlocuiti prin parametrii efectivi corespunzatori datelor reale care sunt tratate.

Substitutia parametrilor formali cu cei efectivi se realizeaza la traducere, pentru macroinstructiuni, si la executie, pentru subprograme.

Pentru subprograme exista mai multe tehnici de transmitere a parametrilor:

a)      Transmiterea prin valoare consta in recopierea valorii de transmis intr-o zona cunoscuta de subprogram, care poate fi o zona de memorie sau un registru. in acest fel, subprogramele actioneaza asupra unei copii a parametrilor, orice modificare a parametrului nu este posibila decat in interiorul subprogramului, iar la revenire in programul apelant parametrul regaseste valoarea sa initiala, ceea ce permite o anumita protectie a parametrilor.

b)      Transmiterea prin referinta consta in a transmite catre subprogram adresele parametrilor. Subprogramul lucreaza deci efectiv asupra datelor programului apelant, deci orice modificare a valorii parametrului in interiorul subprogramului este reflectata la revenire in programul apelant.

Salvarea starii masinii

Salvarea starii masinii consta in a salva starea registrelor CPU (in alte registre CPU prevazute in acest scop sau in memoria centrala) pentru a permite executarea unui alt program si la sfarsitul executiei acestuia, reluarea executiei primului.

Spre deosebire de macroinstructiuni, unde expandarea (inlocuirea apelului prin corpul macroinstructiunii) se realizeaza la traducere, in cazul subprogramelor este necesara salvarea starii masinii la apelul acestora.

intr-adevar, apelul unui subprogram consta in a trece controlul CPU-ului acestui subprogram, care se comporta ca un program independent si care trebuie sa fie capabil sa redea controlul programului apelant la sfarsitul executiei sale. Primele instructiuni ale subprogramului servesc la salvarea starii diverselor registre, iar ultimele instructiuni restaureaza aceste valori salvate, revenind la contextul anterior apelului.

Recursivitate

Un subprogram este recursiv daca poate sa se autoapeleze (direct sau indirect).

Problema unui subprogram recursiv este ca in timpul fiecarui apel, trebuie salvata starea masinii. Datorita faptului ca nu se poate utiliza aceeasi zona de memorie pentru salvare, se adopta o solutie bazata pe utilizarea unei stive care lucreaza dupa principiul LIFO Last In, First Out , in care se salveaza starea masinii pe masura activarii apelurilor recursive (este necesara o conditie de sfarsit care stopeaza apelurile recursive).

2 Limbaje de programare

Un limbaj este o modalitate de exprimare si comunicare a gandurilor. Exista o multitudine de limbaje: limbaje orale, scrise, limbajul semnelor (de exemplu, limbajul surdo-mutilor) si multe alte limbaje care utilizeaza diverse moduri de transmisie (de exemplu, limbajul albinelor).

Un limbaj informatic cuprinde:

un alfabet: multimea simbolurilor elementare disponibile;

nume sau identificatori: grupe de simboluri ale alfabetului (cu anumite restrictii precum numarul de caractere, tipul primului caracter etc.);

fraze sau instructiuni: secvente de nume si simboluri de punctuatie care respecta aspectele sintactice si semantice ale limbajului.

Limbajele informatice, spre deosebire de limbajele naturale, sunt structurate, riguros neambigue si pot fi definite in mod formal.

Limbajele de asamblare au fost primele limbaje informatice si ele depind de arhitectura sistemelor de calcul.

Limbajele evoluate HLL: High Level Languages au aparut mai tarziu si au permis comunicarea cu sistemul de calcul fara a tine seama de arhitectura sa.

in informatica se disting mai multe categorii de limbaje: limbajele de programare si limbajele de comanda sunt cele mai utilizate, dar exista de asemenea si limbaje de analiza si limbaje de specificare, care ajuta in timpul primelor faze de dezvoltare a produselor software.

Scrierea unui program se realizeaza prin utilizarea simbolurilor limbajului de programare pentru constituirea frazelor sau instructiunilor care trebuie sa respecte sintaxa limbajului.

Cele doua modalitati de reprezentare a sintaxei unui limbaj sunt:

notatia BNF Backus Naur Form

diagramele sintactice.

Prezentam in continuare un exemplu de sintaxa a unui limbaj foarte simplu care permite definirea identificatorilor (incep intotdeauna cu o litera), intregii fara semn, expresiile aritmetice simple si instructiunea de atribuire.

Pentru notatia BNF, semnul ' ½ ' indica o alternativa, semnele '< ' si ' > ' delimiteaza obiectele limbajului si semnul ' := ' indica atribuirea.

< litera > ::= a ½b ½c ½d . . .y ½z

< cifra > ::= 0 ½ ½ ½ ½ ½ ½ ½ ½ ½

< identificator > ::= < litera > ½ <identificator > < litera > ½

½ < identificator > < cifra >

< intreg > ::= < cifra > ½ < intreg > < cifra >

< termen > ::= < intreg > ½ < identificator >

< operator > ::= + ½ ½ ½

<expresie > ::= < termen > ½

½ <termen> < operator><expresie>

< atribuire > ::= < identificator > := < expresie >

Utilizand diagramele sintactice, prezentam acelasi exemplu de definire a sintaxei limbajului:

litera

identificator    litera

cifra

intreg    cifra

intreg

termen

identificator

+

-

operator

/

expresie    termen

operator

atribuire identificator := expresie

Concepte de baza ale limbajelor evoluate

Limbajele evoluate permit usurarea activitatii de programare printr-o apropiere de limbajul natural, dar cu respectarea exigentelor de rigoare si neambiguitate.

Primele concepte de baza ale limbajelor de programare evoluate se refereau la independenta fata de sistemul de calcul, ceea ce a permis elaborarea unor instructiuni posedand un nivel semantic superior celui al limbajului de asamblare.

Elaborarea de limbaje de programare evoluate a vizat inca de la inceput trei directii importante, si s-a concretizat prin trei categorii de limbaje:

a)      limbaje bazate pe conceptele de algoritm si prelucrarea datelor cu caracter stiintific (Fortran, Algol);

b)      limbaje bazate pe prelucrarea datelor (Cobol);

c)      limbaje bazate pe prelucrarea listelor (Lisp).

Limbajele din primele doua categorii sunt limbaje procedurale care furnizeaza o descriere detaliata a algoritmilor de rezolvare a problemelor, iar limbajele din a treia categorie sunt limbaje functionale, care subliniaza aspectul functional al rezolvarii unei probleme, fara a intra in detalii.

Orientarea algoritmica a permis in continuare dezvoltarea limbajelor Algol 60, Algol 68, Fortran II, Fortran IV, Fortran 66, Fortran 77, Fortran 90, Pascal, C, Modula-2, Ada si C++, care furnizeaza metodologii bazate pe conceptele de programare structurata, abstractizare, modularitate etc.

A doua orientare, bazata pe prelucrarea datelor a ramas fidela 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 baza in domeniul inteligentei artificiale, a rezultat din abordarea functionala si aduce nou, in afara de prelucrarea listelor, un mecanism de inferenta foarte util pentru realizarea sistemelor expert.

Asistam astazi la o oarecare convergenta intre limbajele orientate obiect si bazele de cunostinte, ceea ce permite gruparea si unificarea conceptelor de baza ale diverselor orientari.



Vom prezenta in continuare o scurta descriere pentru cateva limbaje de programare dintre cele mai utilizate:

Fortran Formula Translator este primul limbaj algoritmic, utilizat in principal pentru rezolvarea problemelor cu caracter stiintific. El produce cod eficace, utilizeaza o mare cantitate de biblioteci matematice si a introdus concepte importante, ca de exemplu, structurarea expresiilor aritmetice, subprograme, compilarea independenta a subprogramelor. Limbajul a evoluat mereu, versiunea Fortran 90 permite programarea paralela si concurenta specifica supercalculatoarelor.

Cobol Common Business Oriented Language este limbajul cel mai utilizat in lume, si este adaptat aplicatiilor de gestiune permitand un acces usor la fisiere si baze de date. Inconvenientele utilizarii sale provin din aspectul 'stufos' al scrierii si dificultatea de structurare a programelor.

Algol Algorithmic Oriented Language este un limbaj care a avut o influenta primordiala asupra limbajelor actuale. Definit pentru aplicatii stiintifice, limbajul nu a reusit sa se impuna din cauza complexitatii sale, lipsei de soliditate a intrarilor/iesirilor si lipsa eficacitatii. Totusi, Algol a introdus conceptul de structurare, cu structuri de blocuri, structuri de control, proceduri, recursivitate. Este primul limbaj definit in notatia BNF si a evoluat in Algol 60, Algol 68, Algol W dar nu a reusit sa paraseasca mediul academic.

Lisp List Processing a fost conceput pentru manipularea expresiilor si functiilor simbolice. Caracteristicile sale sunt: capacitatea de tratare a listelor, un numar mic de operatori de baza, un numar mare de paranteze si recursivitatea care joaca un rol de seama in parcurgerea listelor. Limbajul este utilizat curent in inteligenta artificiala. Datorita lipsei de eficacitate pe sisteme de calcul traditionale, anumiti constructori au dezvoltat masini Lisp, care accepta acest limbaj ca limbaj masina, avand o arhitectura particulara, bazata pe notiunea de stiva.

Basic Beginner's All-purpose Symbolic Instruction Code este un limbaj foarte rudimentar, care a fost dezvoltat doar in scop didactic. El a devenit un limbaj foarte raspandit datorita dezvoltarii microcalculatoarelor care, la inceput nu aveau capacitatea de a utiliza alte limbaje.

PL/1 Programming Language number 1 este o realizare ambitioasa, un limbaj aproape universal, menit sa inlocuiasca limbajele Fortran, Algol si Cobol utilizate in acea epoca. Din cauza complexitatii sale, lipsa de omogenitate si de rigoare limbajul nu a cunoscut o mare raspandire, limitandu-se la calculatoarele din familia IBM.

Pascal, care poarta numele matematicianului francez creator al uneia dintre primele masini aritmetice de calcul din secolul XVII, a fost dezvoltat de catre elvetianul Niklaus Wirth. Acest limbaj provenit din Algol caruia ii preia conceptele, este bazat pe o mare simplitate si este destinat inainte de toate invatarii programarii, bucurandu-se de un mare succes.

Modula-2 este inca un limbaj dezvoltat de Wirth. Acest limbaj este un fidel descendent al limbajului Pascal, caruia ii adauga notiunea de modularitate care permite compilarea independenta a modulelor.

Smalltalk este un limbaj orientat obiect care caracterizeaza o noua tendinta de programare bazata pe conceptul de obiect. Limbajul permite o interactiune grafica cu sistemul de calcul, bazata pe utilizarea ferestrelor si a meniurilor, ceea ce constituie o inovatie in domeniul programarii.

Prolog Programmation Logique este un limbaj (elaborat la Marsilia in 1972 de catre Colmerauer) care preia conceptele limbajului Lisp, adaugand un mecanism de inferenta utilizat la realizarea sistemelor expert. Japonezii si-au pus mari sperante in acest limbaj pentru grandiosul proiect de sisteme de calcul de generatia a cincea.

C, un succesor al limbajelor BCPL si B, este un limbaj orientat spre programare de sistem. Succesul limbajului se datoreaza utilizarii 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 intr-o linie a instructiunilor foarte complexe, care devin aproape ilizibile.

Ada, al carui nume aduce omagiu Adei Byron (sec. XIX), considerata ca prima informaticiana, este un limbaj conceput pentru departamentul apararii al SUA. El preia conceptele limbajelor Pascal si Modula-2, adaugand concepte de timp real, paralelism, genericitate si gestiunea exceptiilor.

C++ este un succesor al limbajului C, dezvoltat de catre Bjarne Stroustrup la inceputul anilor '80. Acest limbaj poate fi vazut ca o evolutie naturala a limbajului C, reia conceptele acestui limbaj, la care se adauga un anumit numar de concepte legate de programarea orientata obiect, ca de exemplu, notiunea de clasa de obiecte, mostenire intre clase etc.

Orientarea obiect

Evolutia programarii clasice se poate rezuma in felul urmator:

a)      Programarea procedurala procedural programming : accentul este pus pe algoritmi, codul este repartizat in proceduri, iar structurile de date nu sunt luate in considerare. Este cazul limbajelor Fortran sau C.

b)      incapsularea si abstractizarea datelor data hidding and abstraction : apare notiunea de modul, care permite descompunerea codului in diferite module. Datele sunt inchise in interiorul modulelor ceea ce constituie tipurile abstracte de date ADT: Abstract Data Type . Practic, un ADT poate fi vazut ca o 'cutie neagra', iar seviciile (se numesc metode) sunt oferite prin intermediul unei interfete. Este cazul limbajelor Modula-2 si Ada.

c)      Programarea orientata obiect object oriented programming : reia conceptele de tipuri abstracte de date dar se insista asupra notiunii de reutilizare a obiectelor sistemului. in acest sens, se determina principalele modele de date necesare, care se vor numi clase de obiecte si in continuare se stabilesc metodele care vor manipula aceste modele. Un program se compune deci dintr-un ansamblu de obiecte care interactioneaza intre ele trimitandu-si mesaje care activeaza metodele specifice fiecarei 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 functiunilor disponibile asupra structurilor de date si nu prin implementarea lor. intr-un limbaj de programare orientat obiect functiunile se numesc metode.

Clase si obiecte

O clasa de obiecte corespunde implementarii unui tip abstract de date. Definitia unei clase descrie comportamentul tipului sau abstract prin specificarea interfetei tuturor operatiilor (metode) care pot fi aplicate asupra tipului abstract.

Definitia unei clase comporta de asemenea detalii cu privire la implementarea unor astfel de structuri de date sau codul sursa care implementeaza metodele.

Un obiect object este o variabila a carei tip este o clasa. El reprezinta o instanta (realizare) a unei clase. Actiunile pot fi aplicate asupra acestui obiect invocand metodele definite in clasa, care se realizeaza printr-un procedeu numit trimitere de mesaje obiectelor clasei.

Clasele sunt entitati definite in codul sursa al unui program, ele descriu de o maniera statica o multime de obiecte (pot fi considerate si ca tipuri de date), in timp ce obiectele sunt elementele dinamice, ele nu exista decat la executie si corespund instantelor clasei.

Mesaje

Obiectele pot comunica intre ele trimitandu-si mesaje prin care se solicita efectuarea unei anumite operatii asupra acestor obiecte. Multimea tipurilor de mesaje proprii unui obiect corespunde interfetei sale (specificata prin definitia clasei).

Polimorfism

Polimorfismul permite efectuarea unei actiuni prin trimiterea unui mesaj la un obiect pentru care sunt posibile mai multe instante de executie. Aceasta capacitate este foarte importanta atunci cand acelasi mesaj poate fi indeplinit in moduri diferite pentru tipuri diferite de obiecte.

Limbajele orientate obiect permit trimiterea mesajelor identice spre obiecte care apartin unor clase diferite (dar derivate din aceeasi clasa de baza).

Polimorfismul consta in esenta in posibilitatea asocierii mai multor implementari ale aceluiasi mesaj, iar sistemul de calcul trebuie sa fie in masura sa stabileasca implementarea corespunzatoare mesajului transmis.

Acesta decizie (constand in legarea mesajului de implementarea corespunzatoare) se poate lua fie la compilare early sau static bilding , fie la executie late sau dynamic bilding

Mostenirea si ierarhizarea claselor

Prin mecanismul mostenirii inheritance , programarea orientata obiect permite definirea subclaselor. O subclasa, numita si clasa derivata permite caracterizarea comportamentului unei multimi de obiecte care mostenesc caracteristicile clasei lor 'parinte', dar care poate de asemenea sa posede caracteristici particulare proprii, pe care 'parintele' nu le are.

Utilizarea subclaselor permite diminuarea costului si complexitatii programelor, deoarece subclasele faciliteaza reutilizarea claselor existente, permitand in acelasi timp modificarea lor.

Genericitate

Genericitatea se exprima prin capacitatea de a defini clase parametrizabile. De exemplu, presupunem ca este necesara o stiva de numere intregi si o stiva de numere reale. in locul definirii celor doua tipuri de stiva se va proceda la definirea unei clase parametrizata numita stiva, din care se vor genera cele doua clase dorite.

Genericitatea si mostenirea corespund unor necesitati diferite si genereaza structuri diferite: mostenirea favorizeaza rafinamente succesive ale unei aceeasi clase rezultand astfel o structura pe verticala, in timp ce genericitatea permite definirea unei clase de baza parametrizata care se poate instantia de mai multe ori cu tipuri diferite, rezultand astfel o structura pe orizontala. Figura urmatoare evidentiaza aceasta situatie.

Mostenire Genericitate



structura verticala structura orizontala

Inteligenta artificiala si sistemele expert

Inteligenta artificiala este domeniul informaticii care-si propune simularea pe sistemele de calcul a comportamentelor inteligente ale fiintei umane. Aceeasta activitate implica domeniile perceperii, intelegerii, luarii deciziilor si cel al invatarii.

Aceasta orientare este foarte ambitioasa si a condus la unele rezultate notabile, in special in unele domenii, ca de exemplu: teoria jocurilor, demonstrarea teoremelor, recunoasterea formelor, recunoasterea parolelor, intelegerea limbajelor naturale, rezolvarea problemelor care necesita expertiza legata de un domeniu specific (de exemplu, diagnosticul medical), matematici simbolice etc.

Inteligenta artificiala trebuie sa permita rezolvarea problemelor pentru care abordarea algoritmica este ineficienta sau chiar imposibil de aplicat. Un program al inteligentei artificiale se caracterizeaza prin utilizarea simbolurilor in locul informatiilor alfanumerice.

Sisteme expert

Sistemele expert constituie cu siguranta domeniul inteligentei artificiale care a cunoscut cea mai mare dezvoltare. Un sistem expert este un program care utilizeaza intensiv cunostinta in scopul rezolvarii problemelor care necesita in mod normal expertiza umana.

intr-un sistem expert exista o separatie neta intre programe si cunostinte. Arhitectura de baza a unui sistem expert cuprinde trei parti:

a)      Baza de fapte este un fel de baza de date care regrupeaza faptele si asertiunile vizand problema tratata;

b)      Baza de reguli contine cunostintele care permit manipularea faptelor din baza de fapte. Aceste cunottinse se exprima sub forma de reguli de productie. O regula de productie comporta o parte stanga, exprimand o conditie (daca) si o parte dreapta continand concluzii (atunci . . .);

c)      Motorul de inferenta exploateaza baza de cunostinte (baza de fapte + baza de reguli) asociind faptele si regulile pentru a formula un rationament asupra problemei puse. Pentru aceasta, pornind de la baza de fapte, el determina multimea regulilor a caror parte stanga este verificata, faptele continute in partea dreapta adagandu-se la baza de fapte. in continuare, motorul de inferenta aplica aceste reguli (inlantuire inainte) pentru a ajunge la o concluzie, procesul oprindu-se cand nu se mai pot genera fapte noi. Se poate de asemenea porni de la concluzie, inferentele propagandu-se invers (inlantuire inapoi). Ele determina noi subscopuri mai simplu de verificat pana la gasirea partilor stangi ale regulilor corespunzatoare faptelor din baza de fapte. Un anumit numar de limbaje (Lisp si Prolog) permit dezvoltarea cu usurinta a sistemelor expert simple.

Elementele unui limbaj de programare

Elementele de baza ale unui limbaj de programare sunt:

a)      Datele: sunt definite in program si sunt caracterizate prin nume, tip si valoare. Numele este un identificator prin care se desemneaza data respectiva, tipul datei serveste la specificarea proprietatilor sau atributelor acesteia, iar valoarea se utilizeaza in diversele actiuni ale programului;

b)      Actiunile limbajului servesc pentru definirea algoritmului care trebuie sa rezolve problema pusa si sunt de mai multe tipuri:

atribuiri, care permit afectarea de valori pentru variabile (valorile pot fi modificate);

structuri de control care cuprind trei tipuri de baza: secventa, selectia si iteratia sau ciclul;

structuri de bloc care permit structurarea programului utilizand, de exemplu, module, proceduri sau functii;

intrari-iesiri care permit schimburi de date cu perifericele.

3 Etapele dezvoltarii unui program

Dezvoltarea unui program, de la analiza problemei pana la punerea sa la punct, necesita numeroase instrumente software constituite intr-un mediu de programare, care utilizeaza serviciile sistemului de operare, in special sistemul de gestiune al fisierelor.

Elementele clasice ale unui mediu de programare sunt urmatoarele: editorul de texte, traducatorul (compilator sau asamblor), editorul de legaturi, programul incarcator si programul corector.

Editorul de texte

Un editor de texte text editor este un program interactiv care permite preluarea unui text pornind de la tastatura si stocarea sa intr-un fisier. Informatiile continute in fisier sunt de tip text, adica o multime de caractere, in general structurate in linii.

Principalele functiuni ale unui editor de texte sunt:

vizualizarea unei parti a textului;

deplasarea si pozitionarea in fisier (se indica pozitia curenta);

modificarea textului prin inserare, modificare, stergere;

regasirea sirurilor de caractere particulare.

Editorul poate fi utilizat atat pentru tastarea textului sursa al unui program cat si pentru introducerea datelor necesare programului.

Exista multe tipuri de editoare, noi vom evidentia doua dintre cele mai importante:

a)      editor sintactic, adaptat prelucrarii programelor sursa, care verifica sintaxa programelor pe masura tastarii acestora, permitand de asemenea gestionarea automata a structurilor sintactice proprii limbajului de programare utilizat;

b)      procesor de texte, destinat tratarii textelor. Acest tip de editor ofera functionalitati mult mai pronuntate pentru manipularea caracterelor: utilizarea literelor accentuate, fonturi diferite (adica diferite seturi de caractere), alinierea textului, scriere de scrisori, inserare de desene etc., mai general se zice ca aceste editoare ofera facilitati de punere in pagina pentru scrierea unei scrisori, a unui articol, carte etc.



Compilatorul

Un compilator este un program sistem care traduce un program sursa scris intr-un limbaj de programare de nivel inalt in program obiect.

Activitatea compilatorului se divide in doua mari componente:

a)      faza de analiza, care cuprinde urmatoarele etape:

analiza lexicala

analiza sintactica

analiza semantica

b)      faza de sinteza, care cuprinde urmatoarele etape:

generarea codului intermediar

optimizarea codului

generarea codului obiect

Activitatea compilatorului este prezentata schematic astfel:

program

sursa

tabela de analiza lexicala arbore sintactic

simboluri

analiza sintactica

analiza semantica


generarea codului

intermediar


optimizarea

codului

generarea codului

obiect

Compilator

program obiect

in timpul fazei de analiza, compilatorul trebuie sa prevada selectarea si tratarea erorilor.

Analiza lexicala

Analiza lexicala este prima faza a compilarii. Rolul sau major consta in citirea secventei de caractere care constituie programul sursa si producerea unor secvente de elemente sintactice ale limbajului.

Identificatorii, de exemplu numele de variabile, sau de proceduri ca si atributele lor sunt stocate intr-o tabela de simboluri, in timp ce informatiile inutile pentru compilator (comentariile) sunt eliminate.

Analiza sintactica

Analizorul sintactic primeste o lista de elemente sintactice (cuvinte rezervate, identificatori, operatori aritmetici, semne de punctuatie etc.) elaborata de catre analizorul lexical.

El verifica daca aceasta lista este corecta in raport cu sintaxa limbajului si pornind de la aceste elemente, analizorul sintactic genereaza arborele sintactic al programului.

Sunt posibile doua abordari pentru generarea arborelui sintactic:

ascendenta: se analizeaza elementele constitutive ale frazei de tratat si gasirea tuturor regulilor care permit ascensiunea spre radacina arborelui;

descendenta: se porneste de la radacina si se aplica regulile care permit construirea frazei dorite.

Analiza semantica

Analiza semantica se ocupa de analiza sensului si a semnificatiei frazelor limbajului, utilizand arborele sintactic pentru a identifica operatorii si operanzii instructiunilor.

Sarcina principala a unui analizor semantic este verificarea concordantei tipurilor, ceea ce revine la a verifica daca fiecare operator actioneaza asupra operanzilor care sunt autorizati prin limbaj. Pentru efectuarea acestor verificari, analizorul semantic utilizeaza informatiile care sunt stocate in tabela de simboluri.

Generarea codului intermediar

Dupa etapele fazei de analiza, se procedeaza la generarea programului in cod obiect. O metoda destul de raspandita consta in divizarea acestei sarcini in doua etape: generarea codului intermediar si generarea codului obiect.

Codul intermediar se poate defini ca un cod al unei masini abstracte, care trebuie sa posede doua proprietati: sa fie usor de generat pornind de la arborele sintactic al unui program si sa fie usor de tradus in cod obiect.

Deci, pornind de la arborele sintactic al unui program, compilatorul genereaza un flux de instructiuni simple care se aseamana cu macroinstructiunile, dar contrar asamblorului, acestea nu fac referire explicita la registrele sistemului de calcul.

Optimizarea codului

Optimizarea codului consta in ameliorarea codului generat pentru a-l face mai rapid de executat si mai putin 'incurcat' in memorie, si aceasta vizeaza in special eliminarea redundantelor si evaluarea expresiilor care utilizeaza constante.

Deoarece optimizarea conduce la o crestere substantiala a timpului de compilare, se prefera evitarea acestei faze in timpul dezvoltarii si punerii la punct a programelor.

Optimizarea codului joaca un rol determinant pentru sistemele de calcul care utilizeaza un procesor RISC, datorita complexitatii compilatoarelor pentru astfel de masini, care utilizeaza un numar mare de registre in vederea reducerii numarului de accese la memoria centrala.

Generarea codului obiect

Generarea codului obiect este faza finala a compilarii, care genereaza codul obiect relocabil, adica relativ la originea 0. Fiecare instructiune a codului intermediar este tradusa intr-o secventa de instructiuni in cod obiect. Generarea codului obiect atribuie pozitii in memorie pentru datele si instructiunile programului.

Tabela de simboluri

in timpul compilarii este necesara descrierea identificatorilor si a caracteristicilor acestora. Tabela de simboluri permite gruparea acestor informatii care sunt puse la dispozitia diferitelor faze ale compilatorului.

in aceasta tabela se gasesc numele variabilelor, constantelor si procedurilor. Fiecarei intrari din tabela i se asociaza o inregistrare care contine numele obiectului considerat si caracteristicile proprii (tip, adresa numerica, numarul si tipul parametrilor etc.). Accesul la aceasta tabela trebuie sa fie rapid, deoarece toate fazele compilarii pot utiliza tabela de simboluri.

Tratarea erorilor

in activitatea practica de programare s-a constatat ca este dificila scrierea programelor fara erori si din aceasta cauza, un bun compilator trebuie sa faca posibila detectarea si corectarea acestor erori.

La sfarsitul compilarii se intocmeste un raport al erorilor depistate si se incearca specificarea cauzei care a generat eroarea precum si pozitia sa in cadrul textului sursa.

Un program scris intr-un limbaj de pogramare evoluat poate contine erori de natura diferita:

a)      erori lexicale: erori de ortografiere a identificatorilor sau cuvintelor rezervate, caractere ilegale etc.

b)      erori sintactice: constituie majoritatea erorilor de programare si se refera la: expresii aritmetice sau logice incorecte, erori de structurare a blocurilor, lipsa separatorilor etc.

c)      erori semantice: identificatori nedeclarati, incompatibilitate intre operatori si operanzi etc.

d)      erori logice: erori aritmetice de tipul impartirii cu zero, radacina patrata dintr-un numar negativ, depasirea limitelor unui tablou, ciclu infinit, adresare incorecta etc.

Erorile din primele trei categorii sunt detectate de compilator in timpul analizei cu acelasi nume (analiza lexicala, sintactica, semantica), si sunt relativ usor de corectat deoarece compilatorul indica prezenta lor.

Erorile logice sunt vizibile doar la executie si au ca efect fie efectuarea unor calcule eronate, fie oprirea executiei programului. Acestea sunt erorile cele mai dificil de detectat si corectat, si la fiecare tentativa de corectare trebuie reluat ciclul compilare - executie - testare.

Editorul de legaturi

Un editor de legaturi linker, linkage editor este un produs software care permite combinarea mai multor programe obiect, obtinandu-se un singur modul obiect.

Figura urmatoare prezinta un exemplu de editare de legaturi pentru un program care contine doua subprograme traduse si stocate in fisiere separate, si care face de asemenea apel la doua module de biblioteca care sunt traduse in prealabil si conservate in cod obiect.

subprogram program principal subprogram

(cod sursa) (cod sursa) (cod sursa)


traducere traducere traducere

modul de modul de

subprogram program principal subprogram biblioteca biblioteca

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


editare de legaturi


program

complet

executabil

Dezvoltarea unor programe complexe se realizeaza prin descompunerea acestora in module care se traduc independent, deci un program poate fi constituit din mai multe fisiere (sau subprograme), unul dintre fisiere continand in mod obligatoriu programul principal.

Toate aceste fisiere sunt traduse separat, ele pot utiliza subprograme care se gasesc in alte fisiere, ceea ce da nastere la referinte exterioare.

Exista doua tipuri de referinte exterioare:

a)      posibilitatea ca un modul sa apeleze alt modul sau subprogram de biblioteca;

b)      posibilitatea ca un modul sa fie referit de un alt modul;

Referintele exterioare unui modul ridica probleme deosebite pentru programul traducator care nu poate satisface referintele exterioare si de aceea intocmeste o lista a acestora pe care o transmite editorului de legaturi.

Editorul de legaturi preia modulele independente, le grupeaza si satisface toate referintele exterioare pentru a forma un program complet, care este executabil.

Programul incarcator

Programul obiect care rezulta in urma editarii de legaturi, trebuie sa fie incarcat in memoria calculatorului pentru a putea fi executat. Programul incarcator loader , care este de obicei cuplat cu editorul de legaturi realizeaza incarcarea programului obiect la adresa sa de incarcare.

Exista doua tipuri de programe incarcatoare:

a)      incarcator absolut, specific vechilor sisteme de calcul care permite incarcarea programului (unic in memorie) la o adresa fixata in avans, ca si toate adresele din cadrul programului.

b)      incarcator relocabil, specific noilor tipuri de sisteme multiprogramate, care utilizeaza pentru incarcare in memorie tehnica relocarii. O modalitate de realizare a relocarii este aceea a utilizarii indicatorului de relocare de catre programul traducator in campul de adresa al instructiunii. Relocarea se mai poate realiza prin intermediul unui registru de baza, astfel:

se traduce programul in raport cu adresa 0 si se realizeaza editarea de legaturi;

se alege un registru de baza printre cele disponibile;

se depune in registrul de baza adresa de baza (adresa absoluta a programului);

se incarca programul in memorie, pornind de la adresa de baza, fara modificarea adreselor programului. in timpul executiei, la fiecare referire a unei adrese, sistemul de calcul efectueaza operatiile:

adresa efectiva = adresa de baza + adresa referita





Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1143
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved