Documente Academic
Documente Profesional
Documente Cultură
Limbaje de Programare PDF
Limbaje de Programare PDF
LIMBAJE DE PROGRAMARE
1
Limbaje de programare Dorin Lixăndroiu
2
Limbaje de programare Dorin Lixăndroiu
(1971) PASCAL
Limbajul Pascal a fost dezvoltat de Niklaus Wirth de la Universitatea Tehnică din Zürich.
A fost denumit astfel în onoarea matematicianului, fizicianului şi filosofului francez
Blaise Pascal (1623-1662), care construieşte î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 asemănător
limbajului algoritmic, prin formarea unui mod de gândire structurat, devine un
instrument important de comunicare în mediul universitar. Limbajul Pascal este un
limbaj de programare procedural imperativ. Cele mai populare implementări a acestui
limbaj au fost Turbo Pascal și Borland Pascal, ambele ale firmei Borland. Profesorul
Niklaus Wirth a sintetizat în următoarea ecuaţie 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 către Denis Ritchie pentru a avea un limbaj
simplu și portabil pentru scrierea sistemului de operare UNIX. Limbajul operează în
strânsă legătură 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 realizării acestui limbaj este dată de constatarea că în Departamentul Apărării a
SUA erau implementate în deceniul opt peste 450 de limbaje de programare, inclusiv
“dialecte” şi variante. Proiectul vast, costisitor şi ambiţios de a construi “un PL/I al anilor
’80” a condus la realizarea şi standardizarea limbajului ADA pentru a fi utilizat în
aplicaţiile software ale Penatgonului. Limbajul a fost proiectat pornind de la limbajul
Pascal, este orientat spre programare modulară, are o mare elasticitate în ceea ce
privește tipurile de date şi aduce o abordare nouă pentru tratarea excepțiilor program.
3
Limbaje de programare Dorin Lixăndroiu
(1983) C++
A fost realizat de Bjarne Stroustrup la Bell Labs ca o serie de îmbunătățiri 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.
4
Limbaje de programare Dorin Lixăndroiu
care se obţine din compunerea mai multor funcţii simple, fie funcţii sistem, fie definite
de utilizator.
Limbajele apărute după 1990, sunt în general legate de dezvoltarea noilor tehnologii
web, a aplicaţiilor pe Internet.
(1995) JAVA
Java este un limbaj de programare orientat-obiect. A fost dezvoltat de către James
Gosling la Sun Microsystems (în prezent filială Oracle). În Java sunt realizate multe
aplicaţii web, iar noile evoluţii tehnologice permit utilizarea sa şi pe dispozitivele mobile.
Un program Java compilat, corect scris, poate fi rulat fără modificări pe orice platformă
pe care este instalată o mașină virtuală JVM (Java Virtual Machine). Are un mare nivel
de portabilitate datorită modalităţii de translatare în două faze, care va fi prezentată în
paragraful următor.
5
Limbaje de programare Dorin Lixăndroiu
6
Limbaje de programare Dorin Lixăndroiu
Problema
modelare
Algoritmul
problemei
limbaj de programare
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
converteşte în una sau mai multe etape programul iniţial, într-un limbaj de nivel inferior
acceptat de calculatorul pe care se doreşte execuţia programului.
7
Limbaje de programare Dorin Lixăndroiu
4.3. COMPILATOARE
[LIVOVSCHI 1981], *NIŢCHI 2009+, *ŞERBĂNAŢI 1987+, [VAIDA 1976]
În cazul existenţei unui program de translatare (compilator) execuţia unui program scris
în limbaj de programare (program sursă) presupune într-o primă etapă compilarea
programului, urmată de lansarea în execuţie.
Datele de intrare
8
Limbaje de programare Dorin Lixăndroiu
Î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 ieşire un şir
de entităţi.
2) Analiza sintactică este realizată de analizorul sintactic, parte a compilatorului,
care admite la intrare şirul entităţilor furnizate de analizorul lexical şi produce la
ieşire o reprezentare a structurii sintactice (expresii, liste, instrucţiuni, proceduri
etc.). Structurile sintactice identificate sunt plasate într-un arbore sintactic, care
reflectă relaţiile existente între structuri. Analiza sintactică verifică dacă şirul
entităţilor este corect, în sensul respectării definiţiilor 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 informaţii privind apariţia
obiectelor purtătoare de date din program (ex. variabile, proceduri etc.) şi se
verifică consistenţa utilizării lor. Se obţine o translatare a programului sursă în
cod intermediar, care este o succesiune de instrucţiuni 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
ieşire o transcriere eficientă a acestuia. Optimizarea constă în eliminarea
redundanţelor, a calculelor şi variabilelor inutile în scopul unei execuţii mai
eficiente prin reducerea memoriei ocupate şi a timpului de execuţie.
5) Generarea codului este realizată de asamblor, parte a compilatorului, care
admite la intrare transcrierea eficientă a programului sursă translatat şi produce
la ieşire programul obiect (forma direct executabilă).
6) Gestiunea tabelelor este o colecţie de proceduri ce crează şi actualizează baza
de date cu care se lucrează ăn diferitele faze ale compilării.
7) Analiza erorilor este o colecţie de proceduri care sunt activate în momentul
apariţiei unei erori în program. În urma detectării sunt transmise utilizatorului
mesaje de eroare pentru a efectua corecţiile necesare.
9
Limbaje de programare Dorin Lixăndroiu
Programul sursă
Analiza lexicală
Şir de entităţi
Analiza
Analiza sintactică
erorilor
Arbore sintactic
Gestiunea
tabelelor Analiza semantică
Cod intermediar
Optimizarea de cod
Generarea de cod
Programul obiect
10
Limbaje de programare Dorin Lixăndroiu
un singur cuvânt, notat cu e şi numit cuvântul vid. Lungimea cuvântului vid este 0
( e 0 ). Notăm cu V V e .
Exemplu. Dacă V a , b , atunci V 0 e, V 1 a , b, V 2 aa , ab , ba , bb,....
Definiţia 4.2. Dacă a1a2 ...ar şi b1b2 ... bp sunt două cuvinte, funcţia c : V V V
definită prin c a1a2 ...ar , b1b2 ... bp a1a2 ...ar b1b2 ... bp se numeşte operaţie de
concatenare. Avem evident xy x y . Cuvântul vid este elementul neutru pentru
operaţia de concatenare.
Definiţia 4.3. Un limbaj formal L este o mulţime de cuvinte pe un alfabet V, adică
L V* .
Pentru un limbaj formal, problema apartenenţei unui cuvânt la limbaj este esenţială şi
se defineşte astfel: dat cuvântul x V , se poate decide dacă x L sau x L ? Dacă DA
spunem că L este decidabil.
Tradus în termenii unui limbaj de programare problema apartenenţei 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 apartenenţei unui cuvînt la limbaj este rezolvată – L este
decidabil.
Dacă L este infinit studiul limbajului presupune definirea unor proprietăţi a cuvintelor şi
reguli de formare a lor. În acest caz, o metodă de a reprezenta limbajul L este sistemul
generator numit gramatică. Orice cuvânt din L se poate construi prin metode bine
definite, folosind regulile gramaticii, numite şi producţii.
11
Limbaje de programare Dorin Lixăndroiu
Definiţia 4.5. Numim forme propoziţionale şirurile derivate din simbolul de start (S) al
gramaticii. Formele propoziţionale alcătuite numai din simboluri terminale se numesc
propoziţii.
Definiţia 4.6. Fie gramatica G VN ,VT , S , P . Limbajul generat de gramatica G este
format din mulţimea propoziţiilor LG w | S w . Două gramatici sunt echivalente,
G
dacă generează acelaşi limbaj.
Observaţii. Limbajul generat de o gramatică G este format numai din propoziţii care
conţin simboluri din alfabetul terminal VT . Propoziţiile sunt derivabile din simbolul de
start (S).
12
Limbaje de programare Dorin Lixăndroiu
Concluzii. În sensul celor prezentate mai sus putem spune că un program scris într-un
limbaj de programare este o propoziţie corectă pe un vocabular. Limbajul de
programare conţine o mulţime infinită de propoziţii, care sunt programele realizabile în
acest limbaj. Gramatica limbajului conţine regulile care stabilesc modul de construcţie a
propoziţiilor limbajului, adică regulile care ne permit scrierea programelor.
În general o formă propoziţională poate fi obţinută prin mai multe derivări, considerate
echivalente. Numim derivare stânga, derivarea în care se înlocuieşte la fiecare pas cel
mai din stânga simbol neterminal. Analog, derivarea dreapta se obţine înlocuind la
fiecare pas cel mai din dreapta simbol neterminal.
13
Limbaje de programare Dorin Lixăndroiu
Pentru propoziţia din exemplu anterior a a a L( G ) arborele de derivare este dat în
Figura 4.4.
S
S S
x
S S
( )
a
S
S S
+
+
S
a a
S
Figura 4.4. Arborele de derivare
14
Limbaje de programare Dorin Lixăndroiu
a) Considerăm propoziţia:
a b a a
Acest program aparţine lui L(G)? Răspunsul este negativ, deoarece simbolul bVT . Un
compilator construit pentru acest limbaj va semnala eroare în faza de analiză lexicală.
S S A A A B A a A a A B a B B a a B a a S
( 1) ( 2) ( 4) (6) ( 3) ( 4) (6) ( 5) ( 1)
a a S A a a A A a a B A a a a A a a a A B
( 2) ( 4) (6) ( 3) ( 4)
a a a B B a a a a B a a a a a .
(6) (6)
Rezultă că propoziţia a a a a a LG şi deci faza de analiză sintactică a fost
parcursă fără eroare.
Problema realizării analizei sintactice revine la definirea unui algoritm care să decidă
dacă o propoziţie aparţine sau nu limbajului generat de gramatica G. Un astfel de
algoritm poate fi privit ca o maşină cu operaţii simple, care primeşte la intrare şirul
simbolurilor de analizat (care constituie programul sursă), îl parcurge secvenţial şi în
final prin starea în care rămâne stabileşte dacă şirul a fost acceptat sau nu. Structura
matematică folosită pentru recunoaşterea (acceptarea) unui program ca aparţinând
limbajului de programare în care a fost realizat se numeşte automat de acceptare.
15
Limbaje de programare Dorin Lixăndroiu
Analiza lexicală
Analiza sintactică
:=
Id1 +
= Id2 = x
:= Id3 12
2:
=
Analiza semantică
:=
Tabela informaţii +
Id1
= x
valoare ....... Id2
avans ....... :=
Id3 int-to-real
rata ....... 2:
=
12
Generarea codului
intermediar
Optimizarea codului
16
Limbaje de programare Dorin Lixăndroiu
Generarea codului
MOVE id3, R2
MULTIPLY 12.0, R2
MOVE id2, R1
ADDITION R2, R1
MOVE R1, id1
Comentarii.
Analiza lexicală - se parcurge şirul simbolurilor din instrucţiunea de atribuire şi se
constată că din punct de vedere lexical instrucţiunea este corectă, se găseşte un
şir de entităţi format din 3 identificatori (id1, id2, id3) şi o constantă (12).
Analiza sintactică pleacă de la şirul entităţilor furnizate de analizorul lexical şi
produce o reprezentare a structurii sintactice sub formă de arbore de derivare (o
reprezentare grafică a derivării). Se constată că şirul entităţilor este corect, în
sensul respectării definiţiei sintactice de construcţie a unei instrucţiuni de
atribuire, cu alte cuvinte, instrucţiunea de atribuire este corectă.
Analiza semantică impune schimbarea reprezentării întregi a valorii 12 în
formatul de reprezentare a numerelor reale. Se realizează prin funcţia 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 execuţia secvenţei:
temp1 := integer-to-real (12)
temp2 := id3 x temp1
temp3 := id2 + temp2
id1 := temp3
unde temp1, temp2, temp3 sunt variabile temporare.
Se obţine: 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 secvenţei generate anterior. Se
observă că numărul de atribuiri poate fi redus.
Se obţine: temp1 := id3 x 12.0
id1 := id2 + temp1
adică: temp1 ← rata x 12.0
id1 ← avans + rata x 12.0
17
Limbaje de programare Dorin Lixăndroiu
18
Limbaje de programare Dorin Lixăndroiu
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., Văduva I., Boloşteanu M., Bazele informaticii, Ed. Tehnică,
Bucureşti, 1997.
[CREANGĂ 1974+ Creangă I., Reischer C., Simovici D., Introducere algebrică în
informatică. Limbaje formale, Editura Junimea, Iaşi, 1974.
[DODESCU 1987] Dodescu Ghe., Informatica, Ed. Ştiinţifică şi Enciclopedică,
Bucureşti, 1987.
[LIVOVSCHI 1981+ Livovschi L., Popovici C., Georgescu H., Ţăndăreanu N., Bazele
informaticii, Ed. Didactică şi Pedagogică, Bucureşti, 1981.
[LIXĂNDROIU 2000+ Lixăndroiu D., Bazele informaticii economice, Editura Infomarket,
Braşov, 2000.
[NIŢCHI 1996+ Niţchi Ş., Racoviţan D. şi alţii, Bazele prelucrării informaţiilor şi tehnologie
informaţională, Ed. Intercredo, Deva, 1996.
*NIŢCHI 2009+ Niţchi Ş. (coord.), Elemente avansate de informatică economică, Editura
Risoprint, Cluj-Napoca, 2009.
[ORMAN 1982] Orman G., Limabje formale, Editura Tehnică, Bucureşti, 1982.
*ŞERBĂNAŢI 1987+ Şerbănaţi L.D., Limbaje de programare şi compilatoare, Editura
Academiei, Bucureşti, 1987.
[VAIDA 1976] Vaida D., Limbaje formale şi tehnici de compilare, Universitatea din
Bucureşti, 1976.
19