|  | # Trecut, prezent si viitor in limbajele de programare extensibile

"Comunicarea este esenta stiintei."

FRANCIS CRICK

Prezentul capitol cuprinde un scurt istoric al extensibilitatii, urmat de o incursiune in universul limbajelor vizuale ( sa nu uitam ca LEDA este un limbaj vizual ) si al noilor paradigme ale programarii.

### Un scurt istoric al extensibilitatii

Conceptul de extensibilitate a aparut inca pe la sfirsitul anilor '60, ca o cautare de imbunatatire a vechilor limbaje de programare existente la acea ora ( FORTRAN, ALGOL60 ).

Cercetarile din acei ani au dus la urmatoarele:

1. primii utilizatori ai unui translator conventional ( de regula incepatorii ) nu exploateaza nici macar 30% din facilitatile puse la dispozitie de acestea; unele instructiuni sau tipuri de date nu sint folosite niciodata ( de exemplu, multi programatori in COBOL n-au utilizat niciodata componente ale mediului de dezvoltare a aplicatiilor ca Report Writer sau Telecommunications Facilities )
2. limbajele de programare pot deseori suferi considerabile revizii si tehnicile de programare astfel: in BASIC standardele au fost alterate pentru a se permite structurarea si modularizarea
3. natura aplicatiilor se schimba in mod dinamic si astfel se cer noi capabilitati ale respectivului limbaj de programare ca alte tipuri de date sau structuri de control. Acest aspect duce la rescrierea unui translator conventional.

   Asa cum observa Alan J. Perlis in anul 1969, a vorbi despre limbajele extensibile inseamna a lamuri ce inseamna, ce reprezinta un limbaj de programare. Stim cu totii ca un limbaj se poate defini prin trei aspecte - control, date, operatii - si, desigur, sintaxa prin care le reprezentam pe acestea. Cu anii, limbajele de programare au evoluat, adaugindu-li-se noi constructii pentru facilitarea dialogului dintre om si masina:

   - functii, care suplinesc programatorul de a repeta anumite parti de programe,
   - recursii si iteratii, care permit multiplicitatea actiunilor fara marirea lungimii textului sursa,
   - structuri de date deschise utilizate mai ales in inteligenta artificiala si baze de date,
   - abilitatea de a schimba comportamentul programelor in timpul executiei, in functie de anumite evenimente, denotind versatilitate.

   De aceea, ca o alternativa la numeroasele limbaje specializate sau a unui singur limbaj universal, notiunea de limbaj extensibil a capatat o tot mai mare importanta si raspindire. Astfel s-au dezvoltat diverse tehnici de extindere din care mentionam:

   - extinderea macro-textuala ( Bayer: PLITRAN )
   - macro-procesarea sintactica generalizata ( Cheatham si Leavenworth: CLEF, MP/I )
   - tehnici compiler-compiler orientate spre sintaxa ( Brooker-Moiris )

   ### Clasificarea limbajelor de programare

   In lume exista mii de limbaje de programare concepute, din care implementate sint sute, pornind de la limbaje generale ( Pascal, C ) la cele specializate ( Prospero, Nebula - utilizate la descrierea sistemelor de fisiere, EXSYS - in sistemele expert, la editarea bazelor de cunostinte si formarea regulilor, J sau Mathematica - pentru prelucrari matematice, HPGL - pentru manipularea imprimantelor ), de la limbaje imperative ( ALGOL, Oberon ) la cele declarative ( Prolog ), de la limbaje functionale ( LISP, Haskell, ML ) la limbaje de prelucrare a bazelor de date ( COBOL, dBASE, PAL ), de la limbaje iconografice ( Authorware STAR ) la cele orientate obiect ( SmallTalk, C++, Eiffel, Sather ), de la cele de specificare ( Z ) la limbajele editoarelor de texte si hiper-texte ( HTML, TeX, PostScript ), de la limbajele interactive, in ultima vreme vizuale ( LOGO, Visual BASIC ) la limbajele shell ( csh, bash ), de la limbajele de nivel scazut ( Assembler ) pina la limbajele destinate mediilor concurente/distribuite ( Modula-2, SQL, Clean, Orca ), de la limbaje foarte vechi, clasice ( FORTRAN ) la cele foarte recente ( Java, MISA, Oz, Python ).

   Fiecare dintre ele are avantaje si dezavantaje, insa remarcam tendintele de apropiere de limbajul natural formalizat, de simplificare a constructiilor foarte des folosite, de a structura in mod logic diverse sectiuni ale programelor scrise in limbajul respectiv, de modularizare si de a pune la dispozitia programatorului biblioteci vaste ( sa amintim aici doar Borland VCL - Visual Component Library, ierarhia de clase de la IBM VisualAge sau MFC - Microsoft Foundation Classes ).

   Cu trecerea anilor, atentia programatorului s-a deplasat, gradat, de la scrierea liniilor de cod la abordarea riguroasa a fazelor de design si analiza a cerintelor programelor. Tehnologia de realizare a sistemelor informatice a devenit mult mai performanta ca in trecut si aplicatiile rezultate sint cu mult mai complexe si fiabile decit cele concepute in primele perioade ale informaticii.

   Totusi abia in ultimii ani s-au putut dezvolta limbaje puternice, concise, cu adevarat extensibile si acestea sint cele orientate obiect ( C++, ADA, Object Pascal, Oz, Java ).

   Ca exemple ( foarte ) recente de limbaje si aplicatii orientate-obiect si, totodata, extensibile putem enumera:

   1. BOAR ( sistem distribuit orientat-obiect, dezvoltat in Franta ),
   2. DEPOT4 ( translator-generator extensibil, scris in Oberon ),
   3. EOS ( sistem extensibil orientat obiect pentru analiza macromoleculara, sub X-Window, dezvoltat la Universitatea din Tokyo ),
   4. GENESIS si EXODUS( sisteme de gestiune a bazelor de date ),
   5. EMANATE Run-time Extensible Agent System ("EMANATE": Enhanced MANagement Agent Through Extensions) dezvoltat de SNMP Research, Inc., SUA,
   6. V ( limbaj de interogare extensibil pentru interfete multimodale, creat de Robert P. Nilsson, Kent S. Saxin Hammarstrum ),
   7. Aurora ( compilator PROLOG avind o extensie pentru paralelism, care transleaza clauzele PROLOG in instructiuni secventiale ale unui limbaj abstract WAM ),
   8. fluidGA ( mediu extensibil pentru optimizarea functiilor utilizind tehnici de programare evolutiva, scris in C++ ),
   9. AKL ( Agents Kernel Language - permite programarea logica nedeterminista, in mod paralel ),
   10. PHOENIX ( mediu inteligent de simulare in timp real a arderilor padurilor din Parcul National Yellowstone, conceput in Common LISP ),
   11. TIGER ( compilator al unui limbaj extensibil pentru scrierea de sisteme de operare pentru masini paralele, dezvoltat in Japonia )
   12. Proteus ( un sistem adaptabil pentru procesare de documente multi-media, proiectat la Universitatea din Berkeley ),
   13. POSTGRES ( sistem extensibil de admnistrare a bazelor de date relationale, dezvoltat la aceeasi universitate ),
   14. OS/2, Windows95/NT ( sisteme de operare bazate pe interfete vizuale )
   15. CDIF ( produs menit sa faciliteze interoperabilitatea intre diferite unelte CASE )
   16. LabVIEW ( pachet de instrumentare virtuala conceput de National Instruments )

   ### Interfata dintre om si masina prin prisma extensibilitatii

   In prezent, desi nu mai comunicam cu calculatorul folosindu-ne de cifre binare si nici de limbaje greoaie apropiate de masina, continuam sa generam programe pornind de la citeva primitive structurale de tip bucle si conditii plus directive de calcul si transfer de informatii. Programarea logica, functionala sau cea orientata obiect nu extind blocurile de baza cu care actionam asupra ordinatorului, ci le fac doar mai accesibile pentru modul nostru de gindire.

   De fiecare data cind se creeaza un nou limbaj de programare, speram ca acesta sa permita o exprimare mai usoara, mai flexibila, mai bogata, cautam sa remarcam facilitatile sale in comunicarea om-computer.

   Un pas decisiv a fost facut de programarea vizuala, care prin paradigmele sale a revolutionat ingineria programarii. Pe la sfirsitul anilor '70, Muriel Cooper fondeaza la MIT un grup de cercetare denumit Visible Language Workshop ( VLW ) cu scopul de a se studia relatia dintre inteligenta artificiala si grafica computationala sau mai general de interactiunea om-computer. Unele din ideile lansate de acest grup sint: invatarea din exemple vizuale ( learning from visual examples ), reprezentarea instructiunilor dintr-un limbaj ca entitati tridimensionale ( 3D programming languages ), cercetari in directia limbajelor functionale vizuale ( sistemul Thinker - o varianta de LISP vizual ).

   Mai recent, in 1990, animatia jocurilor video ca Mario Brothers ( NINTENDO ) devine cod sursa al limbajului de programare: ToonTalk e un nou limbaj al carui cod sursa este animat. Aceasta nu inseamna ca avem la dispozitie un limbaj vizual ale carui icon-uri statice au fost inlocuite de unele animate, ci inseamna ca mijlocul de comunicare dintre utilizatorul uman si calculator este insasi animatia. Citeva exemplificari: un intreg proces de calcul in ToonTalk este un oras. Majoritatea activitatilor au loc in case. Comunicatia dintre case este facilitata de pasari. Acestea din urma pot cara obiecte, zbura la cuiburile lor, lasa obiecte si zbura inapoi. Casele sint locuite de roboti care sint antrenati ( invatati ) de utilizator pentru a indeplini sarcini limitate, elementare. Prezentam in continuare o paralela intre calculul computational si ToonTalk:

   programare clasica | ToonTalk
   calcul | oras
   agent (actor/proces/obiect) | casa
   metode (clauze/fragmente de program conventional) | roboti
   tuple (masivi de date/mesaje) | cutii
   constante | imagini/text
   capabilitati de transmitere a datelor | pasari
   capabilitati de receptionare a datelor | cuib

   In 1994, apare termenul de telesenzatie ( telesensation ), concept care combina grafica computationala, realitatea virtuala, programarea vizuala si telecomunicatiile. Astfel, cu ajutorul telesenzatiei imaginile transmise de la distanta sint percepute global. Aceasta deschide interesante perspective, nu doar in medicina, arhitectura, teleconferinte etc., cit si pentru programatori care vor invata sa perceapa programele ca virtuale entitati tridimensionale, mai usor de intuit si de manipulat.

   ### O noua paradigma a programarii

   Putem imparti tehnicile de programare, cronologic, in trei stadii:

   1. programarea procedurala ( pina in anii 1980 )
      se baza pe mainframe-uri, retele centralizate, limbaje procedurale ca FORTRAN, ALGOL, PASCAL
   2. programarea orientata-obiect ( din anii '80 pina in prezent )
      se baza si se bazeaza pe calculatoare personale ( in general ), retele eterogene descentralizate, limbaje orientate-obiect ca SmallTalk, ADA, C++, baze de date relationale si distribuite
   3. programarea inteligenta ( viitorul secol )
      care va oferi utilizatorilor infrastructura pentru automatizarea luarii de decizii si achizitionarea de cunostinte vaste din orice domeniu de activitate prin aplicarea unor sofisticate metode de filtrare a datelor deja existente in reteaua mondiala de calculatoare

      Putem considera ca primul stadiu este cel orientat spre computer, pe cind urmatoarele doua sint orientate spre utilizator: cererile utilizatorului domina oferta sistemelor de calcul si a aplicatiilor. Cerintele impuse de utilizatori implica tot mai largi aspecte ca:

      Infrastructura conventionala vs noua infrastructura

      1. reprezentare naturala
      2. interactivitate si cooperare cu utilizatorul
      3. modularizare si integrare hardware
      4. portabilitate, interoperativitate

         Aceste cerinte extinse necesita o varietate de tehnici dispuse pe nivele. In prezent, exista un gol intre infrastructura conventionala ridicata in primul stadiu al programarii si noua infrastructura adusa de al doilea si al treilea stadiu.

         Avem asadar nevoie de o noua infrastructura, denumita Agent-Oriented Programming ( programarea orientata-agent ) care are abilitatea de a descrie calculul computational drept organizare sociala corespondind organizarii sociale umane.

         ### O privire sumara asupra AOP

         In termeni simpli, din perspectiva ingineriei programarii, AOP este echivalenta cu Knowledge Programming ( KP ) plus Object-Oriented Programming ( OOP ).

         O aplicatie dezvoltata in metodologia AOP este o colectie de agenti ( entitati semi-autonome similare celor din metodologia orientata obiect ), rulind in paralel si interactionind intr-un mod organizat.

         Din perspectiva programarii, AOP poate fi vazuta ca o specializare a OOP: agentii constind din anumite cunostinte despre lumea exterioara, despre alt agent sau despre el insusi si tehnici de a manipula aceste cunostinte. Interactiunea dintre agenti inseamna a comunica, adica a schimba mesaje ( informatii ) intre ei. Agentii pot comunica in mod paralel si independent cu altii ceea ce duce la aparitia notiunii de concurenta dintre agenti.

         Modelul agent

         Fiecare agent are atasata o multime de stari in functie de cunostintele pe care le detine, aceasta multime fiind interdependenta de metodele asociate agentului respectiv. Asemenea abordare duce la un model de organizare sociala asignat AOP ( similar, poate, programarii evolutive si a algoritmilor genetici ).

         Timpul va decide daca aceasta paradigma va avea succes sau nu. Din punctul de vedere al adaptabilitatii, AOP ofera suport pentru dezvoltarea tehnicilor de extindere a limbajelor de programare.

         ### Concluzii

         De aceea, prognozam ca in urmatorii ani vom asista la o unificare a principalelor limbaje de programare intr-unul unic, apropiat de cel natural, avind o baza puternica si permitind definirea facila a extinderilor in orice domenii de activitate. Deja se experimenteaza o fuziune a unora dintre trasaturile limbajelor de programare existente ( imperative, functionale, logice, orientate-obiect etc. ), astfel aparind Maude, FOOPS, Oz, Clean, Escher si altele.