Documente Academic
Documente Profesional
Documente Cultură
1
CAPITOLUL 4
LIMBAJE DE PROGRAMARE
4.1. EvOLUIA LIMBAJELOR DE PROGRAMARE
[DODESCU 1987], *NICHI 2009+, [http://....wikipedia.org/wiki/....]
Limbajele de programare sunt limbaje artificiale folosite n comunicarea dintre om i
calculator. Evoluia limbajelor de programare este strns legat de evoluia
calculatoarelor electronice i n mod analog pot fi stabilite mai multe generaii:
Limbajele de generaia ntia: primele calculatoare nu puteau fi programate dect n
limbaj cod-main (limbaj main); fiecare procesor are propriul cod-main definit de
constructorul procesorului.
Limbajele de generaia a doua: la nceputul deceniului VI din secolul trecut se face
un progres remarcabil: trecerea la programarea simbolic, prin apariia limbajelor de
asamblare; sunt considerate limbaje de nivel inferior, deoarece depind de calculatorul
pentru care sunt realizate. Apar primele elemente specifice programrii simbolice:
codurile mnemonice pentru instruciuni i adresarea simbolic. Au grad de portabilitate
redus.
Limbajele de generaia a treia: sunt considerate limbaje de nivel nalt (limbaje
procedurale); dup apariia n 1954 a primelor specificaii pentru limbajul FORTRAN,
numrul limbajelor de programare crete rapid, identificndu-se n 1969 un numr de
120 de limbaje de programare, iar numai dup trei ani numrul acesta ajunge la 170.
Limbajele procedurale (algoritmice) permit descrierea algoritmilor de rezolvare a
problemelor sub forma unei succesiuni de instruciuni care se vor executa n ordinea
stabilit de programator. Aceste limbaje pot fi folosite, teoretic, n orice problem ce
poate fi descris algoritmic i de aceea mai sunt numite i limbaje universale.
Limbajele de generaia a patra: limbajele neprocedurale sunt considerate limbaje de
nivel foarte nalt. Aceste limbaje realizeaz trecerea de la prezentarea modului cum se
rezolv problema la ce anume se dorete. Utilizatorul prin programul neprocedural va
defini problema de rezolvat, fr a intra n detaliile specifice soluiilor algoritmice. n
aceast categorie sunt incluse limbajele de interogare pentru gestiunea bazelor de date
relaionale.
Limbajele de generaia a cincea: sunt limbajele inteligenei artificiale. Fac parte din
aceast clas limbajele logice i limbajele de gestiune a bazelor de cunotine utilizate n
realizarea sistemelor expert.
Exist mai multe ncercri de clasificare a limbajelor de programare. Unii autori
consider semnificative dou clase: limbajele procedurale i limbajele neprocedurale. n
clasa limbajelor neprocedurale ar intra i limbajele specializate (orientate pe problem),
de exemplu limbajele de simulare (GPSS, SIMULA, SYMSCRIPT etc.). Exist limbaje
Limbaje de programare Dorin Lixndroiu
2
specializate, de exemplu: sistemele software specializate pentru calcul numeric
(MATLAB, MATHCAD, MATHEMATICA, MAPLE etc.), sistemele software specializate
pentru calcule statistice (SPSS, STATISTICA, etc.), care conin i elemente de limbaj
procedural prin care utilizatorul poate interveni n descrierea algoritmului de rezolvare a
problemei.
Se prezint n continuare principalele momente istorice n apariia limbajelor de
programare.
(1956) FORTRAN FORmula TRANslation
Este un limbaj procedural construit pentru calcule tiinifice. Primul compilator
FORTRAN a fost dezvoltat pentru IBM 704 n 19541957 de o echip IBM condus de
John W. Backus. Au aprut numeroase standarde al limbajului: FORTRAN II n 1958,
FORTRAN IV n 1961, FORTRAN 66 n 1966, FORTRAN 77 n 1977 , Fortran 90 n 1990,
Fortran 95 n 1995, i Fortran 2003 n anul 2003. Cele mai recente versiuni includ suport
pentru programarea orientat obiect. Larga lui utilizare n lumea tiinific a anilor 1960-
1990, datorat unor puternice biblioteci de subprograme matematice, a condus la
celebra butada Ce nu poate fi programat n Fortran nu merit s fie programat.
(1958) ALGOL ALGOrithmic Language
Este un limbaj orientat pentru probleme tiinifice, dezvoltat de un grup al European
and American Computer Scientists, n 1958 la Universitatea Tehnic din Zrich i are o
mare influen n dezvoltarea altor limbaje de programare: FORTRAN, LISP, COBOL.
Cunoate 3 specificaii majore: ALGOL 58 propus la nceput s se numeasc IAL
(International Algebraic Language), ALGOL 60 (implementat n anul 1960) i ALGOL 68
(n anul 1968). Este primul limbaj de programare la care apare o definire riguroas a
descrierii limbajului utiliznd formalismul BNF (Backus-Naur Form).
(1960) COBOL COmmon Business Oriented Language
Este un limbaj procedural, dezvoltat la iniiativa comun a guvernului american i a
sectorului privat, orientat spre probleme de gestiune economic. COBOL a fost creat
pentru a ndeplini dou obiective majore: portabilitatea (capacitatea programelor a fi
utilizate pe calculatoare provenind de la productori diferii, necesitnd modificri
minime) i lizibilitatea (asemnarea dintre limbajul folosit de calculator i limba englez
propriu-zis). Studii recente arat c limbajul de programare Cobol, n noile versiuni, ar
putea realiza o revenire important n prezent exist aplicaii web scrise n Cobol i n
viitor ar putea rezida n cloud.
(1965) PL / I Programming Language no. I
Comapniile IBM i Share i pun problema dezvoltrii unui limbaj de programare care s
trateze att probleme tiinifice ct i probleme economice. Se dorete contopirea
limbajelor FORTRAN, ALGOL i COBOL ntr-unul singur care s le includ pe ct posibil.
Este un limbaj de nivel nalt, conceput s fie, pe ct posibil, independent de calculator.
Nu a avut succesul de pia scontat, cei care lucrau n domeniul tiinific nu au renunat
Limbaje de programare Dorin Lixndroiu
3
la FORTRAN, iar cei din domeniul economic nu au abandonat aplicaiile funcionale
realizate n COBOL.
(1965) BASIC Beginners All purpose Symbolic Instruction Code
Creat de John G. Kemeny i Thomas E. Kurtz la Dartmouth College, limbajul BASIC este
considerat de unii autori ideal pentru nceptori. Nu suntem de acord cu aceast
afirmaie, deoarece structurile de control existente nu permit aplicarea principiilor
programrii structurate, iar folosirea n exces a instruciunii de salt necondiionat GOTO
poate genera un stil de programare necorespunztor. Alte variante sunt QBasic,
GWBasic, Basic2 i altele. O variant evoluat de BASIC este Visual Basic, creat de ctre
compania Microsoft i care se adreseaz programatorilor mai avansai. Limbajul Visual
Basic permite crearea de aplicaii relativ complexe prin manipularea componentelor
vizuale (grafice) ale programelor.
(1971) PASCAL
Limbajul Pascal a fost dezvoltat de Niklaus Wirth de la Universitatea Tehnic din Zrich.
A fost denumit astfel n onoarea matematicianului, fizicianului i filosofului francez
Blaise Pascal (1623-1662), care construiete n 1642 un calculator mecanic numit
Pascaline. Limbajul Pascal permite programarea structurat, este apropiat de limbajul
natural (limba englez) i are o sintax simpl. Deoarece este foarte asemntor
limbajului algoritmic, prin formarea unui mod de gndire structurat, devine un
instrument important de comunicare n mediul universitar. Limbajul Pascal este un
limbaj de programare procedural imperativ. Cele mai populare implementri a acestui
limbaj au fost Turbo Pascal i Borland Pascal, ambele ale firmei Borland. Profesorul
Niklaus Wirth a sintetizat n urmtoarea ecuaie conceptul de program scris ntr-un
limbaj de programare procedural imperativ : algoritmi + structuri de date = programe.
(1972) C
A fost dezvoltat n Laboratoarele Bell de ctre Denis Ritchie pentru a avea un limbaj
simplu i portabil pentru scrierea sistemului de operare UNIX. Limbajul opereaz n
strns legtur cu hardware-ul, fiind cel mai apropiat de limbajul de asamblare, fa de
majoritatea celorlalte limbaje de programare. Sintaxa limbajului C a stat la baza multor
limbaje create ulterior: C++, Java, JavaScript.
(1979) ADA
Numele limbajului este dat n memoria primei femei programator din lume, Augusta
Ada Byron, contes de Lovelace, fiica lordului Byron i asistenta lui Charles Babbage.
Ideea realizrii acestui limbaj este dat de constatarea c n Departamentul Aprrii a
SUA erau implementate n deceniul opt peste 450 de limbaje de programare, inclusiv
dialecte i variante. Proiectul vast, costisitor i ambiios de a construi un PL/I al anilor
80 a condus la realizarea i standardizarea limbajului ADA pentru a fi utilizat n
aplicaiile software ale Penatgonului. Limbajul a fost proiectat pornind de la limbajul
Pascal, este orientat spre programare modular, are o mare elasticitate n ceea ce
privete tipurile de date i aduce o abordare nou pentru tratarea excepiilor program.
Limbaje de programare Dorin Lixndroiu
4
Implementrile pe diverse arhitecturi sunt nsoite i de instrumente de ingineria
programrii. Ateptarea ca limbajul ADA s devin unul din principalele limbaje de
programare utilizate n mod curent, la fel ca i n cazul limbajului PL/I, nu s-a realizat.
(1983) C++
A fost realizat de Bjarne Stroustrup la Bell Labs ca o serie de mbuntiri ale limbajului
C. Este un limbaj procedural care permite programarea orientat pe obiecte. Devine
unul dintre cela mai populare limbaje de programare. Limbajul de programare C++ a fost
standardizat n 1998.
(1989) SQL Structured Query Language
SQL este un limbaj de programare neprocedural bazat pe algebra relaional, pentru
manipularea datelor n sistemele de gestiune a bazelor de date relaionale. Permite
inserarea datelor, actualizarea i tergere, modificarea i crearea schemelor, controlul
accesului la date i formularea interogrilor. A devenit un standard n domeniu, fiind cel
mai popular limbaj de interogare utilizat n SGBD-urile relaionale.
Din clasa limbajelor de simulare amintim:
(1961) GPSS General Purpose Simulation System
Limbajul GPSS, realizat de Geoffrey Gordon (iniial s-a numit Gordon's Programmable
Simulation System), permite simularea sistemelor dinamice discrete. Sistemul este
modelat cu ajutorul unor tranzacii care trec de la un bloc la altul. Limbajul este bazat
pe ceasul simulrii cu cretere variabil, iar translatarea se face n modalitate
interpretativ. O versiune modificat este limbajul SIMUB (limbajul de SIMulare al
Universitaii Bucureti), realizat n cadrul Centrului de Calcul al Universitii din Bucureti
n anul 1977.
(1967) SIMULA SIMulation LAnguage
A fost dezvoltat la Norwegian Computing Center din Oslo de ctre Ole-Johan Dahl i
Kristen Nygaard. Iniial, versiunea SIMULA I a fost prezentat ca o extensie a limbajului
Algol 60 pentru descrierea reelelor de evenimente discrete. Varianta SIMULA 67
introduce conceptele de obiect, clas, subclas, metode virtuale, simularea
evenimentelor discrete. Limbajul SIMULA este considerat primul limbaj de programare
orientat obiect.
Din clasa limbajelor inteligenei artificiale amintim:
(1958) LISP LISt Processing
LISP este cel de-al doilea ca vechime limbaj de programare de nivel nalt; doar limbajul
FORTRAN este mai vechi. A fost creat la Massachusetts Institute of Technology (MIT) de
ctre John McCarthy. LISP este un limbaj de programare funcional, conceput iniial ca
un model de calcul (asemntor celui construit de Turing), a devenit limbajul cel mai
folosit la crearea aplicaiilor de inteligen artificial. Programarea funcional are la
baz pe noiunea de funcional sau funcie de nivel nalt, o funcie care poate accepta
ca argument sau returna ca valoare o alt funcie. Programul este vzut ca o funcie,
Limbaje de programare Dorin Lixndroiu
5
care se obine din compunerea mai multor funcii simple, fie funcii sistem, fie definite
de utilizator.
(1973) PROLOG PROgramming LOGical
Limbajul PROLOG este un limbaj specific inteligenei artificiale. A fost realizat la
Universitatea din Marsilia de Alain Calmaureur. Este utilizat la demonstrarea automat a
teoremelor, realizarea sistemelor expert i a jocurilor.
Din clasa sistemelor software specializate pentru calcul numeric amintim:
(1979) MATLAB - MATrix LABoratory
MATLAB este un mediu de dezvoltare pentru calcul numeric i analiz statistic
dezvoltat iniial de Cleve Moler de la Universitatea din New Mexico. Limbajul permite
lucru cu matrice, reprezentri grafice n 2-D i 3-D, implementarea algoritmilor,
realizarea de calcule simbolice. Un pachet adiional, Simulink, ofer posibilitatea de a
realiza modele matematice de simulare pentru sistemele dinamice.
(1986) MATHCAD MATHematics Computer Aided Design
MathCAD este un produs software al firmei MathSoft Inc., Cambridge, Massachusetts
realizat de Allen Razdow de la Massachusetts Institute of Technology (MIT) i cofondator
al firmei MathSoft. Este un produs de tipul CAD (Computer Aided Design) destinat
rezolvrii problemelor de calcul numeric cu aplicaii n cele mai variate domenii.
Versiunile mai noi permit i realizarea de calcule simbolice.
Limbajele aprute dup 1990, sunt n general legate de dezvoltarea noilor tehnologii
web, a aplicaiilor pe Internet.
(1995) JAVA
Java este un limbaj de programare orientat-obiect. A fost dezvoltat de ctre James
Gosling la Sun Microsystems (n prezent filial Oracle). n Java sunt realizate multe
aplicaii web, iar noile evoluii tehnologice permit utilizarea sa i pe dispozitivele mobile.
Un program Java compilat, corect scris, poate fi rulat fr modificri pe orice platform
pe care este instalat o main virtual JVM (Java Virtual Machine). Are un mare nivel
de portabilitate datorit modalitii de translatare n dou faze, care va fi prezentat n
paragraful urmtor.
ASP - Active Server Pages
ASP este un limbaj de programare folosit pentru a construi site-uri web cu coninut
dinamic, putnd interaciona cu diferite baze de date. ASP este dezvoltat de Microsoft i
este legat de sistemul Windows i de serverul web Microsoft Internet Information
Services Web Server (IIS). Se prezint ca o tehnologie foarte bine suportat, bazndu-se
pe comunitatea de dezvoltatori Microsoft. ASP este gratuit numai dac este folosit un
server Windows care are deja licean.
Limbaje de programare Dorin Lixndroiu
6
PHP - Personal Home Pages
PHP, la fel ca i ASP, este un limbaj de programare folosit pentru a construi site-uri web
cu coninut dinamic, ce pot interaciona cu diferite baze de date. PHP a fost creat de
Rasmus Lerdorf i poate funciona att pe servere Unix i Linux ct i pe sisteme
Microsoft. Limbajul are o mare popularitate printre programatori, prin sintaxa relativ
simpl, un set foarte mare de funcii i prin faptul c este complet gratuit. Este portabil
pe orice platform. Se integreaz cu toate serverele web indiferent de sistemul de
operare utilizat.
(1989) HTML Hyper Text Markup Language
HTML nu este un limbaj de programare. HTML este un limbaj universal de marcare a
textului, interpretat de browsere i se folosete pentru elaborarea diferitelor
documente text cu linkuri i elemente multimedia pagini web, prezentri etc. Este
dezvoltat de Tim Berners-Lee la CERN (Centrul European de Cercetri Nucleare de la
Geneva) pentru facilitarea accesului rapid la informaiile tehnice cuprinse n manualele
de utilizare a calculatoarelor. Un document HTML este un fiier text (ASCII) care conine
descrieri recunoscute de programele de navigare pe Internet. Aceste fiiere pot fi create
utiliznd orice editor de texte, afiate i modificate pe orice calculator cu orice sistem de
operare.
4.2. REZOLVAREA UNEI PROBLEME CU CALCULATORUL
[LIVOVSCHI 1981], *NICHI 2009], *ERBNAI 1987]
Rezolvarea unei probleme cu calculatorul presupune adaptarea algoritmului de
rezolvare a problemei sub forma unor comenzi sau indicaii transmise spre execuie
calculatorului. Descrierea succesiunii acestor operaii care reprezint procesul de calcul
se numete program. Prin program este transmis calculatorului algoritmul de rezolvare
al problemei. Limbajul de programare descrie regulile de realizare ale unui program.
Limbajul de programare apare ca un intermediar ntre sistemul real n care a aprut
problema de rezolvat i sistemul de calcul. n aceast idee, fiecare element al limbajului
de programare trebuie vzut simultan din dou puncte de vedere:
- logic (punctul de vedere al problemei), adic ce reprezentm din problem cu
ajutorul elementului din limbaj;
- fizic (punctul de vedere al implementrii), adic ce realizeaz calculatorul la
execuia elementului din limbaj.
Pentru rezolvarea unei probleme cu calculatorul se construiete un model care apoi va fi
simulat pe calculator. Ce cuprinde acest proces este redat schematic n figura de mai jos:
Limbaje de programare Dorin Lixndroiu
7
Figura 4.1. De la problem la program
Utilizarea unui program scris ntr-un limbaj de programare de nivel nalt devine posibil
prin activarea unui program de translatare (program de traducere) care traduce i
convertete n una sau mai multe etape programul iniial, ntr-un limbaj de nivel inferior
acceptat de calculatorul pe care se dorete execuia programului.
Translatarea se poate realiza n 3 moduri:
modalitatea compilativ translatarea este efectuat naintea execuiei de un
program specializat numit compilator; programul scris n limbaj surs
(program surs) este tradus ntr-un program obiect echivalent cu cel
iniial ce poate fi executat direct de procesor. Avantaj: execuie rapid.
Dezavantaj: programul obiect (executabil) obinut n urma compilrii ntr-
un format de nivel sczut (cod main) nu poate fi rulat dect pe
platforma pe care a fost compilat.
Exemple de limbaje cu compilator: Pascal, C,...
modalitatea interpretativ - translatarea este efectuat n cursul procesului de
execuie de un interpretor. Fiecare instruciune din programul surs este
interpretat (tradus) i executat. De exemplu, n cazul unei instruciuni
de ciclare interpretarea este repetat la fiecare reluare a ciclului. Avantaj:
simplitate. Dezavantaj: viteza de execuie redus.
Exemplu de limbaj cu interpretor: Basic.
modalitatea translatrii n dou faze n prima faz programul surs este tradus
ntr-un cod intermediar (cod de octei) care apoi este rulat pe o main
virtual. Prima faz corespunde compilrii, iar cea de-a doua faz
corespunde interpretrii codului de octei generat care este asemntor
codului scris ntr-un limbaj de asamblare. De aici, avantajul acestui cod
care este interpretat n mediul de execuie al limbajului de programare i
poate fi rulat pe orice platform care folosete acest mediu.
Problema
modelare
Algoritmul
problemei
limbaj de programare
Program
Limbaje de programare Dorin Lixndroiu
8
Exemplu de limbaj cu translatare n dou faze (compilare i interpretare):
Java cu mediu de execuie maina virtual Java (JVM). JVM interpreteaz
codul precompilat i l va rula sub forma unei aplicaii.
Pentru a nelege semnificaia termenilor utilizai n continuare i a legturii limbaj
natural limbaj de programare (limbaj artificial), reamintim cteva definiii legate strict
de studiul limbajelor naturale (conform Dicionarului encicopedic, Editura Enciclopedic,
Bucureti, 1993-2009):
Gramatic disciplin a lingvisticii al crei obiect de studiu l constituie structura
gramatical a unei limbi date; ansamblu de reguli privitoare la modificarea
formei cuvintelor i la mbinarea lor n propoziii i fraze.
Lexic vocabular.
Vocabular totalitatea cuvintelor unei limbi.
Semantic ramur a lingvisticii care studiaz sensurile cuvintelor i evoluia acestor
sensuri.
Sintactic (adjectiv) privitor la sintax, care aparine sintaxei.
Sintax parte a gramaticii care studiaz funciile cuvintelor i ale propoziiilor n
vorbire i care stabilete regulile de mbinare a cuvintelor n propoziii i a
propoziiilor n fraz.
4.3. COMPILATOARE
[LIVOVSCHI 1981], *NICHI 2009+, *ERBNAI 1987+, [VAIDA 1976]
n cazul existenei unui program de translatare (compilator) execuia unui program scris
n limbaj de programare (program surs) presupune ntr-o prim etap compilarea
programului, urmat de lansarea n execuie.
Figura 4.2. Execuia unui program n modalitate compilativ
Compilatorul este un program complex, care realizeaz printr-un ir de transformri
succesive trecerea programului surs n program obiect.
Program
surs
Program
obiect
Compilator
Datele de intrare
Rezultate
Limbaje de programare Dorin Lixndroiu
9
Pentru a nelege conceptul de compilator i fazele procesului de compilare, definim:
entitatea (token) - o succesiune de simboluri, utilizate n scrierea programelor surs i
creia i se asociaz o definiie sintactic. Informaia relativ la entitile unui program
este memorat sub forma unor tabele n care apare tipul entitii, denumirea n
program a entitii, adresa (pointer). n limbajele de programare se consider entiti:
identificatorii, constantele, cuvintele cheie, operatorii etc.
n Figura 4.3. se prezint modelul unui compilator, din care rezult fazele procesului de
compilare.
1) Analiza lexical este realizat de analizorul lexical, parte a compilatorului, care
admite la intrare irul simbolurilor din programul surs i produce la ieire un ir
de entiti.
2) Analiza sintactic este realizat de analizorul sintactic, parte a compilatorului,
care admite la intrare irul entitilor furnizate de analizorul lexical i produce la
ieire o reprezentare a structurii sintactice (expresii, liste, instruciuni, proceduri
etc.). Structurile sintactice identificate sunt plasate ntr-un arbore sintactic, care
reflect relaiile existente ntre structuri. Analiza sintactic verific dac irul
entitilor este corect, n sensul respectrii definiiilor sintactice.
3) Analiza semantic este realizat de generatorul de cod, parte a compilatorului,
care admite la intrare reprezentarea structurii sintactice a programului surs.
Prin parcurgerea arborelui sintactic se extrag informaii privind apariia
obiectelor purttoare de date din program (ex. variabile, proceduri etc.) i se
verific consistena utilizrii lor. Se obine o translatare a programului surs n
cod intermediar, care este o succesiune de instruciuni simple direct executabile
de calculator.
4) Optimizarea codului este realizat de optimizator, parte a compilatorului, care
admite la intrare forma n cod intermediar a programului surs i produce la
ieire o transcriere eficient a acestuia. Optimizarea const n eliminarea
redundanelor, a calculelor i variabilelor inutile n scopul unei execuii mai
eficiente prin reducerea memoriei ocupate i a timpului de execuie.
5) Generarea codului este realizat de asamblor, parte a compilatorului, care
admite la intrare transcrierea eficient a programului surs translatat i produce
la ieire programul obiect (forma direct executabil).
6) Gestiunea tabelelor este o colecie de proceduri ce creaz i actualizeaz baza
de date cu care se lucreaz n diferitele faze ale compilrii.
7) Analiza erorilor este o colecie de proceduri care sunt activate n momentul
apariiei unei erori n program. n urma detectrii sunt transmise utilizatorului
mesaje de eroare pentru a efectua coreciile necesare.
Limbaje de programare Dorin Lixndroiu
10
Figura 4.3. Modelul unui compilator
Observaie. Modelul de compilator prezentat este o structur conceptual.
Compilatoarele existente pot prezenta abateri de la acest model, n sensul c unele
componente pot lipsi, funciile lor fiind preluate de alte componente.
4.4. ELEMENTE DE TEORIA LIMBAJELOR FORMALE
[AHO 1986+, *CREANG 1974+, *LIVOVSCHI 1981+, *NICHI 2009+, [ORMAN 1982],
*ERBNAI 1987+, *VAIDA 1976+
Teoria limbajelor formale st la baza definirii limbajelor de programare i construciei
compilatoarelor.
Considerm o mulime finit i nevid V, numit alfabet. Elementele acestei mulimi se
numesc simboluri. Notm cu { } ,... 2 , 1 , 0 N= mulimea numerelor naturale.
Definiia 4.1. Numim cuvnt peste alfabetul V orice element al mulimii
N k
k
V V
e
-
= .
-
V reprezint vocabularul, adic mulimea tuturor cuvintelor pe V. Orice cuvnt
( )
k
k 2 1
V a ... a a x e = , va fi notat
k 2 1
a ... a a , iar k reprezint lungimea cuvntului, adic
numrul de simboluri din cuvnt. Notm cu x lungimea cuvntului x. Mulimea
0
V are
Programul obiect
Programul surs
Analiza lexical
ir de entiti
Analiza sintactic
Arbore sintactic
Analiza semantic
Cod intermediar
Optimizarea de cod
Generarea de cod
Gestiunea
tabelelor
Analiza
erorilor
Limbaje de programare Dorin Lixndroiu
11
un singur cuvnt, notat cu e i numit cuvntul vid. Lungimea cuvntului vid este 0
( 0 e = ). Notm cu { } e V V =
- +
.
Exemplu. Dac { } b , a V = , atunci { } { } { },.... bb , ba , ab , aa V , b , a V , e V
2 1 0
= = =
Definiia 4.2. Dac
r 2 1
a ... a a i
p 2 1
b ... b b sunt dou cuvinte, funcia
- - -
V V V : c
definit prin ( )
p 2 1 r 2 1 p 2 1 r 2 1
b ... b b a ... a a b ... b b , a ... a a c = se numete operaie de
concatenare. Avem evident y x xy + = . Cuvntul vid este elementul neutru pentru
operaia de concatenare.
Definiia 4.3. Un limbaj formal L este o mulime de cuvinte pe un alfabet V, adic
*
V L _ .
Pentru un limbaj formal, problema apartenenei unui cuvnt la limbaj este esenial i
se definete astfel: dat cuvntul V xe , se poate decide dac L xe sau L xe ? Dac DA
spunem c L este decidabil.
Tradus n termenii unui limbaj de programare problema apartenenei const n a decide
dac un ir de simboluri din alfabetul limbajului formeaz un program corect sau nu.
Aceast problem trebuie rezolvat de orice compilator.
Pentru a studia un limbaj acesta trebuie specificat ntr-un anumit mod. Dac limbajul L
este finit, specificarea se poate face prin enumerarea tuturor cuvintelor limbajului i
atunci, evident, problema apartenenei unui cuvnt la limbaj este rezolvat L este
decidabil.
Dac L este infinit studiul limbajului presupune definirea unor proprieti a cuvintelor i
reguli de formare a lor. n acest caz, o metod de a reprezenta limbajul L este sistemul
generator numit gramatic. Orice cuvnt din L se poate construi prin metode bine
definite, folosind regulile gramaticii, numite i producii.
O gramatic G pentru un limbaj L folosete dou mulimi finite i disjuncte de simboluri:
T
V - simboluri terminale (ireductibile), care reprezint chiar alfabetul V pe care L este
definit;
N
V - simboluri neterminale (variabile sintactice), care vor fi folosite n procesul de
generare a cuvintelor limbajului.
O producie (regul de deducie) este o pereche ordonat ( ) | o, unde:
( ) ( )
- -
e
T N N T N
V V V V V o , conine cel puin un simbol neterminal;
( )
-
e
T N
V V | reprezint un cuvnt din vocabularul total al limbajului.
Notm o producie | o i spunem | deriv din o sau o genereaz pe | .
Procesul prin care se aplic regulile de deducie se numete derivare.
Definiia 4.4. O gramatic G este un sistem ( ) P , S , V , V G
T N
= , unde:
N
V - mulimea simbolurilor neterminale;
T
V - mulimea simbolurilor terminale;
Limbaje de programare Dorin Lixndroiu
12
S simbolul de start al gramaticii ( )
N
V Se ;
P mulimea finit de producii (reguli de rescriere) de forma ( ) | o, .
Exemplu. Gramatica G este definit astfel:
{ } { } ( ) P , S , d , c , b , a , Y , X , S G=
unde: { } Y , X , S V
N
=
{ } d , c , b , a V
T
=
N
V Se este simbolul de start
{ } d Y , c Y , b X , a X , XY S P = .
Relaiile de derivare direct pot fi extinse la relaii de derivare n k pai.
Notm | o
k
o derivare de lungime k, format dintr-un ir de derivaii:
| o o o o o
1 k 2 1 1
,...., ,
Notm cu | o
-
G
relaia de derivare general, care spune c n gramatica G,
genereaz pe (sau deriv din ) n 1 k > pai.
Definiia 4.5. Numim forme propoziionale irurile derivate din simbolul de start (S) al
gramaticii. Formele propoziionale alctuite numai din simboluri terminale se numesc
propoziii.
Definiia 4.6. Fie gramatica ( ) P , S , V , V G
T N
= . Limbajul generat de gramatica G este
format din mulimea propoziiilor ( )
)
`
=
-
w S | w G L
G
. Dou gramatici sunt echivalente,
dac genereaz acelai limbaj.
Observaii. Limbajul generat de o gramatic G este format numai din propoziii care
conin simboluri din alfabetul terminal
T
V . Propoziiile sunt derivabile din simbolul de
start (S).
Exemplu. Fie gramatica G este definit astfel:
{ } { } ( ) P , S , b , a , S G=
unde: { } S V
N
=
{ } b , a V
T
=
N
V Se este simbolul de start
{ } ab S , aSb S P = .
O propoziie care aparine lui L(G) este:
3 3
b a aaabbb aaSbb aSb S = sau notat altfel:
3 3
3
b a S
Se poate demonstra c limbajul generat de aceast gramatic este ( ) { } 1 n | b a G L
n n
> = .
Limbaje de programare Dorin Lixndroiu
13
Noam Chomsky introduce n 1959, o clasificare a gramaticilor dup forma produciilor:
tipul 1 gramatici dependente de context, tipul 2 - gramatici independente de context,
tipul 3 gramatici regulate. Corespunztor acestor tipuri de gramatici avem clasele
limbajelor generate.
Definiia 4.7. O gramatic ( ) P , S , V , V G
T N
= se numete independent de context
(context free) dac fiecare producie este de forma o A cu
N
V Ae i ( )
-
e
T N
V V o .
Limbajul independent de context, generat de o gramatic independent de context,
reprezint modelul utilizat n definirea limbajelor de programare. Se demonstreaz c
orice limbaj independent de context este decidabil.
Concluzii. n sensul celor prezentate mai sus putem spune c un program scris ntr-un
limbaj de programare este o propoziie corect pe un vocabular. Limbajul de
programare conine o mulime infinit de propoziii, care sunt programele realizabile n
acest limbaj. Gramatica limbajului conine regulile care stabilesc modul de construcie a
propoziiilor limbajului, adic regulile care ne permit scrierea programelor.
n general o form propoziional poate fi obinut prin mai multe derivri, considerate
echivalente. Numim derivare stnga, derivarea n care se nlocuiete la fiecare pas cel
mai din stnga simbol neterminal. Analog, derivarea dreapta se obine nlocuind la
fiecare pas cel mai din dreapta simbol neterminal.
Exemplu. Fie gramatica G este definit astfel:
{ } { } ( ) P , S , ) , ( , , , a , S G + =
unde: { } S V
N
=
{ } ) , ( , , , a V
T
+ =
N
V Se este simbolul de start
( ) { } a S , S S , S S S , S S S P + = .
Propoziia ( ) ) G ( L a a a e + poate fi obinut, plecnd de la simbolul de start, n dou
moduri:
- derivare stnga:
( ) ( ) ( ) ( ) a a a S a a S S a S a S a S S S + + +
- derivare dreapta:
( ) ( ) ( ) ( ) ( ) a a a a a S a S S S S S S S S S S + + + +
Reprezentarea grafic a derivrii poate fi fcut cu ajutorul arborilor de derivare.
Definiia 4.8. Un arbore de derivare pentru o gramatic ( ) P , S , V , V G
T N
= independent
de context este un arbore aezat pe niveluri, n care fiecare vrf este etichetat cu
elemente din
T N
V V , astfel nct:
a) radcina arborelui este etichetat cu S ;
Limbaje de programare Dorin Lixndroiu
14
b) vrfurile interioare (care au descendeni) sunt etichetate cu simboluri
neterminale ale gramaticii, iar vrfurile terminale (frunzele) sunt etichetate cu
simboluri terminale;
c) pentru orice vrf interior A avnd descendenii direci etichetai
k 2 1
,..., , o o o ,
exist o producie n P de forma:
k 2 1
... A o o o .
irul simbolurilor care eticheteaz frunzele arborelui scrise n ordine de la stnga la
dreapta formeaz frontiera arborelui.
Pentru propoziia din exemplu anterior ( ) ) G ( L a a a e + arborele de derivare este dat n
Figura 4.4.
Figura 4.4. Arborele de derivare
Observm c frontiera arborelui din Figura 4.4. reproduce propoziia ( ) ) G ( L a a a e + .
Aplicaie
Fie gramatica independent de context ( ) P , S , V , V G
T N
= , unde:
unde: { } B , A , S V
N
=
{ } ) , ( , , , a V
T
+ =
N
V Se este simbolul de start
P conine urmtoarele producii (reguli de rescriere):
(1) A S S +
(2) A S
(3) B A A
(4) B A
(5) ( ) S B
(6) a B
Cu ajutorul acestei gramatici avnd ca operand a i operatori +, x, ( , ) se pot genera
expresii aritmetice. Acestea constituie L(G), limbajul generat de gramatica G.
S
S S
a
S
x
S
( )
S
+
+
S
S
a a
S
S
Limbaje de programare Dorin Lixndroiu
15
a) Considerm propoziia:
( ) a a b a + +
Acest program aparine lui L(G)? Rspunsul este negativ, deoarece simbolul
T
V be . Un
compilator construit pentru acest limbaj va semnala eroare n faza de analiz lexical.
b) Fie acum propoziia:
( ) a a a a a + +
Acest program aparine lui L(G)? Compilatorul construit pentru acest limbaj parcurge
faza de analiz lexical fr erori, deoarece toate simbolurile utilizate aparin lui
T
V .
n faza de analiz sintactic pornind de la simbolul de start S, aplicnd regulile gramaticii
ncercm s obinem propoziia. Exemplificm aplicnd derivri la stnga (cifrele de sub
simbolul de derivare indic regula de rescriere aplicat).
( )
) 1 ( ) 5 ( ) 6 ( ) 4 ( ) 3 ( ) 6 ( ) 4 ( ) 2 ( ) 1 (
S a a B a a B B a B A a A a A B A A A S S + + + + + + + +
( ) ( ) ( ) ( ) ( )
) 4 ( ) 3 ( ) 6 ( ) 4 ( ) 2 (
B A a a a A a a a A B a a A A a a A S a a + + + + + + + + + +
( ) ( ) ( ) a a a a a B a a a a B B a a a
) 6 ( ) 6 (
+ + + + + + .
Rezult c propoziia ( ) ( ) G L a a a a a e + + i deci faza de analiz sintactic a fost
parcurs fr eroare.
Analog, aplicnd derivri la dreapta obinem:
( ) ( ) ( )
) 6 ( ) 3 ( ) 1 ( ) 5 ( ) 3 ( ) 1 (
B A S A S A S A S S A S B A S A S S + + + + + + +
( ) ( ) ( ) ( )
) 4 ( ) 2 ( ) 6 ( ) 4 (
a a A A S a a S A S a B S A S a A S A S + + + + + + + +
( ) ( ) ( ) ( )
) 2 ( ) 6 ( ) 4 ( ) 6 (
a a a a S a a a B S a a a A S a a B A S + + + + + + + +
( ) ( ) ( ) ( ) G L a a a a a a a a a B a a a a A
) 6 ( ) 4 (
e + + + + + + .
Problema realizrii analizei sintactice revine la definirea unui algoritm care s decid
dac o propoziie aparine sau nu limbajului generat de gramatica G. Un astfel de
algoritm poate fi privit ca o main cu operaii simple, care primete la intrare irul
simbolurilor de analizat (care constituie programul surs), l parcurge secvenial i n
final prin starea n care rmne stabilete dac irul a fost acceptat sau nu. Structura
matematic folosit pentru recunoaterea (acceptarea) unui program ca aparinnd
limbajului de programare n care a fost realizat se numete automat de acceptare.
Pentru a crea o imagine asupra modului de lucru al compilatorului, prezentm fazele
parcurse pentru translatarea unei instruciuni simple de atribuire.
Limbaje de programare Dorin Lixndroiu
16
valoare := avans + rata x 12
id1 := id2 + id3 x 12
temp1 := integer-to-real (12)
temp2 := id3 x temp1
temp3 := id2 + temp2
id1 := temp3
temp1 := id3 x 12.0
id1 := id2 + temp1
Analiza lexical
Analiza sintactic
: =
Id1
=
+
=
Id2
: =
x
+
12
Analiza semantic
: =
Id1
=
x
Id2
: =
Id3
2:
=
Id3
2:
=
int-to-real
12
Generarea codului
intermediar
Tabela informaii
valoare .......
avans .......
rata .......
Optimizarea codului
Limbaje de programare Dorin Lixndroiu
17
MOVE id3, R2
MULTIPLY 12.0, R2
MOVE id2, R1
ADDITION R2, R1
MOVE R1, id1
Comentarii.
Analiza lexical - se parcurge irul simbolurilor din instruciunea de atribuire i se
constat c din punct de vedere lexical instruciunea este corect, se gsete un
ir de entiti format din 3 identificatori (id1, id2, id3) i o constant (12).
Analiza sintactic pleac de la irul entitilor furnizate de analizorul lexical i
produce o reprezentare a structurii sintactice sub form de arbore de derivare (o
reprezentare grafic a derivrii). Se constat c irul entitilor este corect, n
sensul respectrii definiiei sintactice de construcie a unei instruciuni de
atribuire, cu alte cuvinte, instruciunea de atribuire este corect.
Analiza semantic impune schimbarea reprezentrii ntregi a valorii 12 n
formatul de reprezentare a numerelor reale. Se realizeaz prin funcia de
conversie int-to-real (integer to real). Aceast conversie este necesar pentru a
putea evalua o expresie de forma: real := real x real.
Generarea codului intermediar presupune execuia secvenei:
temp1 := integer-to-real (12)
temp2 := id3 x temp1
temp3 := id2 + temp2
id1 := temp3
unde temp1, temp2, temp3 sunt variabile temporare.
Se obine: temp1 12.0
temp2 rata x 12.0
temp3 avans + temp2 ( avans + rata x 12.0)
id1 temp3 ( avans + rata x 12.0)
Optimizarea codului presupune o analiz a secvenei generate anterior. Se
observ c numrul de atribuiri poate fi redus.
Se obine: temp1 := id3 x 12.0
id1 := id2 + temp1
adic: temp1 rata x 12.0
id1 avans + rata x 12.0
Generarea codului
Limbaje de programare Dorin Lixndroiu
18
Generarea codului presupune o transcriere eficient a programului surs
translatat.
Se obine secvena: MOVE id3, R2
MULTIPLY 12.0, R2
MOVE id2, R1
ADDITION R2, R1
MOVE R1, id1
care impune utilizarea a 2 regitri, R1 i R2, pentru efectuarea operaiilor.
Operaiile din secven trebuie interpretate astfel:
MULTIPLY operand2, operand1
presupune efectuarea inmulirii: operand1 x operand2
i apoi rezultatul este depozitat n: operand1
ADDITION operand2, operand1
presupune efectuarea adunrii: operand1 + operand2
i apoi rezultatul este depozitat n: operand1
MOVE operand2, operand1
presupune transferul operand2 n operand1.
Revenim la secven i obinem n urma execuiei:
R2 rata
R2 R2 x 12.0 ( rata x 12.0)
R1 avans
R1 R1 + R2 ( avans + rata x 12.0)
id1 R1 ( avans + rata x 12.0)
adic evaluarea instruciunii de atribuire:
valoare := avans + rata x 12
Limbaje de programare Dorin Lixndroiu
19
Bibliografie
[AHO 1986] Aho A.V., Sethi R., Ullman J.D., Compilers: Principles, Techniques, and Tools,
Addison Wesley, Pearson Education, Inc., 1986.
[BARBU 1997+ Barbu Ghe., Vduva I., Boloteanu M., Bazele informaticii, Ed. Tehnic,
Bucureti, 1997.
[CREANG 1974+ Creang I., Reischer C., Simovici D., Introducere algebric n
informatic. Limbaje formale, Editura Junimea, Iai, 1974.
[DODESCU 1987] Dodescu Ghe., Informatica, Ed. tiinific i Enciclopedic,
Bucureti, 1987.
[LIVOVSCHI 1981+ Livovschi L., Popovici C., Georgescu H., ndreanu N., Bazele
informaticii, Ed. Didactic i Pedagogic, Bucureti, 1981.
[LIXNDROIU 2000+ Lixndroiu D., Bazele informaticii economice, Editura Infomarket,
Braov, 2000.
[NICHI 1996+ Nichi ., Racovian D. i alii, Bazele prelucrrii informaiilor i tehnologie
informaional, Ed. Intercredo, Deva, 1996.
*NICHI 2009+ Nichi . (coord.), Elemente avansate de informatic economic, Editura
Risoprint, Cluj-Napoca, 2009.
[ORMAN 1982] Orman G., Limabje formale, Editura Tehnic, Bucureti, 1982.
*ERBNAI 1987+ erbnai L.D., Limbaje de programare i compilatoare, Editura
Academiei, Bucureti, 1987.
[VAIDA 1976] Vaida D., Limbaje formale i tehnici de compilare, Universitatea din
Bucureti, 1976.