22.11.2014 Views

Capitolul 3

Capitolul 3

Capitolul 3

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

CURS NR. 3<br />

Un limbaj folosit de calculator se construieşte pe baza unor elemente bine definite, care se<br />

pot grupa în conformitate cu nişte reguli foarte precise pentru a da naştere la componentele mai<br />

complicate ale limbajului. Pentru ca un program traducător să fie în stare să recunoască dacă<br />

porţiunea de text face parte din limbajul dat, şi în consecinţă să fie în stare să-l traducă, acesta<br />

trebuie să cunoască elementele din care este construit limbajul şi regulile pe baza cărora din<br />

aceste elemente se obţin structurile mai complexe.<br />

3.1.ELEMENTELE UNUI LIMBAJ<br />

[Exemplele vor fi din Limbajele BASIC, VisualBasic şi Python]<br />

1.CARACTERE<br />

- Literele din alafabet a, b, c, ....z, A, B, ..Z<br />

- Cifrele 1, 2, 3, ....0<br />

- Semne de punctuaţie .(punct), ,(virgulă) , !, ?,<br />

şi ajutătoare<br />

*, #, $, :, ;, etc<br />

- Delimitatoare (separatoare) , "Blanc", ,(virgula), :, ;, etc.<br />

[Virgula este separator între elementele unei liste, dar nu se foloseşte pentru separarea părţii<br />

întregi de cea zecimală. Aici se foloseşte punctul. Deci = 3.14 şi nu 3,14 !!].<br />

2.TOKENURI<br />

O succesiune de caractere care luate în ansamblu au o semnificaţie. Ele pot fi:<br />

- Cuvinte cheie LET, PRINT, REM,...<br />

- Constante<br />

- Numerice 100, 4 , 3 , ....<br />

- De tip "Şir" "EU VA ZIC","Y are valoarea" , ...<br />

- Operatori + , - , * , / , \ , ^<br />

[Aceste semne parțial diferǎ de cele învǎțate la matematicǎ, necesitǎ un timp pânǎ ce vǎ<br />

obişnuiți cu ele. Despre utilizarea acestor operatoare vezi exemplul predat la curs şi exercițiile<br />

de la laborator. Notați-vǎ formula matematicǎ pentru x_1 la ecuația de grad 2 şi echivalentul<br />

acesteia în limbajul BASIC: vezi_f_C ]<br />

Formula matematicǎ<br />

Formula într-un “limbaj de calculator”<br />

x 1 = X_1 =<br />

29


- Variabile<br />

- Numerice<br />

- întregi K%, copil% ‘[ În Visual Basic mai existǎ şi<br />

- întregi - lungi K&, copil& ‘variabila numericǎ: BYTE ]<br />

- Currency (monedǎ) k@, copil@<br />

- reale simplă precizie X, Y, SUPRAF, (X!,Y!,SUPRAF!,..)<br />

- reale dublă precizie X#, Y#, SUPRAF#,..<br />

- De tip "Şir" ("TEXT")<br />

. – Cu lungime variabilǎ A$, zi$,...<br />

- Cu lungime fixǎ Dim Oraş as String*10<br />

- Definite de utilizator (cu mai multe câmpuri)<br />

[ În VISUAL BASIC existǎ încǎ multe tipuri de variabile, ca Variant, Date, Boolean, Object etc.]<br />

[ În alte limbaje există şi variabile de tip : COMPLEX , POINTER etc.]<br />

[ Despre memorarea diferitelor tipuri de variabile ( întregi, de tip real, de tip şir, definite<br />

de utilizator etc. vezi_f_C şi IptN_ANEXA_1 ]<br />

3. EXPRESII<br />

Mai multe tokenuri, legate logic. Ex:<br />

4. ENUNŢURI<br />

-A + B , A * B , A / B , 4 * PI * RAZA ^ 2 , etc.<br />

Mai multe expresii şi tokenuri legate logic. Ele pot fi:<br />

- COMENZI:<br />

[Comenzile se execută imediat de către calculator<br />

Vezi în BASIC textele scrise în Fereastra imediatǎ]<br />

- LIST , RUN , PRINT 3*8 , ..<br />

- INSTRUCŢIUNI<br />

[ Instrucţiunile se memorează, ele se execută doar la<br />

comanda de lansare în execuţie : RUN ]<br />

-DECLARATIVE<br />

(NEEXECUTABILE)<br />

- REM, INTEGER ALFA<br />

-EXECUTIVE<br />

(EXECUTABILE ) - LET B=A*4 , PRINT B, A, ...<br />

30


5. BLOCURI (RUTINE, PROCEDURI)<br />

Mai multe instrucţiuni care rezolvă o subproblemă.<br />

[De ex: Porţiunea de program ce desenează o fereastră,<br />

în programul ce desenează o casă ]<br />

6. PROGRAM<br />

Totalitatea rutinelor şi a instrucţiunilor, care împreună rezolvă o problemă.<br />

3.2. ETAPELE TRADUCERII UNUI TEXT SCRIS ÎNTR-UN LIMBAJ DE NIVEL ÎNALT.<br />

Programele traducătoare (INTERPRETER, COMPILATOR) parcurg textul programului<br />

de tradus de mai multe ori, făcând verificări multiple şi inventariind tot ceea ce cuprinde textul<br />

programului.<br />

În decursul acestor parcurgeri de text ele execută:<br />

0. DELIMITAREA ŞI INVENTARIEREA TOKENURILOR EXISTENTE<br />

De exemplu, pentru instrucţiunea : 10 LET AX = ALFA + 4*CAL (3.1)<br />

obţinem:<br />

10 LET AX = ALFA + 4 * CAL<br />

Etichetă variabilă variabilă constantă variabilă<br />

Cuvînt cheie<br />

Semn pt.<br />

atribuire operator operator<br />

1. ANALIZA LEXICALĂ<br />

Verifică dacă tokenurile şi caracterele fac parte din cele permise de limbaj. Ex:<br />

- { , ~ , } nu sunt caractere admise,<br />

- PLINT nu este token (nu se găsesc pe lista celor corecte).<br />

2. ANALIZA SINTACTICĂ<br />

a) Verifică dacă tokenurile îşi au locul unde trebuie. Ex:<br />

Let X = A # B<br />

(Aici tokenurile sunt corecte , dar # nu este un operator !)<br />

b) Dacă totul e corect, construiesc arborele sintactic.<br />

(Acesta va indica succesiunea operaţiilor necesare pt. evaluarea expresiei.)<br />

31


În cazul instrucţiunii<br />

10 LET AX = ALFA + 4 * CAL<br />

va arăta ca un arbore [ vezi_f_C<br />

sau IptN_fig_3.1]<br />

[ Bineînţeles în calculator nu avem hârtie ca să desenăm pe el, acest desen va fi memorat<br />

altfel, aşa cum o să vedem mai târziu în cursul despre stucturile de date -vezi cap.8.1.7-]<br />

Dacă în decursul unei etape (analiza lexicală, analiza sintactică) programul traducător<br />

întâlneşte o eroare, el se opreşte din traducere şi trece la instrucţiunea următoare, doar după ce<br />

atenţionează utilizatorul cu un mesaj de eroare.<br />

[Detectarea erorilor este o sarcinǎ importantă a programelor de traducere!!]<br />

Dacă primele 2 etape au avut loc fără erori, se trece la etapa următoare:<br />

3. ANALIZA SEMANTICĂ (TRADUCEREA PRORIU ZISĂ).<br />

Această etapă ne dă răspunsul la întrebarea "Ce înseamnă ?" sau "Ce avem de făcut ?".<br />

Programul traducător se apucă de treabă şi folosind informaţiile acumulate din etapele<br />

anterioare (lista variabilelelor, arborele sintactic etc.) transformă instrucţiunea scrisă în L.N.I.<br />

într-o succesiune de instrucţiuni în cod maşină. (vezi în cap. 2 echivalentul instrucţiunii:<br />

LET Y = X + 4, în cod maşină - IptN_ Tabelul 2.5 - )<br />

Dacă programul traducător e un INTERPRETER, rezultatul traducerii (codul executabil)<br />

este imediat executat, după care el este şters şi se trece la prelucrarea instrucţiunii următoare.<br />

Dacă programul traducător e un COMPILATOR, ceea ce rezultă e un cod intermediar ce<br />

se memorează, şi urmează în majoritatea cazurilor o etapă numită "optimizare de cod".<br />

Codul obţinut se numeşte "Program obiect", dar el încă nu e utilizabil în această formă.<br />

În orice program există operaţiuni ce se execută de mai multe ori (cel mai bun exemplu<br />

este afişarea unui text pe ecran, sau "citirea" unei taste apăsate pe tastatură, dar sunt multe alte<br />

exemple de acest gen).<br />

De fiecare dată când în program se cere de exemplu afişarea unui text, după ce se<br />

memorează textul de afişat şi se comunică calculatorului adresa textului, sarcina calculatorului<br />

este aceeaşi, deci secvenţa de instrucţiuni -în cod maşină - care execută acesta trebuie să fie<br />

identică. Pentru uşurarea traducerii, cei ce scriu COMPILATOARE alcătuesc o listă de asemenea<br />

"secvenţe" ("rutine") dinainte elaborate (ele sunt depuse într-o "bibliotecă") şi când programul<br />

traducător ajunge la o instrucţiune ce afişează ceva pe ecran, se înglobează doar o referire de<br />

genul: -aici sari la "secvenţa de afişare"- (fără a se specifica exact unde va fi locul acestei<br />

secvenţe, -el se va completa ulterior, după ce se termină traducerea).<br />

După ce se termină traducerea întregului text, se vor alipi la sfârşitul programului obiect<br />

"secvenţele" amintite şi trebuie specificat pentru instrucţiunile de salt menţionate (-aici sari la<br />

secvenţa de afişare-) unde va fi de fapt în memorie locul aceastor secvenţe.<br />

Completarea adreselor de salt pentru fiecare rutinǎ din bibliotecǎ se face de către un<br />

program numit EDITOR DE LEGĂTURI ( vezi_f_C şi IptN_fig.2.3 FAZA 1 b ), şi doar după<br />

aceastǎ etapǎ se obţine un program, care încărcat în memorie poate fi executat de la început până<br />

la sfârşit, adică un Program executabil.<br />

32


3.3. CERINŢE FAŢĂ DE UN COMPILATOR [ INTERPRETER ]:<br />

Programele traducătoare, sunt şi ele programe ce trebuie să funcţioneze corect , deci se<br />

aşteaptă de la ele următoarele:<br />

- Să dea mesaje de erori clare, (de preferinţă pentru 1 eroare să apară un singur mesaj<br />

CLAR !) ,<br />

- Să nu dea mesaje de erori la programele corecte,<br />

- Să corecteze erorile simple (de ex. : lipsă de paranteze etc.).<br />

- Să lucreze repede, ocupând memorie puţină etc.<br />

Pentru ca în fazele Analizei lexicale şi a Analizei sintactice programul traducător să poată<br />

distinge între ce e corect şi ce este eronat, el trebuie să cunoască lista caracterelor şi a tokenurilor<br />

admise, şi regulile sintactice prin care din tokenuri se pot alcătui Expresiile şi Enunţurile.<br />

3.4. DEFINIREA SINTAXEI PENTRU UN LIMBAJ:<br />

Toate regulile prin care se construieşte un limbaj, plecând de la caractere pînă la<br />

construcţiile cele mai complicate [în cazul limbajelor de calculator: programele] sunt tratate de o<br />

disciplină nouă de matematică : TEORIA LIMBAJELOR FORMALE. Ea este o ştiinţă ce a<br />

apărut din studierea limbajelor naturale şi a limbajelor prin care omul comunică cu un calculator,<br />

observând că acestea din urmă trebuie să fie "Limbaje independent de context". (Aici nu se admit<br />

omonimele -cuvintele cu mai multe înţelesuri-de ex: "CER".), şi să satisfacă o serie de alte<br />

cerinţe exacte.<br />

Toate definiţiile pentru limbajele de calculator se dau foarte exact, precizând de preferinţă<br />

toate elementele ce se încadrează (de ex. la caractere sunt prezentate toate caracterele ce se pot<br />

folosi, în mod analog la Token-uri), iar dacă nu e posibil (fiind prea vast), prezentând regulile de<br />

"compoziţie" permise.<br />

Astfel instrucţiunea de atribuire LET din limbajul BASIC se va descrie astfel:<br />

LET = | LET = <br />

urmând ca în continuare să se precizeze sintaxa pentru<br />

, , , < şir> şi astfel:<br />

::= | < constantă şir><br />

< constantă şir> ::= ,...<br />

::= a|b| ....X|Y|Z<br />

::= blanc|<br />

(Semnul ::= este prescurtarea textului "poate fi", semnul | înseamnă "sau" .....)<br />

Sintaxa unui limbaj se poate descrie prin multe metode, cea prezentată mai sus se numeşte<br />

forma BACKUS – NAUR [Detalii despre aceastǎ metodǎ de precizare a sintaxei vezi_f_C ]<br />

[ Sintaxa corectă a instrucţiunilor este afişată de interpretorul QUICK-BASIC, dacă<br />

poziţionând cursorul sub instrucţiunea care vă interesează apăsaţi tasta , tasta de HELP<br />

[Trad.Rom.: Ajutor], iar în VISUAL BASIC este afişat automat în timpul completării<br />

instrucţiunii]<br />

33

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!