Capitolul 3
Capitolul 3
Capitolul 3
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