|
Politica de confidentialitate |
|
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
Limbaje de programare | ||||||
|
||||||
r1c14cu 2.1 Comunicatia om-masina 2.2 Tipuri de numere reprezentabile in calculator 2.3 Valori de adevar 2.4 Siruri de caractere 2.5 Tipuri primitive de valori ale unui limbaj de programare 2.6 Tablouri de elemente 2.7 Expresii de calcul 2.8 Variabile 2.9 Instructiuni 2.1 Comunicatia om-masina Pentru a executa un program de calculator este necesar sa putem comunica cu unitatea centrala pentru a-i furniza instructiunile necesare. Cel mai simplu mod de a le comunica este inscrierea codului instructiunilor direct in memoria calculatorului de unde pot fi citite de catre unitatea centrala. Aceasta cale este insa extrem de anevoioasa pentru programator pentru ca el trebuie sa invete sa se exprime coerent intr-un limbaj ale carui componente de baza sunt coduri numerice. O alternativa mai buna este folosirea unui limbaj de comunicatie format dintr-un numar foarte mic de cuvinte si caractere speciale impreuna cu un set de conventii care sa ajute la descrierea numerelor si a operatiilor care trebuiesc executate cu aceste numere. Limbajul trebuie sa fie atat de simplu incat calculatorul sa poata traduce singur, prin intermediul unui program numit compilator, frazele acestui limbaj in instructiuni ale unitatii centrale. Ori de cate ori vom imagina un nou limbaj de comunicatie cu calculatorul va trebui sa cream un nou program compilator care sa traduca acest limbaj in instructiuni ale unitatii centrale, numite uneori si instructiuni masina. In realitate folosirea termenului de limbaj de comunicatie nu este extrem de fericita pentru ca de obicei noi doar instruim calculatorul ce are de facut si cum trebuie sa faca acel lucru, fara sa-i dam vreo sansa acestuia sa comenteze sarcinile primite. In continuare vom numi aceste limbaje simplificate limbaje de programare pentru a le deosebi de limbajele pe care le folosim pentru a comunica cu alti oameni si pe care le vom numi limbaje naturale. Limbajele de programare trebuie sa ne ofere o cale de descriere a modulului in care dorim sa reprezentam informatiile cu care lucreaza programul, o cale de a specifica operatiile care trebuiesc executate cu aceste informatii si o cale de a controla ordinea in care sunt executate aceste operatii. In plus, limbajele de programare trebuie sa respecte urmatorul principiu fundamental: rezultatul executiei unei comenzi dintr-un limbaj de programare trebuie sa fie complet determinat. Asta inseamna ca in limbajele de programare nu este permisa nici o forma de ambiguitate a exprimarii. Informatiile reprezentate in memoria calculatorului si prelucrate de catre un program scris intr-un limbaj de programare se numesc date. Tipurile de date care se pot descrie direct cu un anumit limbaj de programare se numesc tipurile de date elementare ale limbajului. Operatiile elementare posibil de exprimat intr-un limbaj de programare se numesc instructiuni ale limbajului. Limbajele de programare au evoluat foarte mult de la inceputurile calculatoarelor. Tendinta generala este aceea de apropiere treptata de limbajele naturale si de modul in care acestea descriu si utilizeaza informatiile. Abstractiile exprimabile cu ajutorul limbajelor de programare sunt din ce in ce mai multe si cuprind o gama din ce in ce mai larga a notiunilor fundamentale cu care opereaza mintea umana. Un alt aspect in care se reflecta evolutia limbajelor de programare este reprezentat de cresterea profunzimii si calitatii controlului pe care compilatoarele il fac in momentul traducerii din limbaj de programare in limbaj masina, astfel incat sansa de a gresi la descrierea programului sa fie cat mai mica. Cu toate ca limbajele de programare au facut pasi esentiali in ultimul timp, ele au ramas totusi foarte departe de limbajele naturale. Pentru a programa un calculator, trebuie sa poti gandi si sa poti descrie problemele intr-unul dintre limbajele pe care acesta le intelege. Din acest motiv, scrierea programelor continua sa ramana o activitate rezervata unui grup de initiati, chiar daca acest grup este in continua crestere. 2.2 Tipuri de numere reprezentabile in calculator Desi toate informatiile reprezentabile direct in memoria calculatorului sunt doar numere naturale, constructorii calculatoarelor de astazi au diversificat tipurile acestora prin stabilirea unor conventii de reprezentare pentru numerele negative, reale si pentru caractere. Aceste conventii folosesc numerele naturale pentru reprezentarea celorlalte tipuri de numere. Uneori, reprezentarile ocupa mai mult de un octet in memoria calculatorului, dimensiunile obisnuite fiind 1, 2, 4 sau 8 octeti. Sau, echivalent, 8, 16, 32 sau 64 de biti. Numerele naturale sunt intotdeauna pozitive. Pentru reprezentarea unui numar intreg cu semn pot fi folosite doua numere naturale. Primul dintre acestea, avand doar doua valori posibile, reprezinta semnul numarului si se poate reprezenta folosind o singura cifra binara. Daca valoarea acestei cifre binare este 0, numarul final este pozitiv, iar daca valoarea cifrei este 1, numarul final este negativ. Al doilea numar natural folosit in reprezentarea numerelor intregi cu semn contine valoarea absoluta a numarului final. Aceasta conventie, desi are dezavantajul ca ofera doua reprezentari pentru numarul zero, un zero pozitiv si altul negativ, este foarte aproape de reprezentarea numerelor cu semn folosita de calculatoarele moderne. In realitate, conventia care se foloseste pentru reprezentarea numerelor intregi cu semn este asa numita reprezentare in complement fata de doi. Aceasta reprezinta numerele negative prin complementarea valorii lor absolute bit cu bit si apoi adunarea valorii 1 la numarul rezultat. Complementarea valorii unui bit se face inlocuind valoarea 1 cu 0 si valoarea 0 cu 1. Daca avem de exemplu numarul 1, reprezentat pe un octet ca un sir de opt cifre binare 00000001, complementarea bitcu bit a acestui numar este numarul reprezentat pe un octet prin11111110. Pentru a reprezenta valoarea -1 nu ne mai ramane altceva de facut decat sa adunam la numarul rezultat in urma complementarii un 1 si reprezentarea finala a numarului intreg negativ -1 pe un octet este 11111111. In aceasta reprezentare, numarul 00000000 binar reprezinta numarul 0 iar numarul 10000000, care mai inainte reprezenta numarul 0 negativ, acum reprezinta numarul -128. Intr-adevar, numarul 128 se poate reprezenta in binar prin 10000000. Complementat, acest numar devine 01111111 si dupa adunarea cu 1, 10000000. Observati ca numerele 128 si -128 au aceeasi reprezentare. Conventia este aceea ca se pastreaza reprezentarea pentru -128 si se elimina cea pentru 128. Alegerea este datorata faptului ca toate numerele pozitive au in primul bit valoarea 0 si toate cele negative valoarea -1. Prin transformarea lui 10000000 in -128 se pastreaza aceasta regula. Folosind reprezentarea in complement fata de doi, numerele intregi reprezentabile pe un octet sunt in intervalul -128 pana la 127, adica -27 pana la 27 -1. In general, daca avem o configuratie de n cifre binare, folosind reprezentarea in complement fata de doi putem reprezenta numerele intregi din intervalul inchis -2n-1 pana la 2n-1-1. In practica, se folosesc numere intregi cu semn reprezentate pe 1 octet, 2 octeti, 4 octeti si 8 octeti, respectiv 8, 16, 32 si 64 de biti. Daca dorim sa reprezentam un numar real in memoria calculatorului, o putem face memorand cateva cifre semnificative ale acestuia plus o informatie legata de ordinul sau de marime. In acest fel, desi pierdem precizia numarului, putem reprezenta valori foarte aproape de zero sau foarte departe de aceasta valoare. Solutia de reprezentare este aceea de a pastra doua numere cu semn care reprezinta cifrele semnificative ale numarului real respectiv un exponent care da ordinul de marime. Cifrele reprezentative ale numarului se numesc impreuna mantisa. Numarul reprezentat in final este 0.mantisaEexponent. E are valoarea 256 spre deosebire de exponentul 10 pe care il folosim in uzual. Daca valoarea exponentului estefoarte mare si pozitiva, numarul real reprezentat este foarte departe de 0, inspre plus sau inspre minus. Daca exponentul este foarte mare in valoare absolutasi negativ, numarul real reprezentat este foarte aproape de zero. In plus, pentru a ne asigura de biunivocitatea corespondentei, avem nevoie de o conventie care sa stabileasca faptul ca virgula este plasata imediat in fata cifrelor semnificative si ca in fata acesteia se gaseste o singura cifra 0. Numerele care respecta aceasta conventie se numesc numere normalizate. Aceasta mutare a virgulei imediat in fata cifrelor semnificative poate sa presupuna modificarea exponentului care pastreaza ordinul de marime al numarului. Numerele fractionare se numesc in limbajul calculatoarelor numere in virgula mobila sau numere flotante tocmai din cauza acestei eventuale ajustari a pozitiei virgulei. Cu aceasta conventie nu se poate reprezenta orice numar real, dar se poate obtine o acoperire destul de buna a unui interval al axei numerelor reale cu valori. Atunci cand incercam sa reprezentam in memoria calculatorului un numar real, cautam de fapt cel mai apropiat numar real reprezentabil in calculator si aproximam numarul initial cu acesta din urma. Ca rezultat, putem efectua calcule complexe cu o precizie rezonabila. Descrierea conventiei exacte de reprezentare a numerelor reale in calculator depaseste cadrul acestei prezentari. Unele dintre detalii pot fi diferite de cele prezentate aici, dar principiul este exact acesta. Conventia de reprezentare a numerelor reale este standardizata de IEEE in specificatia 754. Desigur, in unele probleme, lipsa de precizie poate sa altereze rezultatul final, mai ales ca, uneori, erorile se cumuleaza. Exista de altfel o teorie complexa, analiza numerica, conceputa pentru a studia caile prin care putem tine sub control aceste erori de precizie. Putem creste precizia de reprezentare a numerelor reale prin marirea spatiului rezervat mantisei. In acest fel marim numarul de cifre semnificative pe care il pastram. In general, unitatile centrale actuale lucreaza cu doua precizii: numerele flotante simple, reprezentate pe 4 octeti si numerele flotante duble, reprezentate pe 8 octeti. 2.3 Valori de adevar Uneori, avem nevoie sa memoram in calculator valori de adevar. Exista doar doua valori de adevar posibile: adevarat si fals. Uneori, aceste valori de adevar se mai numesc si valori booleene. Desi pentru memorarea acestor valori este suficienta o singura cifra binara, in practica aceste valori sunt reprezentate pe un intreg octet pentru ca operatiile la nivel de bit sunt de obicei prea lente. Valorile booleene se pot combina intre ele prin operatii logice: “si”, “sau”, "negatie”. 2.4 Siruri de caractere Dupa cum spuneam mai inainte, desi orice informatie reprezentata in calculator este in final un numar, mintea umana este obisnuita sa lucreze cu cuvinte si imagini mai mult decat cu numere. De aceea, calculatorul trebuie sa aiba posibilitatea sa simuleze memorarea informatiilor de acest fel. In ceea ce priveste cuvintele, ele pot fi reprezentate in memoria calculatorului prin caracterele care le formeaza. Insiruirea acestor caractere in memorie duce la notiunea de sir de caractere. Pe langa caracterele propriu-zise care construiesc cuvantul, un sir de caractere trebuie sa poata memora si numarul total de caractere din sir, cu alte cuvinte lungimea sa. In realitate, un sir de caractere nu contine doar un singur cuvant ci este o insiruire oarecare de caractere printre care pot exista si caractere spatiu. De exemplu, urmatoarele secvente sunt siruri de caractere: "Acesta este un sir de caractere", "Eugen", "ABCD 0123", "HGkduI;.!". Fiecare limbaj de programare trebuie sa ofere o conventie de reprezentare a sirurilor de caractere in calculator precum si o conventie de scriere a acestora in program. De obicei, cea de-a doua conventie este aceea ca sirul de caractere trebuie inchis intre apostroafe sau ghilimele. In paragraful anterior de exemplu, am folosit ghilimele pentru delimitarea sirurilor de caractere. Conventia de reprezentare in memorie difera de la un limbaj de programare la altul prin modul in care este memorata lungimea sirului, precum si prin conventia de reprezentare in memorie a caracterelor: ASCII, Unicode sau alta. Impreuna cu fiecare tip de data, limbajele de programare trebuie sa defineasca si operatiile ce se pot executa cu datele de tipul respectiv. Pentru sirurile de caractere, principala operatie este concatenarea. Prin concatenarea a doua siruri de caractere se obtine un sir de caractere care contine caracterele celor doua siruri puse in prelungire. De exemplu, prin concatenarea sirurilor de caractere "unu" si ", doi", rezulta sirul de caractere: "unu, doi". 2.5 Tipuri primitive de valori ale unui limbaj de programare Vom numi tipuri primitive de valori ale unui limbaj acele tipuri de valori care se pot reprezenta direct intr-un anumit limbaj de programare. Pentru ca informatia reprezentabila sa fie independenta de calculatorul pe care ruleaza programele, un limbaj de programare trebuie sa-si defineasca propriile sale tipuri primitive, eventual diferite de cele ale unitatii centrale, tipuri care sa generalizeze tipurile primitive ale tuturor unitatilor centrale. Pentru fiecare dintre aceste tipuri primitive de valori, limbajul trebuie sa defineasca dimensiunea locatiei de memorie ocupate, conventia de reprezentare si multimea valorilor care pot fi reprezentate in aceasta locatie. In plus, limbajul trebuie sa defineasca operatiile care se pot executa cu aceste tipuri si comportarea acestor operatii pe seturi de valori diferite. Tipurile primitive ale unui limbaj sunt de obicei: numere de diverse tipuri, caractere, siruri de caractere, valori de adevar si valori de tip referinta. Totusi, acest set de tipuri primitive, denumirea exacta a tipurilor si operatiile care se pot executa cu ele variaza mult de la un limbaj de programare la altul. 2.6 Tablouri de elemente Tipurile primitive impreuna cu referintele, adica tipurile de date elementare, indivizibile ale unui limbaj, sunt insuficiente pentru necesitatile unei aplicatii reale. De obicei este nevoie de organizari de date mai complicate in care avem structuri de date create prin asocierea mai multor tipuri de date elementare. Aceste structuri de organizare a informatiilor pot contine date de acelasi tip sau date de tipuri diferite. In cazul in care dorim sa reprezentam o structura continand date de acelasi tip, va trebui sa folosim o structura clasica de reprezentare a datelor numita tablou de elemente. Practic, un tablou de elemente este o alaturare de locatii de memorie de acelasi fel. Alaturarea este continua in sensul ca zona de memorie alocata tabloului nu are gauri. De exemplu, putem gandi intreaga memorie interna a calculatorului ca fiind un tablou de cifre binare sau ca un tablou de octeti. Informatiile de acelasi fel reprezentate intr-un tablou se pot prelucra in mod unitar. Referirea la un element din tablou se face prin precizarea locatiei de inceput a tabloului in memorie si a numarului de ordine al elementului pe care dorim sa-l referim. Numarul de ordine al unui element se numeste indexul elementului. De aceea, tablourile se numesc uneori si structuri de date indexate. Sa presupunem ca, la adresa 1234 in memorie, deci incepand cu octetul numarul 1234, avem un tablou de 200 de elemente de tip intregi cu semn reprezentati pe 4 octeti. Pentru a accesa elementul numarul 123 din tablou, trebuie sa ii aflam adresa in memorie. Pentru aceasta, trebuie sa calculam deplasamentul acestui element fata de inceputul tabloului, cu alte cuvinte, la cati octeti distanta fata de inceputul tabloului se gaseste elementul numarul 123. Pentru calcului deplasamentului, este nevoie sa stim cu ce index incepe numerotarea elementelor din tablou. De obicei aceasta incepe cu 0 sau cu 1, primul element fiind elementul 0 sau elementul 1. Sa presupunem, in cazul nostru, ca numerotarea ar incepe cu 0. In acest caz, elementul cu indexul 123 este de fapt al 124-lea element din tablou, deci mai are inca 123 de elemente inaintea lui. In aceste conditii, pentru a afla adresa elementului dat, este suficient sa adaugam la adresa de inceput a tabloului, deplasamentul calculat ca numarul de elemente din fata inmultit cu dimensiunea unui element din tablou. Adresa finala este 1234 + 123 * 4 = 1726. Pentru a putea lucra cu elementele unui tablou este deci suficient sa memoram adresa de inceput a tabloului si indexul elementelor pe care dorim sa le accesam. Alternativa ar fi fost sa memoram adresa locatiei fiecarui element din tablou. Unul dintre marile avantaje ale utilizarii tablourilor este acela ca elementele dintr-un tablou se pot prelucra in mod repetitiv, apelandu-se aceeasi operatie pentru un subset al elementelor din tablou. Astfel, intr-un program putem formula instructiuni de forma: pentru elementele tabloului T incepand de la al treilea pana la al N-lea, sa se execute operatia O. Numarul N poate fi calculat dinamic in timpul executiei programului, in functie de necesitati. Elementele unui tablou pot fi de tip primitiv, referinta sau pot fi tipuri compuse, inclusiv alte tablouri. 2.7 Expresii de calcul Sarcina principala a calculatoarelor este aceea de a efectua calcule. Pentru a putea efectua aceste calcule, calculatorul trebuie sa primeasca o descriere a operatiilor de calcul pe care le are de executat. Calculele simple sunt descrise cel mai bine prin expresii de calcul. Expresiile sunt formate dintr-o serie de valori care intra in calcul, numite operanzi si din simboluri care specifica operatiile care trebuiesc efectuate cu aceste valori, numite operatori. Operatorii reprezinta operatii de adunare, inmultire, impartire, concatenare a sirurilor de caractere, etc. Operanzii unor expresii pot fi valori elementare precum numerele, sirurile de caractere sau pot fi referiri catre locatii de memorie in care sunt memorate aceste valori. Tot operanzi pot fi si valorile unor functii predefinite precum sinus, cosinus sau valoarea absoluta a unui numar. Calculul complex al valorii acestor functii pentru argumentele de intrare este astfel ascuns sub un nume usor de recunoscut. Figura 2.1 Un exemplu de expresie si componentele acesteia Figura 2.2 Schema de functionare a unei instructiuni conditionale Figura 2.3 Schema de functionare a unui ciclu while Figura 2.4 Schema de functionare a unui ciclu do-while |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite |
|