+ All Categories
Home > Documents > Introduce Re in Program Are

Introduce Re in Program Are

Date post: 06-Apr-2018
Category:
Upload: molnar-iozsef-bernat
View: 223 times
Download: 0 times
Share this document with a friend

of 33

Transcript
  • 8/3/2019 Introduce Re in Program Are

    1/33

    Capitolul 1.

    Introducere n limbaje de programare

    Acest capitol introduce problematica limbajelor de programare. Pentru nceputvom evidenia necesitatea studierii limbajelor pentru a putea realizacomunicarea om-calculator. Pornind de la comunicarea interuman prinintermediul limbilor (vorbite, scrise, vizuale), vom defini conceptul de limbaj deprogramare. Apoi vom insista asupra unor noiuni introductive de limbaje deprogramare. Astfel, vom realiza o clasificare a limbajelor de programare,

    insistnd asupra tipurilor de limbaje, asupra gradului lor de abstractizarerespectiv de apropiere de descrierea i rezolvarea anumitor tipuri de probleme.Vom continua prin a realiza o scurt incursiune n istoria limbajelor deprogramare, evideniind evoluia lor n timp, concomitent cu evoluiaparadigmelor de gndire n informatic. Partea final a capitolului puncteazcteva aspecte caracteristice care trebuie studiate i menionate la referireaunui limbaj de programare.

    1.1. Definirea limbajelor de programare

    Comunicarea interuman este indispensabil n viaa de zi cu zi. Pentrurealizarea acesteia, oamenii folosesc diverse modaliti, limbajele reprezentndpoate cea mai important facilitate de comunicare. Una din primele aptitudiniimportante pe care un copil o dobndete este s vorbeasc. El nva limbamatern. De obicei, aceasta i este suficient pentru comunicarea de zi cu zi cuali indivizi din propria societate. Dac ns, un individ cltorete, el are nevoies cunoasci alte limbi pentru a se putea descurca, pentru a putea comunicacu ali oameni din alte societi ale lumii. Cu toate c, n principiu, oamenii

    atribuie nelesuri similare pentru lucruri similare, ei vorbesc (exprim) acestenelesuri n limbi diferite. Diferena se manifest att la nivelul sunetelor inlnuirii acestora pentru a forma cuvintele ct i la nivelul simbolurilor graficefolosite. A nva s vorbim ntr-o alt limb presupune a nva s rostimcuvintele din limba respectiv, s le nlnuim de o manier potrivit conformregulilor gramaticale a limbii nvate i s folosim simbolurile specifice acesteilimbi pentru a descrie vizual sintagmele de comunicare. Dac nu mnuimcorespunztor aceste elemente, atunci cnd vom fi pui n situaia de acomunica cu cineva care nelege doar limba respectiv, vom eua n

    ncercarea noastr.

  • 8/3/2019 Introduce Re in Program Are

    2/33

    10 Capitolul 1. Introducere n limbaje de programare

    Am realizat aceast scurt introducere pentru a putea realiza o comparaientre actele de comunicare inter-umani comunicarea dintre om i calculator.n aceast comunicare, putem vedea calculatorul ca pe un partener care edispus s ne rezolve problemele. Pentru aceasta, trebuie s-i specificm modul

    n care s rezolve aceste probleme. Putem s realizm acest lucru utilizndalgoritmii. Dar algoritmii trebuie descrii ntr-un limbaj inteligibil pentrucalculator. Putem vedea aceast comunicare ca un caz special al uneisolicitri. Dac cerem ceva cuiva, atunci va trebui s folosim cuvinte, expresiipe care acesta s le neleag.

    Conform Dicionarului Explicativ al Limbii Romne, prin limb se nelege unsistem de comunicare alctuit din sunete articulate, specifice omului, prin careacesta i exprim gndurile sau dorinele. Astfel, un limbaj este un mijloc decomunicare a ideilor prin sunete i culoare, reprezentnd un mijloc de

    transmitere a informaiei ntre indivizii unei categorii [Nichi 2005].Orice limbaj are la baz simboluri care formeaz limbajul respectiv. Astfel,limba vorbit are la baz sunete, limbajele scrise au la baz literele, limbajelevizuale au la baz simbolurile grafice. Semiotica este ramura tiinei care seocup cu studiul simbolurilor.

    Revenind la comunicarea dintre om i calculator, trebuie s definim noiunea delimbaj de programare. Astfel, prin limbaj de programare nelegem o notaiesistematic prin care este descris un proces de calcul [Prv 1996]. Un procesde calcul este constituit dintr-o mulime de pai pe care o main i poate

    executa pentru a rezolva o anumit problem.Astfel, un limbaj de programare este un intermediar ntre realitateareprezentrilor utilizatorului asupra problemei de rezolvat i realitateacalculatorului cu care lucreaz [erbnai 1987]. La rezolvarea unei problemecu calculatorul, un programator trebuie s priveasc fiecare element allimbajului din 2 puncte de vedere:

    - unul logic, al problemei; astfel programatorul trebuie stie ce nelege sreprezinte din problem cu ajutorul elementului de limbaj

    - unul fizic, al implementrii, care se refer la ceea ce realizeaz calculatorul

    la execuia elementului de limbaj considerat.Programul este un compromis ntre cele 2 puncte de vedre. Astfel,programatorul trebuie s-i reprezinte i s neleag urmtoarele universuri:

    - universul problemei

    - universul limbajului de programare

    - universul calculatorului

    Aceste trei universuri sunt n general diferite. Pentru a realiza corespondenantre acestea, exist definite diverse activiti ale informaticii. Figura 1 surprinde

    corespondena ntre universurile limbajelor de programare.

  • 8/3/2019 Introduce Re in Program Are

    3/33

    1.1. Definirea limbajelor de programare 11

    Simulare

    Elaborareprogram Compilare

    Universul limbajuluide programare

    Universulcalculatorului

    Universulproblemei

    Figura 1. Universurile unui limbaj de programare [erbnai1987].

    Orice limbaj are 3 aspecte caracteristice:

    - aspectul sintactic

    - aspectul semantic

    - aspectul pragmatic

    Sintaxa unui limbaj conine ansamblul regulilor prin care pornind de lasimbolurile de baz care alctuiesc alfabetul limbajului, se construiesc structuri

    compuse [Nichi 2005].Mulimea regulilor sintactice care descriu ansamblul propoziiilor sau aformulelor corecte din cadrul limbajului formeazgramatica.

    Deci, sintaxa i gramatica ne ajut s identificm modul n care putem combinasimbolurile de baz ale limbajului pentru a produce elemente acceptate delimbaj. Ele reprezint imperative riguroase, care pot fi formalizate matematic.Sintaxa se descrie teoretic cu ajutorul sistemelor formale. Urmtoareleelemente se utilizeaz pentru descrierea sintaxei unui limbaj:

    - diagramele sintactice

    - arbori de analiz

    - metalimbaje (BNF Backus Naur Form, EBNF Extended Backus NaurForm, Asn.1)

    Prin semantic se nelege sensul construciilor sintactice. Ea reprezint un setde reguli ce determin semnificaia propoziiilor dintr-un limbaj. Este vorba dereguli de evaluare a acestor propoziii n termenii unor mulimi de valoricunoscute de limbajul respectiv. Astfel, semantica reprezint nelesul fiecreiformule corecte admise de gramatic.

    Pragmatica se refer la capacitatea de a utiliza construciile sintactice isemantice. Referitor la nelegerea aspectului pragmatic al limbajelor, putem s

  • 8/3/2019 Introduce Re in Program Are

    4/33

    12 Capitolul 1. Introducere n limbaje de programare

    se nchipuim urmtorul exemplu: o persoan poate cunoate foarte bineaspectele sintactice i semantice ale unui limbaj, dar nu are capacitatea de autiliza corect aceste reguli. De asemenea, exist persoane care vorbesc(folosesc) o limb fr a cunoate aspectele sintactice i semantice ale

    acesteia. Pragmatica nu se poate formaliza.n capitolul 2 vom trece la prezentarea succint a formalizrii elementelor delimbaje de programare.

    1.2. Clasificarea limbajelor

    Referitor la limbaje, putem s vorbim de o clasificare general a acestora.Astfel, limbajele pot fi naturale sau artificiale. Referindu-ne strict la limbajele deprogramare, acestea pot fi clasificate din perspectiva paradigmelor de

    programare sau a nivelului de abstractizare a limbajului. n aceast seciunevom descrie succint clasificarea general a limbajelor i vom insista asupraclasificrii limbajelor de programare.

    1.2.1. Clasificarea general a limbajelor

    Pe plan general, exist 2 tipuri de limbaje: naturale i artificiale.

    Limbajele naturale sunt cele istorice, precum limba romn, englez etc.

    Limbajele artificiale au fost create de oameni n diverse scopuri. Astfel exist:

    - jargoane profesionale, folosite la comunicarea n cadrul diverselor grupuriprofesionale. Exist astfel un limbaj matematic, medical, economic, bursieretc.

    - limbaje pentru comunicare ntre dispozitive. Aceste limbaje se mai numesci protocoale. Ele ajut la stocarea i transmiterea informaiei ntre diversecomponente ale unor medii (de obicei artificiale). De exemplu, pentrucomunicarea n reelele de calculatoare se folosete protocolul TCP/IP saualte protocoale de reea (de nivel mai mult sau mai puin abstract). Pentru

    comunicarea la nivel software se pot folosi limbaje bazate pe descrierispecifice de domeniu, descrise n XML.

    - limbaje de pentru comunicarea dintre om i dispozitive. Din aceastcategorie fac parte limbajele de programare.

    1.2.2. Clasificarea limbajelor de programare din perspectivanivelului de abstractizare

    Din punct de vedere al nivelului, limbajele se nscriu n 2 mari categorii:

    - limbaje de nivel inferior- limbaje de nivel superior

  • 8/3/2019 Introduce Re in Program Are

    5/33

    1.2. Clasificarea limbajelor 13

    Cu ct un limbaj este mai apropiat de simbolurile efective, binare, cu carelucreaz calculatorul, limbajul este de nivel mai sczut. Figura 2 descrieierarhizarea limbajelor de programare n funcie de nivel.

    Cod masina

    Limbaj deasamblare

    Microprocesor

    asamblor

    Limbaj de nivelsuperior

    CompilatorInterpretor

    Figura 2. Ierarhizarea limbajelor de programare n funcie denivel.

    Limbajul sau codul main reprezint un limbaj binar cu care lucreaz efectivprocesorul. De obicei, fiecare procesor are propriul su cod main, definit fizicde constructorul procesorului. Codul main aparine primei generaii delimbaje de programare.

    Limbajele de asamblare sau macroasamblare se situeaz deasupra coduluimain i sunt formate prin coresponden direct ntre succesiuni binare i

    termeni (eventual prescurtai) din vorbire. Limbajele de asamblare fac parte dingeneraia 2-a de limbaje de programare.

    Programele scrise n cod main sau limbaje de asamblare pot fi considerateoptimale pentru calculator, deoarece acesta poate s execute n mod direct,fr o alt conversie un asemenea cod. Dezavantajele principale ale acestorarezid n dificultatea acestor limbaje. Productivitatea activitii de programareeste foarte sczut. Limbajele din primele dou generaii sunt specifice peprocesor, adic gradul lor de portabilitate este foarte sczut. Prin portabilitatese nelege caracteristica unui program de a putea fi rulat pe diverse

    calculatoare (sau tipuri de calculatoare) fr modificri, sau cu modificriminimale.

    Limbajele de nivel superior aparin generaiilor 3-a, 4-a i 5-a de limbaje deprogramare. Aceste limbaje se apropie tot mai mult de nelegerea uman, dereprezentri specifice n termenii problemei de rezolvat.

    Limbajele de generaia 3 conin limbaje pentru prelucrarea datelor neorganizate n baze de date. Ele sunt limbaje de uz general, respectiv de programareautomat. Aceste limbaje permit programatorului s exprime rezolvareaproblemei ntr-un limbaj mai apropiat de limbajul natural. Includem n aceast

    categorie limbaje precum Fortran, C/C++, Pascal etc.

  • 8/3/2019 Introduce Re in Program Are

    6/33

    14 Capitolul 1. Introducere n limbaje de programare

    Limbajele de generaia 4 sunt destinate n special prelucrrii datelor organizaten baze de date. Ele sunt utilizate pentru realizarea de programe comerciale, acror obiectiv principal este manipularea unor cantiti mari de date. Limbajeledin generaia 4-a sunt de obicei uor de nvat i aplicat, i sunt destinate unor

    categorii mai mari de utilizatori. Aceste limbaje pun accentul mai mult pefuncionalitatea oferit dect pe tehnicile de programare.

    Limbajele din generaia 5-a sunt limbajele inteligenei artificiale. n aceastcategorie putem include limbajele logice pentru manipulare de simboluri ilimbajele de gestiune a bazelor de cunotine.

    Limbajele de nivel superior prin caracteristicile lor, asigur o productivitatecorespunztoare a muncii de programare. Astfel, ele se caracterizeaz prin:

    - faciliti legate de elaborarea programelor. Limbajul se apropie de multe oride limbajul natural sau de dialecte ale acestuia

    - sunt standardizate: se asigur astfel independena de main i deciportabilitatea

    - exist o productivitate bun a elaborrii programelor. Pentru multe limbajes-au dezvoltat metodologii de lucru n activitatea de dezvoltare aprogramelor pentru a se asigura posibilitatea de lucru n echip respectiv ase asigura extensibilitatea programelor. Ingineria programrii este ramuratiinei calculatoarelor care se ocup cu studiul metodelor de dezvoltareorganizat a programelor informatice.

    Pentru execuia programelor scrise ntr-un limbaj de nivel superior, acesteatrebuie convertite n cod de nivel inferior specific mainii pe care se doreterularea programului. Programele care asigur aceste conversii se numescprograme de traducere. Programele de traducere sunt de 3 tipuri:

    - compilatoare

    - interpretoare

    - traducere n dou faze.

    Compilatoareletraduc programul dintr-un limbaj surs (de ex. C) ntr-un limbajobiect (de ex. cod main). Compilatoarele nu execut programul compilat.

    Limbajul obiect nu trebuie s fie n mod obligatoriul limbajul main. Un tipspecial de compilatoare sunt precompilatoarele care traduc o extensie a unuilimbaj ntr-un limbaj de baz. De multe ori activitatea de compilare esterealizat n mai multe faze. Vom insista asupra fazelor traducerii unui programsurs n program obiect executabil n capitolul 2.

    Interpretoarele traduc instruciune cu instruciune un cod surs, i pe msurce realizeaz traducerea unei instruciuni o i execut. Basic este un exemplude limbaj interpretat. Avantajul interpretoarelor fa de compilatoare este cdac apare o eroare ntr-o instruciune ea se poate corecta pe loc. Limbajele

    interpretate sunt ns, de obicei, limbaje simple, i nu permit astfel realizareaunor programe foarte complexe.

  • 8/3/2019 Introduce Re in Program Are

    7/33

    1.2. Clasificarea limbajelor 15

    Traducerea n dou faze presupune traducerea codului din cod surs ntr-uncod intermediar care apoi este rulat pe o main virtual. Limbajele carefuncioneaz pe acest principiu se numesc limbaje pseudo-compilative.Exemple de limbaje pseudo-compilative sunt Java i limbajele din familia .NET.

    1.2.3. Paradigmele limbajelor de programare

    Prin paradigm se nelege n general modelul sau arhetipul unui proces sausistem. Paradigmele de programare sunt colecii individualizate de caracteristicide evaluare i criterii de abstractizare care determini difereniaz clasele delimbaje de programare [Prv 1996]. Exemple de astfel de criterii sunt structuraprogramului, starea execuiei, metodologia programrii etc.

    Clasificrile limbajelor de programare dup paradigme difer de la autor la

    autor. Vom prezenta n cele ce urmeaz cteva paradigme de programareconsiderate mai importante n istoria limbajelor de programare [Nichi 2005].Trebuie s menionm c ideile cuprinse n limbajele de programare sunt ncontinu schimbare, datorit faptului c, permanent, apar limbaje noi, care demulte ori nu pot fi clasificate conform criteriilor existente.

    1.2.3.1. Paradigma programrii procedurale

    Clasificnd limbajele dup aceast paradigm, ele se mpart n limbajeprocedurale i limbaje neprocedurale.

    Limbajele procedurale se caracterizeaz prin faptul c utilizatorul descrie pascu pas algoritmul de rezolvare a problemei, printr-un ir de instruciuni careformeaz o procedur, rutin, subrutin sau funcie. Din acest punct de vedere,programul este o mulime ierarhic de blocuri i proceduri. Exponentul clasic alacestei paradigme este ALGOL60. Din aceast categorie amintim limbajelePascal, C, PL/I, Ada etc.

    n limbajele neprocedurale, utilizatorul nu mai descrie algoritmul de rezolvare,el doar indic sistemului ce anume dorete. n acest caz, sistemul esteresponsabil s gseasc calea de rezolvare a problemei.

    1.2.3.2. Paradigma programrii structurate

    Programarea structurat este n strns legtur cu programarea procedural.Muli autori consider aceste dou paradigme ca fiind de fapt una singur.Fundamentul programrii structurate este urmtorul enun: orice procedurcare are o singur intrare i o singur ieire poate fi reprezentat prin cele treistructuri fundamentale din algoritmic: structura liniar, structura ramificatistructura repetitiv. Astfel, s-a demonstrat c instruciunile de salt necondiionat

    din programe nu mai sunt necesare, i astfel se poate ordona activitatea descriere de cod. Alternativa la programarea structurat este programarea stil

  • 8/3/2019 Introduce Re in Program Are

    8/33

    16 Capitolul 1. Introducere n limbaje de programare

    spagetti, care reprezint un stil confuz de programare cu multe salturinecondiionate.

    Recomandm la nivel microscopic de programare utilizarea programriistructurate, adic folosirea n program doar a structurilor algoritmice

    fundamentale. Un program structurat este totdeauna mult mai lizibil i maiflexibil dect unul nestructurat.

    Exponentul principal al programrii structurate este Pascal.

    1.2.3.3. Paradigma programrii modulare

    Programarea modular const n descompunerea programului n moduleindependente, atomice. Principala idee este ncapsularea. Astfel, datele internemodulului sunt ascunse utilizatorului. Accesul la date se poate realiza doar prininterfa. n acest context, un modul are dou componente: interfaa iimplementarea.

    Paradigma programrii modulare extinde programarea procedural istructurat prin introducerea unui nivel superior de abstractizare: modulul. Seface astfel un pas important ctre programarea obiectual.

    Cele mai cunoscute limbaje modulare sunt Modula i Ada.

    1.2.3.4. Paradigma programrii obiectuale

    n aceast seciune vom descrie doar succint caracteristicile paradigmeiobiectuale. Partea a doua a prezentei lucrri conine o dezvoltare i oprezentare mai larg a conceptelor i metodelor de programare obiectual.

    Un obiect definete o entitate care conine informaie i are un comportament.Alte obiecte pot face uz de comportamentul obiectului pentru a ob ineinformaia ataat obiectului. n programarea obiectual, orice entitate dinlumea real poate fi considerat un obiect. Programul este considerat ca unansamblu de obiecte care interacioneaz ntre ele.

    n cadrul paradigmei obiectuale, obiectele reprezint ncapsularea datelor cucodul. Deci obiectele au o structur i o stare. Fiecare obiect defineteoperaiile care pot accesa i manipula aceast stare. Obiectele sunt unitiatomice n programe. Datele interne ale obiectelor se mai numesc proprieti,iar partea de cod formeaz metodele. Comunicarea ntre obiecte se face prinmesaje. Astfel, un apel de metoda a unui obiect poate fi considerat ca otransmitere de mesaj ctre obiectul apelat.

    Obiectele de acelai tip pot fi grupate n clase. Din acest punct de vedere,putem considera obiectele ca i instanieri ale claselor. Clasele pot fi relaionateunele cu altele, prin diverse tipuri de relaii. Astfel, avem relaiile de agregareprin care o clas se compune din alte clase, sau de generalizare/specializare,

  • 8/3/2019 Introduce Re in Program Are

    9/33

    1.2. Clasificarea limbajelor 17

    prin care o clas este caz particular (specializat) al unei superclase. Astfel, princompoziie i motenire se asigur reutilizarea codului.

    Principalul avantaj al programrii obiectuale fa de paradigmele anterioareeste realizarea polimorfismului. Prin polimorfism se nelege proprietatea unui

    nume de a fi utilizat cu nelesuri diferite. Cea mai important form depolimorfism este polimorfismul de tip, prin care tipul referinei se adapteaz latipul obiectului.

    Smalltalk este limbajul care a introdus paradigma obiectual. Acest limbaj afost dezvoltat n limbajele Smalltalk80 i Smalltalk86. C++ reprezint extensiaobiectual a limbajului structurat C. De asemenea Java implementeazcaracteristicile paradigmei obiectuale.

    1.2.3.5. Paradigma programrii funcionale

    n cadrul acestei paradigme programul este descris ca un ansamblu de funciiapelate, n general, recursiv. Ele pot interveni n structurile de date alelimbajului dar i n cadrul codului, fiind permise funcii de funcii (se acceptoperaia de compunere de funcii).

    Printre caracteristicile acestor limbaje amintim faptul c ele nu au instruciuni deatribuire i nu genereaz efecte secundare la apelul unei funcii. Prin efectsecundar la apelul unei funcii nelegem existena unui efect al rulrii funcieiasupra apelantului ei.

    Fundamentul matematic al limbajelor funcionale l constituie scrierea funciilorca i expresii lambda.

    Exemplul tipic de limbaj funcional este LISP. El se bazeaz pe gestiunealistelor. Un alt limbaj din aceast familie este ML, limbaj generic utilizat lastudiul teoretic al programrii funcionale.

    1.2.3.6. Paradigma programrii logice

    n programarea logic un program este alctuit din fapte i reguli pe bazacrora programul urmeaz s genereze concluzii. Limbajele din aceastparadigm se mai numesc limbaje declarative deoarece specificarea unuiprogram nseamn specificarea unor declaraii. Programul nu instruietecalculatorul cum s rezolve problema, ci spune calculatorului cum dorim sarate soluia problemei. n sensul programrii logice, programul indicprocesorului metodele i informaiile necesare pentru extragerea unei soluii deforma dorit.

    Baza matematic a acestor limbaje o constituie sistemele logice formale. Deobicei, acestea se bazeaz pe logica predicatelor de ordinul I, care poate fiextins sau mbogit cu alte axiome. Astfel, se pot obine logici modale,

  • 8/3/2019 Introduce Re in Program Are

    10/33

    18 Capitolul 1. Introducere n limbaje de programare

    temporale sau monotonice care pot s furnizeze mecanisme de deduciefolosite n limbajele logice.

    Prolog reprezint exemplul clasic de limbaj din aceast categorie. El reprezinttranscrierea ntr-un limbaj de programare a logicii predicatelor de ordinul I.

    Limbajele logice stau la baza motoarelor de inferen din sistemele expert.

    1.2.3.7. Paradigma programrii concurente i distribuite

    Aceast paradigm se bazeaz pe faptul c dou sau mai multe programe,respectiv pri ale aceluiai program se execut n paralel pe acelai procesorsau pe procesoare diferite. Astfel, aceast paradigm nu mai respectprincipiul linearitii n execuia instruciunilor componente ale unui program.Execuia aciunilor unui program poate fi independent sau pot depinde deexecuia instruciunilor altui program care se execut n paralel. Astfel, pentrusincronizarea execuiei programelor se folosesc tehnici de sincronizare iserializare, semafoare respectiv semnturi de timp. Astfel, se asigurcomunicarea ntre procese, accesul concurent la resurse, partajarea resurselor.

    Aspectul de distribuire se refer la utilizarea concomitent resurselor din maimulte locaii, respectiv la mprirea sarcinilor de executat i realizarea acestorade mai multe entiti de procesare.

    Limbajele concurente sunt de obicei extensii ale limbajelor din alte paradigme.Astfel, exist extensii concurente pentru C, Pascal, Fortran, Prolog. Exemplede limbaje concurente sunt CSP, Linda, Occam, Parlog.

    1.2.3.8. Alte paradigme de programare

    Muli autori consideri alte paradigme de programare.

    Astfel, pentru programarea la nivelul bazelor de date avem limbaje deprogramare precum SQL sau dBase. Acestea sunt destinate asigurrii uneigestiuni corecte i consistente a bazelor de date.

    Unii autori consider programarea vizual ca o paradigm de programare. ncadrul acestei paradigme ei ncadreaz mediile de dezvoltare rapid aprogramelor1. De obicei, ns aceste medii sunt destinate realizrii activitii deprogramare pentru un anume limbaj, i astfel, considerm c ele nu reprezinto nou paradigm de limbaje de programare.

    Limbajele bazate pe marcatori2 sunt folosite de obicei pentru structurarea ireprezentarea informaiei i mai puin pentru realizarea activitii deprogramare. Ele se bazeaz pe SGML, un limbaj standardizat, independent deplatform, utilizat la realizarea help-urilor i a componentelor sale. n cadrul

    1 Rapid Application Development (RAD) environments, n lb. Englez2 Markup Languages, n lb. Englez

  • 8/3/2019 Introduce Re in Program Are

    11/33

    1.2. Clasificarea limbajelor 19

    acestei categorii putem aminti XML, limbaj specializat pentru structurareainformaiei i HTML limbajul World Wide Web-ului.

    Programarea bazat pe ageni reprezint o nou paradigm de programare.Agenii reprezint un nivel de abstracie superior obiectelor, n sensul c agenii

    sunt entiti software autonome capabile de comportament pro-activ. Aceastanseamn, pe de-o parte, faptul c agenii au o stare i un comportamentpropriu iar, pe de alt parte, faptul c acest comportament se poate executa dindorina agentului, fr s fie nevoie invocarea comportamentului de o altentitate de program. Comportamentul agentului este ghidat mai mult deobiectivele, credinele i inteniile agentului dect de cereri explicite ale altorageni. Teoria agenilor reprezint o nou idee de realizare a programelorsoftware mai mult dect o baz care s conduc la realizarea de limbaje deprogramare specifice. Totui, exist limbaje specifice precum Telescript,

    Agents, AgentTcl etc. De multe ori pentru realizarea de sisteme cu agen i saucare respect principiile programrii cu ageni se utilizeaz limbaje deprogramare obiectuale generale (precum Java) care sunt extinse cu facilitidestinate agenilor. Se creeaz aa-numitele platforme multi-agent n care sepot crea (programa) ageni care s rezolve anumite sarcini. Amintim n cadrulplatformelor multi-agent tool-urile FIPA-OS, JADE, IBM Aglets, etc. n cadrulparadigmei programrii cu ageni se utilizeaz i limbaje de reprezentare acunotinelor agenilor i de facilitare a comunicrii inter-agent. n aceastcategorie putem nscrie KQML, KIF i ACL.

    1.3. Istoricul i evoluia limbajelor de programare

    n aceast seciune vom descrie principalele borne care au marcat istorialimbajelor de programare, mpreun cu elementele de noutate aduse de fiecarelimbaj important din punct de vedere a evoluiei istoriei informaticii. Tabelul 1prezint o legarea principalelor limbaje de programare de momentul apariiei.Figura 3 conine arborele limbajelor de programare, reflectnd influenele igenealogia limbajelor de programare. Acestea sunt preluate dup [Prv 1996].

    Dezvoltarea limbajelor de programare este strns legat de evoluia tiineicalculatoarelor. Astfel, pe msur ce mainile de calcul devin tot mai sofisticatei performante, evolueazi limbajele i paradigmele de programare, oferindnoi faciliti utilizatorilor de maini de calcul.

    Limbaj An Autori Predecesor Scop

    Fortran 1957-si J. Backus(IBM)

    Calcule numerice

    Algol60 1960-s Comitet Fortran Calcule numerice

    Cobol 1960-s DOD Prelucrri de date

    economice

  • 8/3/2019 Introduce Re in Program Are

    12/33

    20 Capitolul 1. Introducere n limbaje de programare

    APL 1960-si K. Iverson(Harvard)

    Prelucrri de tablouri

    Lisp 1962 J. McCarthy(MIT)

    Prelucrri de liste

    Snobol 1966-si R. Griswold(Bell) Prelucrri de iruri decaractere

    PL/1 1964-s IBM Fortran,Algol60, Cobol

    Uz general

    Simula67 1967 O.J. Dahl Algol60 Simulare

    Algol68 1968-s Comitet Algol60 Uz general

    Pascal 1971 N. Wirth (ETHZurich)

    Algol60 Uz general, scopeducaional

    Prolog 1972 Univ. Marsilia Programare logic

    C 1974 D. Ritchie(Bell)

    Algol60, BCPL Programare de sistem

    ConcurrentPascal

    1975 P.B. Hansen(CalTech)

    Pascal Programare concurent

    Euclid 1977 Comitet Pascal Programare de sistemverificabil

    Modula 1977 N. Wirth Pascal Programare de sistem ntimp real

    Ada 1979 J. Ichbiah (CII-

    Bull)

    Pascal,

    Simula67

    Uz general, aplicaii hibride

    Smalltalk 1980 Xerox PARC Simula67 Programare orientatobiect

    C++ 1984 B. Stroustrup C Programare orientatobiect

    Oberon 1987 N. Wirth Pascal,Modula

    Programare orientatobiect

    Modula-3 1988 DEC, Olivetti Modula Limbaj puternic modular,orientat obiect

    Java 1995 Sun Limbaj orientat obiect,traducere n dou faze

    Tabelul 1. Principalele limbaje de programare3.

    n 1944 maina numit Mark I realizat de IBM a fost primul calculator capabils execute o secven lung de operaii aritmetice i logice. n 1946 ENIAC(Electronic Numerical Integrator And Calculator) devine predecesorul primeigeneraii de calculatoare.

    3 si nseamn specificare i implementare, iar s nseamn numai specificare

  • 8/3/2019 Introduce Re in Program Are

    13/33

    1.3. Istoricul i evoluia limbajelor de programare 21

    n 1959 apare a doua generaie de calculatoare, bazat pe utilizareatranzistorilor. Calculatoarele din a 2-a generaie sunt de dimensiuni mai reduse,mai rapide, mai ieftine i mai fiabile.

    Fortran

    Algol60

    PL/1

    Pascal

    Modula-2

    Algol68

    CPL

    BCPL

    C

    C cu clase

    ANSI C

    Ada

    C++Modula-3

    Ada9X

    Simula67

    Lisp

    Smalltalk

    ObjectiveC

    1960

    1970

    1980

    1990

    Prolog

    Cobol

    Figura 3. Arborele genealogic al limbajelor de programare.

    n 1965 se introduc circuitele integrate, ceea ce reprezint un semnificativ salttehnologic. n acest moment ncepem s vorbim de cea de-a 3-a generaie decalculatoare. Circuitele integrate au permis pentru prima oar obinerea uneiviteze de calcul de peste un milion de operaii pe secund.

    Din 1970 putem vorbi de cea de-a 4-a generaie de calculatoare, prindezvoltarea microprocesorului. Acesta era un dispozitiv de calcul independent,care, integrat n maini de calcul a condus la realizarea unor computere mairapide, mai mici i mai ieftine.

  • 8/3/2019 Introduce Re in Program Are

    14/33

    22 Capitolul 1. Introducere n limbaje de programare

    Din acel moment pn n zilele noastre am asistat la o adevrat explozietehnologic din punct de vedere hardware. Calculatoarele de azi sunt capabilede performane greu de imaginat cu cteva decenii n urm.

    Bazele proiectrii calculatoarelor au fost puse n 1940 de matematicianul John

    von Neumann, prin descrierea arhitecturii von Neumann pentru maini decalcul. Aceast arhitectur a influenat puternic modul de dezvoltare a arteiprogramrii. Figura 4 descrie schematic structura unui calculator von Neumann.

    Limbajele de programare care au derivat din aceast arhitectur suntcunoscute i sub numele de limbaje imperative, datorit faptului c permitprogramatorului s-i specifice cerinele printr-o secven de instruciuni cares indice exact ceea ce trebuie fcut pentru rezolvarea problemei.

    Unitate aritmetica si logicaUnitate de control

    Memorie: programe si date

    Instructiuni Date

    intrari iesiri

    Figura 4. Arhitectura von Neumann

    Punctele istorice pe care le-am marcat n paragrafele precedente au avut unimpact major asupra dezvoltrii limbajelor de programare. Din momentul anilor

    70, dezvoltarea limbajelor de programare a ncercat s in pasul cudezvoltrile hardware, dar evoluia limbajelor de programare a luat o caledistinct. Vom descrie succint principalele limbaje de programare care aumarcat aceast istorie.

    La mijlocul anilor 50, n cadrul firmei IBM, s-a studiat posibilitatea realizrii unuitranslator algebric. Astfel, echipa condus de John Backus a realizat n 1954specificaia 0 a limbajului Fortran. Primul compilator de Fortran a fost realizat n1957 odat cu specificaia 2-a a acestui limbaj. Acest limbaj a devenit foartepopular datorit faptului c firma IBM l-a oferit gratuit. Fortran reprezint primul

    limbaj de programare de nivel nalt. Are o sintax apropiat de scriereamatematic. In Fortran linia de cod surs are un format fix cu 4 cmpuri, tipulvariabilelor este specificat printr-o convenie standard. Limbajul introduceinstruciunile IF pentru ramificare i DO pentru realizarea de cicluri.

    Limbajul Algol cu versiunea de referin Algol60 a avut o contribuieremarcabil la dezvoltarea limbajelor de programare. Din Algol au derivat oserie de limbaje de programare. Proprietile principale ale unui limbaj dinfamilia Algol sunt:

    - este algoritmic

  • 8/3/2019 Introduce Re in Program Are

    15/33

    1.3. Istoricul i evoluia limbajelor de programare 23

    - este imperativ (algoritmul este considerat o secven de modificri alememoriei)

    - are ca i uniti de baz blocul i procedura

    - conine conceptele de tip i verificare a tipului

    - are o specificare prin reguli sintactice- este compilativ

    Algol nu a devenit foarte popular datorit faptului c nu a prevzut intrri iieiri standard, nu avea un mecanism facil de transmitere a parametrilor prinnume i nu a fost susinut de IBM (care a promovat puternic limbajul Fortran)

    Tot la nceputul anilor 60 a aprut i cel de-al 3-lea limbaj de programare denivel nalt Cobol4. Limbajul se impune repede pe pia datorit sprijinuluiputernic al guvernului SUA i devine cel mai utilizat limbaj de programare n

    deceniul 7. Cobol introduce descrierea datelor independent de main, punndbazele sistemelor de gestiune a bazelor de date. Instruciunea if-then-elseapare pentru prima dat n form complet n Cobol. Pentru creterea lizibilitiiprogramelor Cobol permite folosirea de cuvinte n plus5.

    Linia Algol este continuat cu limbaje precum Algol-W, Algol68, Euler i maiapoi Pascal. Tot pe linia Algol-ului apare i limbajul Simula67 conceput pentruaplicaii n domeniul simulrii. Simula67 este primul limbaj care introduce clasa,considerat ca fiind un grup de declaraii i proceduri luate mpreuni tratateca o unitate distinct de program.

    Tot n aceast perioad de nceput a limbajelor de programare apare limbajulLisp, realizat de John McCarthy la MIT. Acest limbaj introduce un nou tip deprogramare, programarea funcional. n Lisp, datele i programele suntreprezentate uniform sub forma expresiilor simbolice. Lisp utilizeaz formaprefixat a operatorilor, iar structura fundamental de control esterecursivitatea. Lisp utilizeaz tehnica garbage collection n locul tergeriiexplicite a referinelor. Lisp rmne n continuare n actualitate fiind puternicaplicat n inteligena artificial, mai ales n SUA.

    Un alt limbaj important a fost PL/1. El mprumut concepte de la Fortran, Cobol

    i Algol68 i introduce pentru prima dat gestiunea excepiilor i multi-taskingul.PL/1 are un rol important n descrierea paralelismului.

    La sfritul anilor 60 Niklaus Wirth a realizat limbajul Pascal, urmrindrealizarea unui limbaj de programare cu numr mic de concepte integrate.Astfel Pascal furnizeaz un mecanism de structurare a datelor, care permite unnivel superior de abstractizare. Hoare i Wirth au oferit n 1971 definireaaxiomatic a limbajului. Limbajul Pascal permite verificarea programelor n fazade compilare. Pe lng aceste proprieti pozitive, totui Pascal are i lipsuri,

    4 COmmon Business Oriented Language, n lb. Englez5 Syntactic sugar, n lb. Englez

  • 8/3/2019 Introduce Re in Program Are

    16/33

    24 Capitolul 1. Introducere n limbaje de programare

    precum controlul insuficient al utilizrii pointerilor, sau anomalii n mecanismulde definire a tipurilor. n Pascal nu se pot folosi tablouri de dimensiuni variabile,lucru posibil n Algol68.

    Anii 70 s-au caracterizat prin concentrarea eforturilor de mbuntire a stilului

    de programare n limbajele imperative. Tendine majore au fost:- dezvoltarea tipului abstract de date, aprut odat cu conceptul de clas din

    Simula. Tipul abstract de date a fost dezvoltat n limbajele Euclid, modulai Ada. El este tratat din dou punte de vedere: relativ la proiectarealimbajului de programare i ca o proprietate a limbajului n sensul uneifaciliti puse la dispoziia programatorului.

    - Perfecionarea mecanismelor de gestiune a excepiilor.

    - ncorporarea de mecanisme pentru descrierea proceselor paralele. Astfel,s-au dezvoltat concepte precum semaforul, monitorul sau sincronizarea

    prin transmitere de mesaje. Modula i Ada au faciliti pentru tratareaconcurenei.

    Merit s amintim ca limbaje importante limbajul C, n care este scris sistemulde operare Unix, i limbajul Smalltalk care marcheaz nceputul programriiobiectuale.

    Ada este un limbaj important la sfritul anilor 70. Acest limbaj a fost promovatde DOD6 n scopul de a unifica limbajele de programare n care sunt scriseaplicaiile militare. Ada este un limbaj de tip Pascal coninnd n plus facilitipentru calcule numerice, intrri/ieiri nestandard, specificarea dependenei demain, gestiunea excepiilor, abstractizarea datelor i concuren. Proprietilelimbajului acoper toat gama conceptelor moderne de modularitate,portabilitate, extensibilitate, abstractizare, faciliti de dezvoltare a programelori de ntreinere.

    Anii 80 au fost marcai de dezvoltri n domeniul limbajelor pentru inteligenartificiali a paradigmei programrii obiectuale. Astfel, apare generaia 5-a delimbaje de programare prin Prolog, iar limbajul Smalltalk evolueaz i apareextensia C++ a limbajului de programare C. Tot n aceast perioad sestandardizeaz o serie de limbaje de programare vechi (Fortran, Cobol i

    Pascal) i apare standardul ANSI pentru C. Se dezvolt limbaje de programarepentru manipularea datelor n aplicaii de gestiune precum dBase, FoxBase,FoxPro, Reflex sau Paradox. Aceste limbaje au o sintax simpl i suntdestinate cu preponderen utilizatorilor neprofesioniti. Aceast perioad estemarcat de nceputul eforturilor pentru furnizarea unor medii de programareputernice pentru diferite limbaje. Apar mediile de programare Turbo, editoarede texte (WordStar, WordPerfect, MicrosoftWord), editoare pentru prelucrri de

    6 United States Department of Defense

  • 8/3/2019 Introduce Re in Program Are

    17/33

    1.3. Istoricul i evoluia limbajelor de programare 25

    tabele (Lotus, Borland Quattro, Excel), pachete de proiectare asistat CAD(AutoCAD, ORCAD) i utilitare de ntreinere.

    Anii 90 sunt marcai de apariia limbajelor de programare cu traducere n doufaze i de limbajul Java. Acesta implementeaz ntr-o manier mult mai clari

    mai concis paradigma obiectual i, prin rulare pe maina virtual Javaasigur portabilitatea programelor. n condiiile proliferrii paradigmeiobiectuale, Java s-a impus rapid, probabil i datorit dezvoltrii fr precedenta Internetului. Totui, Java sufer la capitolul eficien la rulare, n sensul cprogramele complexe Java necesit resurse de calcul i de memorie sporitepentru o rulare eficient. Din acest punct de vedere, limbajul C++ rmnealegerea programatorilor atunci cnd criteriul de eficien este esenial.Succesul tehnologiilor Java, facilitile deosebite de programare pe care acestlimbaj le ofer au impulsionat productorii de limbaje de programare s-i

    reconsidere oferta. Astfel, Microsoft a lansat pachetul .NET care, spredeosebire de pachetele MSVisual ofer o tratare n 2 faze a procesului decompilare execuie a programelor.

    Tehnologia obiectual a devenit preponderent n activitatea de programare, nstrns legtur cu dezvoltarea bazelor de date relaionale i a serverelorputernice de date. Tehnologia obiectual a fost capabil s ofere un suportconsistent acestor cerine, astfel c a reuit s se impun n dezvoltareaaplicaiilor comerciale. Preocuparea a fost standardizarea modului dedezvoltare a software-ului. Astfel, eforturile OMG7 sunt remarcabile, i au

    culminat cu standardizarea specificaiilor UML

    8

    pentru proiectarea obiectual.UML este azi larg adoptat n firmele de software pentru descrierea procesuluide dezvoltare a produselor soft, n toate fazele acestuia, de la culegereacerinelor, analiz, proiectare, implementare pn la testare i integrareaprodusului.

    n prezent tendinele dezvoltrii limbajelor de programare conduc sprestandardizarea reprezentrii cunotinelor, definirea i nglobarea n limbaj aunui nivel semantic, utilizarea facilitilor inteligentei artificiale n realizareaaplicaiilor curente.

    1.4. ntrebri propuse

    1. Ce este un limbaj de programare? Descriei universul limbajelor deprogramare.

    2. Descriei cele 3 aspecte caracteristice ale unui limbaj de programare.

    3. Descriei caracteristicile generaiilor de limbaje de programare.

    7 Object Management Group8 Unified Modeling Language

  • 8/3/2019 Introduce Re in Program Are

    18/33

    26 Capitolul 1. Introducere n limbaje de programare

    4. Descriei tipurile de programe de traducere.

    5. Care sunt principiile programrii structurate?

    6. Descriei evoluia paradigmelor de programare n ceea ce privete trecereade la procedur, la modul i mai apoi la obiect.

    7. Descriei asemnrile i deosebirile dintre paradigma programriifuncionale i programarea logic.

    8. De ce este impropriu s considerm XML un limbaj de programare?

    9. Descriei caracteristicile eseniale ale limbajelor de programare din anii 60.

    10. Descriei caracteristicile eseniale ale limbajelor de programare din anii 70.

    11. Descriei principalele evoluii ale limbajelor de programare n anii 80 i 90.

  • 8/3/2019 Introduce Re in Program Are

    19/33

    Capitolul 2.

    Fundamentele limbajelor de programare

    n acest capitol vom introduce aspectele formale ale limbajelor de programare.Astfel, vom defini limbajele abstracte, ca i fundament pentru dezvoltareatehnicilor de parsare i a compilatoarelor. Seciunea 2-a a capitolului vaprezenta paii i operaiile pe care le suport un cod surs pentru a fitransformat n cod main, prin operaia de compilare.

    2.1. Limbaje abstracte

    n acest capitol vom prezenta succint formalizarea exhaustiv a teorieilimbajelor de programare. Materiale precum [Aho 1977], [erbnai 1987]conin o tratare detaliat a acestui subiect. Teoria limbajelor de programareeste necesar pentru specificarea formal corect a limbajelor i reprezint unfundament pentru teoria compilrii.

    2.1.1. Gramatici

    Fie o mulime A nevid, finit, numitalfabet. Elementele acestei mulimi se

    numesc simboluri. Un simbol din A este reprezentat ntr-un limbaj printr-oliter, cifr sau semn, uneori printr-un ir finit de litere, cifre sau semne.

    Notm prin *A mulimea aranjamentelor cu repetiie ale simbolurilor din A .

    Astfel, un element din *A este un ir finit de simboluri din A . Simbolurile se

    pot repeta n ir. Mulimea *A conine i irul vid; vom nota acest ir cu .

    Numrul de simboluri dintr-un ir din *A se numete lungimea irului. Seobserv c dac avem dou iruri x i y din *A atunci irul xyz = ,

    obinut prin alturarea simbolurilor din x cu simbolurile din y , va fi de

    asemenea, element al mulimii *A . Operaia prin care se obine irul z din

    irurile x i y se numete concatenare. Mulimea *A nzestrat cu operaia

    de concatenare are o structur de monoid.

    Prin definiie, un limbaj formal peste alfabetul A este o submulime L a lui

    *A .

  • 8/3/2019 Introduce Re in Program Are

    20/33

    28 Capitolul 2. Fundamentele limbajelor de programare

    Fiind dat un alfabet A i mulimea *)(AP a prilor mulimii *A , pe aceast

    din urm mulime putem defini urmtoarele operaii de baz:

    a. intersecie: 21 LL

    b. reuniune: 21 LL

    c. complementare: }|*{ LxAxL =

    d. produs: },|{22112121 LxLxxxLL = . Notm cu ,...

    2 LLL =

    e. stea: ......}{*2

    =nLLLL

    f. reflectare: }|~{~

    LxxL = unde x~ este imaginea reflectat a lui x

    n legtur cu un limbaj formal, se pune problema apartenenei unei construciila limbaj, adic, n condiiile furnizrii unui cuvnt *Ax , dac se poate

    decide (demonstra) una din urmtoarele 2 concluzii: Lx sau Lx .

    Se spune c un limbaj L este decidabil, dac rspunsul la ntrebarea de maisus este pozitiv.

    Conceptul de algoritm st la baza rezolvrii acestei probleme. Adic, trebuie sdecidem rspunsul la ntrebarea de apartenen ntr-un timp finit folosindoperaii precis definite. Problema apartenenei unui cuvnt la limbaj, n cazul

    limbajelor de programare trebuie s fie rezolvat de compilator, adic acestatrebuie s decid dac codul surs furnizat de programator satisface sau nuregulile limbajului, adic poate fi compilat sau nu.

    n cazul n care limbajul L este finit, atunci limbajul este decidabil. Dac L este infinit, trebuie s folosim alte metode pentru a rspunde la ntrebarea dedecidabilitate.

    Specificarea limbajului nseamn fie enumerarea tuturor elementelor acestuia,fie enunarea unor reguli de construcie a elementelor limbajului. Noiunea de

    gramatic st la baza specificrii unui limbaj prin generarea tuturor cuvintelorsale.

    Prin definiie, un sistem formal este un cvadruplu ordonat >=< RFAS ,,,

    alctuit din:

    - alfabetul sistemului A

    - mulimea decidabil a formulelor corecte, *AF

    - mulimea decidabil a axiomelor, F

  • 8/3/2019 Introduce Re in Program Are

    21/33

    2.1. Limbaje abstracte 29

    - mulimea finit a regulilor de deducie (inferen) R . O regul de deducie

    de aritate 1+n este o relaie din mulimea FFn , care asociaz o

    formul unic x cu un n-tuplu >=< nyyyy ,...,, 21 . Spunem c x se

    deduce din nyyy ,...,, 21 i scriem Rxy .

    Fie formulele corecte nyyy ,...,, 21 , numite premise. Fie

    = },...,,{ 210 nyyyE . Atunci,n

    E0 reprezint mulimea tuturor n-tuplelor

    cu formule din 0E . Atunci, aplicnd succesiv regulile de deducie din R

    putem obine mulimile U1

    11 },|{ incatastfel

    =

    n

    n

    iii RxyEyxEE .

    Dac mulimea premiselor e vid, adic =0E atunci elementele lui iE se

    numesc teoreme. Dac x este o teorem, atunci ea s-a obinut prin aplicarea

    succesiv a unor reguli de deducie asupra unor formule din mulimile iE .

    Secvena acestor reguli de deducie alctuiete demonstraia teoremei x .

    Prin definiie, urmtorul caz particular de sistem formal:

    a. alfabetul A al sistemului formal este finit i este alctuit din dou mulimi

    disjuncte N i , alfabetul de simboluri neterminale respective alfabetulde simboluri terminale.

    b. *AF= : toate irurile finite pe alfabet sunt formule corecte.

    c. conine un singur element, i anume un simbol neterminal S . Acestsimbol se numete simbol de nceput.

    d. Regulile de deducii au la baz producii: O producie este o pereche

    ),( de formule, notat cu . Regula de producie asociat

    unei producii este o regul de rescriere, adic QPQP unde P

    i Q sunt 2 iruri din F . Aceasta nseamn c n orice formul corect

    care conine subirul se poate nlocui cu i se obine tot o

    formul corect. Notm cu P mulimea finit de producii.

    n aceste condiii, sistemul formal >=< SPNG ,,, se numete gramatic.

    Procesul de inferen n cazul gramaticilor se numete derivare.

    Spunem despre douiruri i din F c deriveaz imediat n n

    cadrul unei gramatici date, dac exist dou iruri 1 i 2 din F i o

  • 8/3/2019 Introduce Re in Program Are

    22/33

    30 Capitolul 2. Fundamentele limbajelor de programare

    producie astfel nct 21 = i 21= . O asemenearelaie de derivare reprezint o derivare ntr-un singur pas. Derivarea se poate

    defini pe k pai, n cazul este obinut din prin k derivri.

    O relaie de derivare a lui din este nebanal, dac obinerea lui serealizeaz ntr-un numr nenul de pai. Relaia de derivare se numete

    general dac se obine din ntr-un numr nenul de pai sau dac cele 2formule coincid.

    Prin definiie, un limbaj generat de o gramatic G este mulimea tuturor

    propoziiilor }{)( xGL = cu proprietatea c S deriv general pe x .

    Dac limbajele generate de dou gramatici coincid, se spune c gramaticilesunt echivalente.

    Conform definiiei gramaticilor enunat de mai sus, Naom Chomsky le-aclasificat dup forma produciilor. Astfel, avem urmtoarele tipuri de gramatici:

    1. Clasa gramaticilor de tip 0: reprezint cea mai general clas de gramatici,sunt cele care respect definiia general furnizat mai sus.

    2. Clasa gramaticilor de tip 1: produciile sunt de forma: A . A

    este un simbol neterminal, este ir oarecare, diferit de simbolul vid.

    Aceste gramatici se mai numesc i dependente de context.

    3. Clasa gramaticilor de tip 2: produciile sunt de forma: A , unde A este un simbol neterminal, este ir oarecare. Aceste gramatici se mainumesc i independente de context.

    4. Clasa gramaticilor de tip 3 sau regulate: produciile sunt de forma

    aBA sau aA , unde A i B sunt simboluri neterminale iar a este simbol terminal.

    Corespunztor claselor de gramatici, avem clase de limbaje. Astfel, se poatedefini o ierarhie Chomsky a limbajelor.

    Limbajul independent de context (de tip 2) este modelul limbajelor deprogramare.

    n ceea ce privete utilitatea studiului gramaticilor pentru scriereacompilatoarelor urmtoarea teorem este important:

    Orice limbaj dependent de context (i n consecin independent de context iregulat) este decidabil. Deci, limbajele de programare sunt decidabile.

  • 8/3/2019 Introduce Re in Program Are

    23/33

    2.1. Limbaje abstracte 31

    2.1.2. Specificarea limbajelor de programare

    2.1.2.1. BNF

    Pentru descrierea limbajelor de programare se folosesc meta-limbaje. Acesteafurnizeaz reguli prin care se pot specifica irurile acceptate de un limbaj deprogramare.

    BNF (Backus Naur Form) reprezint cel mai utilizat limbaj de specificare alimbajelor de programare. n fond, BND descrie o gramatic independent decontext. n BNF, simbolurile neterminare se scriu ntre paranteze unghiulare ise definesc recursiv, prin meta-formule. De asemenea, semnul ::= face partedin limbajul de specificare. El se poate traduce prin: se definete astfel.Simbolul | nseamn alegere, n sensul c permite utilizarea uneia din cele 2

    alternative alturate simbolului. Astfel, n BNF, simbolurile , ::=, | senumesc meta-simboluri.

    Pentru a exemplifica utilizarea BNF, vom descrie n acest limbaj de specificaresintaxa de compunere a unei propoziii simple ntr-un limbaj informal. Astfel,avem urmtoarea definiie BNF:

    ::=.

    ::=|

    ::=sees|hits

    ::=|

    ::=a|the::=he|she

    ::=him|her

    n consecin, se constat faptul c o propoziie este compus prin alturareaunui subiect, verb i a unui obiect (atribut). Propoziia se termin cu simbolulterminal punct. Subiectul poate fi un articol alturat unui substantiv sau(simbolul |) un pronume de tip subiect. Pronumele de tip subiect poate fi unuldin simbolurile terminale he sau she etc.

    Astfel, prin asemenea construcii se pot descrie toate regulile de producie dinlimbaj. De fapt, prin BNF descriem ntreaga gramatic pe baza creia apoi,putem genera limbajul corespunztor acesteia. Deci, pornind de la specificareaBNF a unei gramatici, putem folosi aceast specificare pentru a genera limbajuli pentru a recunoate sintagmele acceptate de gramatica definit.

    Procesul prin care, avnd dat la intrare o propoziie, determinm (decidem)dac propoziia respectiv este acceptabil, n contextul unei gramatici senumete parsare.

  • 8/3/2019 Introduce Re in Program Are

    24/33

    32 Capitolul 2. Fundamentele limbajelor de programare

    2.1.2.2. EBNF

    De multe ori, specificarea BNF este greoaie din punct de vedere al lizibilitii,mai ales atunci cnd un simbol neterminal se poate repeta, de un numr finitsau infinit de ori, ntr-o construcie. De exemplu, putem considera definirea unuistring ca fiind un ir de una sau mai multe cifre:

    ::=|

    Pentru a uura asemenea construcii, EBNF introduce urmtoarele meta-simboluri:

    {} tot ce e inclus ntre acolade se poate repeta, sau poate lipsi

    [] tot ce e inclus ntre parantezele drepte poate lipsi (este opional)

    Astfel, construcia de mai sus poate fi scris:

    ::={}

    De exemplu, pentru a defini un numr, care poate avea simbolul de semn,putem folosi urmtoarele construcii alternative:

    ::=| n BNF

    sau

    =[] n EBNF

    EBNF introduce i alte meta-simboluri ajuttoare. Astfel avem:

    * nlocuiete acoladele, are semnificaia c simbolul precedent se poaterepeta de un numr de 0 sau mai multe ori

    + simbolul precedent se poate repeta de 1 sau mai multe ori _ se subliniaz meta-simbolurile, atunci cnd acestea fac parte dinalfabetul limbajului specificat

    2.1.2.3. Diagrame de sintax

    Reprezint o descriere alternativ vizual, a specificrii unui limbaj. Au fostintroduse la specificarea limbajului Pascal. Diagramele de sintax reprezintgrafuri orientate avnd ca noduri simbolurile din limbaj iar sgeile indicsuccesiunea acceptat a acestora.

    S considerm o gramatic specificat n limbaj EBNF.

  • 8/3/2019 Introduce Re in Program Are

    25/33

    2.1. Limbaje abstracte 33

    ::==

    ::=[]

    ::=[]

    ::=*|+|-|/

    ::=+|-::=[.]|.

    ::={}

    ::=0|1|2|3|4|5|6|7|8|9

    Figura 5 prezint cteva diagrame de sintax pentru elementele gramaticii demai sus.

    =

    01

    2

    3

    4

    5

    6

    7

    8

    9

    Figura 5. Diagrame de sintax.

    2.1.3. Automate de acceptare

    Un automat de acceptare este folosit pentru a rspunde la ntrebarea: un ir x

    aparine limbajului L sau nu?

    Automatul este definit ca o main cu operaii simple, care primete irul deanalizat pe un suport oarecare, l parcurge, i rspunsul final este dat de starea

    n care rmne unitatea de comand a automatului. Suportul pe care estefurnizat irul este denumit generic band de intrare, iar variabila care parcurgeirul de analizat n citire se numete cap de citire. Automatul poate folosi omemorie auxiliar pentru pstrarea unor informaii care s fie de folos la un

    moment dat, n procesul decizional.

  • 8/3/2019 Introduce Re in Program Are

    26/33

    34 Capitolul 2. Fundamentele limbajelor de programare

    Asemenea automate sunt definite prin grafuri. Nodurile grafului reprezint striale automatului, iar arcele reprezint tranziii ntre stri. Arcele sunt marcate cucondiii, cu semnificaia c, dac automatul se afl ntr-o anumit stare, i se

    ndeplinete condiia de pe un arc care iese din starea respectiv, atunci

    automatul va trece n starea de la cellalt capt al arcului selectat.Automatele pot fi:

    - deterministe, dac dintr-o stare se poate realiza cel mult o singur micare

    - nedeterministe, dac dintr-o stare exist mai multe micri posibile.Automatele nedeterministe corespund gramaticilor cu producii cualternative.

    Un ir x este acceptat de un automat U dac, pornind de la configuraiainiial, prin micrile automatului se parcurge ntregul ir de intrare iautomatul ajunge ntr-o configuraie final.

    Pentru exemplificare, vom considera automatul finit din figura 6.

    q0 q1a

    b

    ba

    Figura 6. Diagrama de tranziii a unui automat finit cu 2 stri

    Astfel, automatul din figura 6 are 2 stri: q0 i q1. q0 reprezint starea iniial,q1 reprezint starea final. Dac, pe banda de intrare se ntlnete irul a iautomatul este n starea q0, atunci automatul trece n starea q1. Dac pebanda de intrare se ntlnete irul b i automatul este n starea q0, atunciautomatul rmne n aceeai stare etc. Tabelul 2 prezint matricea de definirecorespunztoare acestui automat.

    a b

    q0 q1 q0

    q1 q1 q0

    Tabelul 2. Matricea automatului din figura 6

    Pentru acest automat, irul aaba este un ir acceptat deoarece:

    (q0,aaba) a (q1,aba) a (q1,ba) a (q0,a) a (q1,)

    Deci, pornindu-se din starea iniial q0, se parcurge irul de intrare i n final, la

    epuizarea acestuia, se ajunge n starea final q1, cu irul vid .

  • 8/3/2019 Introduce Re in Program Are

    27/33

    2.1. Limbaje abstracte 35

    Exemplul din figura 6 reprezint un automat finit determinist. n figura 7prezentm un exemplu de automat finit nedeterminist. Tabelul 3 reprezintmatricea de tranziii pentru acest automat. Caracteristic automatuluinedeterminist este faptul c dintr-un nod pot iei mai multe sgei etichetate cu

    acelai simbol de intrare, precum i sgei etichetate cu care reprezinttranziii independente de intrare.

    0 1

    2

    3a b

    b b

    a

    a

    Figura 7. Diagrama de tranziie a unui automat finit

    nedeterminist

    a b

    0 {0,1} - {2}

    1 - {2,3} -

    2 {2} {3} -

    3 - - -

    Tabelul 3. Matricea automatului finit din figura 7

    Se poate stabili o relaie ntre automatele finite deterministe i celenedeterministe. Astfel, pentru orice automat finit nedeterminist exist unautomat finit determinist care accept acelai limbaj. Vom prezenta succint ncele ce urmeaz algoritmul de calcul al automatului finit determinist echivalentdin punct de vedere al limbajului acceptat cu un automat finit nedeterminist.

    Considerm un automat finit nedeterminist care conine mulimea de stri Q .

    Fie mulimea de simboluri de intrare acceptate de automat.

    Vom construi automatul determinist cu mulimea de stri 1Q pe aceeai

    mulime de simboluri de intrare astfel:

  • 8/3/2019 Introduce Re in Program Are

    28/33

    36 Capitolul 2. Fundamentele limbajelor de programare

    Procedure AFN2AFD

    }{01 qQ

    while (mai exist stri nemarcate n 1Q

    ],...,,[ 21 kqqqq o stare nemarcat din 1Q

    Se marcheazq

    for a do

    0/M

    For ki ,1=

    ),( aqMM i End for

    )},(|{' Mppq = - nchiderea tranzitiv a lui M

    if 1' Qq

    }'{11 qQQ end if

    La mulimea de tranziii a automatului determinist adaug

    tranziia 'qq prin simbolul de intrare aend for

    end whileend procedure

    Figura 8. Transformarea unui automat finit nedeterminist ntr-unautomat determinist echivalent din punct de vedere al limbajului

    acceptat

    n algoritmul din figura 8 s-au realizat urmtoarele notaii:

    - 0q reprezint starea iniial din automatul nedeterminist. 0q este nchiderea

    tranzitiv a strii iniiale.

    - ),( aq reprezint starea care urmeaz lui q n automatul nedeterminist prin

    considerarea simbolului de intrare a.

    - nchiderea tranzitiv a unei mulimi de stri este mulimea tuturor strilor lacare se poate ajunge considernd stri din mulimea de intrare i tranziii doarprin irul vid.

    Algoritmul prezentat este iterativ i se bazeaz pe cutarea strilor nouluiautomat prin includerea de stri din vechiul automat i marcarea nodurilor dejacreate. Vom exemplifica aplicarea acestui algoritm pe automatul nedeterminist

    din figura 7.

  • 8/3/2019 Introduce Re in Program Are

    29/33

    2.1. Limbaje abstracte 37

    Deci, starea iniial0q este nodul 0. nchiderea tranzitiv a acestui nod conine

    nodul 0 mpreun cu toate nodurile n care se poate ajunge din acest nod

    considernd doar tranziii vide. Deci0q este [0,2]. Acesta va reprezenta primul

    nod din noul automat determinist. Marcm acest nod, i ncercm sdeterminm alte noduri ale automatului determinist. Pentru aceasta vomconsidera, pe rnd, fiecare simbol de intrare acceptat de automat. Fie pentru

    nceput simbolul a. Construim mulimea M ca fiind mulimea tuturor nodurilor

    destinaie, pornind de la noduri din 0q i considernd tranziii acceptate de

    automatul nedeterminist prin simbolul a. Obinem }2,1,0{=M . Considerm

    nchiderea tranzitiv a lui M , adic toate nodurile la care se poate ajunge din

    noduri din M prin tranziii vide succesive. Dup considerarea acestei operaii,mulimea nou format 'q conine aceleai noduri ca i M . Extindem mulimea

    de noduri ale noului automat cu acest nou nod ]2,1,0[' =q . n automatul

    determinist adugm tranziia prin simbolul de intrare a din nodul0q n nodul

    'q . Continum algoritmul prin considerarea celui de-al doilea simbol de intrare,

    b. Considernd toate nodurile care urmeaz din noduri ale lui0q prin b, vom

    dezvolta mulimea }3{=M . nchiderea tranzitiv a lui M este mulimea

    vid. Deci, vom aduga starea mulime vid n automatul determinist i vomlega aceast stare de starea iniial prin tranziia pe simbolul de intrare b.

    Continum algoritmul prin marcarea unei noi stri, ]2,1,0[ , i reluarea

    acelorai pai. Figura 9 conine automatul finit determinist obinut.

    Transformarea unui automat finit nedeterminist ntr-un automat finit deterministeste important deoarece lucrul cu automatele nedeterministe este dificil,

    datorit traiectoriilor paralele pe care le poate lua calculul n aceste automate.Dar noi trebuie s privim aceste automate n contextul studiului gramaticilor,care definesc limbajele de programare. Astfel, pornind de la o gramatic, sepoate genera un automat finit care s accepte gramatica respectiv. Dacautomatul finit obinut pentru o gramatic este nedeterminist, vom aplicaprocedura din figura 8 pentru a construi automatul finit determinist echivalent.

    Automatele deterministe ne indic modul n care trebuie s tratm un ir deintrare pentru a identifica dac acesta este acceptat sau nu de automat. Astfel,la construirea compilatoarelor, analizorul sintactic folosete logica automatului

    pentru a spune dac o construcie de intrare e valid sau nu, i n caz afirmativ,consider mai departe aceast construcie.

  • 8/3/2019 Introduce Re in Program Are

    30/33

    38 Capitolul 2. Fundamentele limbajelor de programare

    [0,2]

    [0,1,2] [2,3]

    [2]

    [3]

    [0]

    a

    b

    b

    b

    b

    a,b

    a

    a

    a

    Figura 9. Automatul finit determinist echivalent automatului din

    figura 7.

    n practic, ori de cte ori avem de implementat un parser, adic un programcare interpreteaz la intrare iruri de caractere cu anumite proprieti, prindescrierea automatului corespunztor putem identifica traiectoriile posibile deintrare i implementa un analizor corect i eficient. n ANSI C exist bibliotecade expresii regulate folosite pentru generare de abloane de iruri de caractere,care urmeaz exact regulile semantice de descriere ale automatelor.

    2.2. Compilatoare

    n procesul de comunicare om-calculator intervine un program intermediar,translatorul, care asigur traducerea programelor scrise de utilizator din codsurs ntr-un alt limbaj mai apropiat de calculator. Dac limbajul int este codulmain, translatorul se numete compilator. Astfel, execuia unui programsurs se realizeaz, n cadrul limbajelor compilative, n 2 faze:

    - compilare, care traduce codul surs n program obiect- execuie, care ruleaz codul obiect pe calculator, folosind datele iniiale ale

    programului i produce rezultate

    Compilatorul unui limbaj de asamblare se numete asamblor.

    n practic, pe lng compilatoarele obinuite, exist i alte tipuri decompilatoare.

    Astfel, preprocesoarele sunt translatoare care traduc dintr-un limbaj de nivelnalt n alt limbaj de nivel nalt. Preprocesorul limbajului C++ reprezint un bunexemplu.

  • 8/3/2019 Introduce Re in Program Are

    31/33

    2.2. Compilatoare 39

    Cross-compilatoarelesunt compilatoare scrise pentru un calculator gazd, nvederea generrii de cod pentru alt calculator. Cross-compilatoarele suntfolosite la scrierea de cod pentru diverse dispozitive inteligente, care coninprocesoare.

    n cazul limbajelor interpretative, compilatorul este de tip special, adicincremental. Astfel, programul surs este spart de ctre compilator n poriunimici numite incremente, care au o oarecare independen sintactic isemantic. Incrementele sunt traduse de compilator. Pe msur cecompilatorul traduce un increment, calculatorul execut incrementul tradus.

    n mod tradiional, un compilator realizeaz un ir de transformri asupracodului surs n reprezentri din ce n ce mai apropiate de codul main.Figura 10 prezint fazele unui compilator.

    Analizalexicala

    Analizasintactica

    Analizasemantica

    Optimizarede cod

    Generare decod

    Tratareaerorilor

    Gestiuneatabelelor

    Program

    sursa

    Sir de atomi

    lexicali

    Arbore

    sintactic

    Cod

    intermediar

    Cod intermediar

    optimizat

    Program

    obiect

    Figura 10. Fazele unui compilator [erbnai 1987].

    Analiza lexical grupeaz caracterele din program n subiruri numite atomilexicali care reprezint cuvintele cheie, operatori, constante, identificatori idelimitatori.

    irul de atomi lexicali este preluat de analiza sintactic. Aceasta depisteazstructuri sintactice cum ar fi expresii, liste, instruciuni, proceduri. Acestestructuri sunt plasate ntr-un arbore sintactic conform relaiilor existente ntreaceste structuri.

    Analiza semantic folosete structura programului pentru extragerea

    informaiilor privind obiectele purttoare de date (variabile, proceduri, funcii),verificarea consistenei utilizrii lor. Pe msura parcurgerii arborelui sintactic,analiza semantic construiete o reprezentare a codului surs n codintermediar. Acesta este de obicei un ir de instruciuni simple cu format fix.Ordinea operaiilor din codul intermediar respect ordinea de execuie aacestora pe calculator.

    Codul intermediar este prelucrat n faza de optimizare pentru eliminarearedundanelor de calcule, a calculelor i variabilelor inutile, pentru o execuiemai eficient.

  • 8/3/2019 Introduce Re in Program Are

    32/33

    40 Capitolul 2. Fundamentele limbajelor de programare

    Generarea de cod aloc celule de memorie pentru memorarea datelor laexecuie. Se aloc registre i se produce cod obiect echivalent cu programul nlimbaj intermediar.

    Gestiunea tabelelor este de fapt, o colecie de proceduri care creeaz i

    actualizeaz datele cu care lucreaz celelalte faze. n aceast tabel, pe lnginformaii proprii compilatorului se gsesc i tabele ale identificatorilor,constantelor, cuvintelor cheie. Uneori avem o tabel unic, numit tabelasimbolurilor.

    Tratarea erorilor este o colecie de proceduri care sunt activate ori de cte orise depisteaz o greeal n program. De obicei, utilizatorul primete un mesajde diagnostic. Dac greeala este identificat n faza de analiz sintactic,compilatorul poate s-i urmeze analiza pentru a detecta i alte erori.

    Structura prezentat este mai mult conceptual. Compilatoarele concrete de

    multe ori prezint abateri fa de aceast structur. Unele componente pot lipsi,sau funcionalitatea lor poate fi preluat de alte componente, sau ordineaactivrii componentelor poate fi diferit.

    Realizarea compilatoarelor presupune un volum mare de munc. Exist uneltesoftware specializate care asigur faciliti de dezvoltare a compilatoarelor.Astfel, avem uneltele LEX i YACC sub Unix care permit descrierea sintactici semantic a unui compilator, conform regulilor limbajului, utilizndautomatele de acceptare a construciilor de intrare. Programatorul trebuie sdescrie regulile limbajului i sintaxa propoziiilor acceptate n format de expresii

    regulate, iar mai apoi construcia int asociat fiecrei sintagme de limbajsurs. Utilitarele genereaz un cod C care apoi compilat, reprezint de faptcompilatorul pentru limbajul surs considerat.

    Datele de intrare pentru asemenea unelte sunt:

    - specificaia limbajului surs, n ceea ce privete descrierea lexicului i asintaxei

    - specificaia limbajului inti a regulilor semantice de traducere

    - specificaia mainii int

    Dac n trecut, timpul de elaborare a unui compilator era destul de mare, azi,utiliznd asemenea tool-uri moderne putem realiza rapid compilatoare pentrudiverse limbaje.

    2.3. ntrebri propuse

    1. Descriei clasificarea gramaticilor dup Naom Chomsky.

    2. De ce limbajul independent de context reprezint modelul unui limbaj deprogramare?

  • 8/3/2019 Introduce Re in Program Are

    33/33

    2.3. ntrebri propuse 41

    3. Cum se specific un automat? Care sunt tipurile de automate? Explicaiimportana studierii automatelor cu privire la studiul limbajelor deprogramare.

    4. Explicai structura (fazele) unui compilator. Ce se ntmpl n fiecare faz?

    5. Se d urmtoare specificare EBNF pentru un calculator de buzunar:(a) ::={}

    (b) ::={}=

    (c) ::={}

    Sunt aceste reguli de specificare corecte?

    6. Fie urmtoarele producii:::=[.]

    ::={}

    ::=0|1|2|3|4|5|6|7|8|9

    Se decid care din urmtoarele numere sunt acceptate sau nu de gramaticaspecificat mai sus:

    (a) 1

    (b) 1.

    (c) 1.1

    (d) .1

    (e) 12.34

    7. S se scrie automatul finit determinist care accept urmtorul limbaj: {a, b,ab, abab, }

    8. Fie gramatica regulat G= unde

    },,,,,{ bBaBbBBaBBaBSSP = .

    Descriei limbajul aferent acestei gramatici n BNF. Trasai automatul finitcare accept aceast limbajul asociat gramaticii. Aplicai procedura deconversie a automatului nedeterminist n automat finit determinist i listaiautomatul determinist echivalent.


Recommended