Curs 1,
lecţiile 1 şi 2
Anul II, Sem. I
Inf.de gest. LIMBAJE
1. Generalităţi privind limbajele de programare Utilizarea calculatoarelor electronice presupune elaborarea de programe pe baza cărora se obţin anumite soluţii, prin aplicarea unui algoritm asupra datelor de prelucrat. Programul reprezintă o mulţime ordonată de instrucţiuni, asociată unui algoritm de rezolvare a problemei, prin care se comandă operaţiile de prelucrare a datelor pentru obţinerea rezultatelor. Instrucţiunea defineşte o acţiune, conform regulilor de sintaxă ale unui limbaj de programare, prin care se comandă sistemului electronic de calcul să se execute o anumită operaţie. Exemplu: VALOARE = CANTITATE *PREŢ Noţiunea de limbaj este definită ca un sistem pentru comunicare. Limbajele scrise folosesc simboluri (care sunt caractere) pentru a construi cuvinte. Întreg setul de cuvinte formează vocabularul limbajului. Modul în care cuvintele pot fi combinate pentru a fi înţelese este definit de sintaxa şi gramatica limbajului. Sensul dat de cuvinte sau combinaţii de cuvinte este definit de semantica limbajului. În domeniul computerelor, limbajele umane sunt denumite limbaje naturale. Din nefericire computerele nu sunt de ajuns de sofisticate pentru a înţelege limbajele naturale. Prin urmare comunicarea cu computerele se face prin intermediul unor limbaje specifice computerelor denumite limbaje de programre. Noţiunea de limbaj de programare: este definită ca fiind ansamblul format de un vocabular şi un set de reguli gramaticale, necesar instruirii unui computer pentru a realiza anumite activităţi. Limbajul de programare este mijlocul prin care programatorul (utilizatorul) comunică cu calculatorul. Altfel spus, un limbaj de programare este un sistem de convenţii adoptate pentru realizarea unei comunicări – între programator şi calculator. Limbajele folosite pentru programarea unui calculator sunt extrem de asemănătoare limbajelor naturale. Aşa cum pentru însuşirea unei limbi străine trebuie învăţate cuvintele acesteia şi regulile cu care pot fi manevrate tot aşa pentru însuşirea unui limbaj de programare trebuie studiate cuvintele şi semnele care îl compun împreună împreună cu regulile de manevrare a lor. Specificarea unui limbaj de programare presupune definirea următoarelor elemente : - Alfabetul : cuprinde mulţimea caracterelor alfabetice, numerice şi speciale utilizate de limbajul de programare. - Vocabularul : este dat de totalitatea cuvintelor folosite de limbajul de programare şi anume : o cuvinte rezervate, care au o semnificaţie prestabilită pentru un limbaj de programare. Ele pt fi instrucţiuni, funcţii, proceduri etc.cuvintele rezervate sunt cuvinte cheie, fiind obligatorii în cadrul programelor. Anumite limbaje mai utilizează şi cuvinte rezervate opţionale (acestea nefiind obligatorii în programme). Exemple : IF, WHILE, CASE. o Cuvinte utilizator, adică identificatori prin care se atribuie nume pentru constante, variabile, fişiere, proceduri etc. cuvintele utilizator trebuie să respecte anumite reguli generale de construire cum ar fi : Să înceapă cu o literă ; Să nu conţină spaţii (pot să conţină liniuţa de unire). Exemple: NUMARFACTURA, NRFACT, NR_FACTURA - Gramatica cuprinde : o Sintaxa : defineşte ansamblul regulilor de formare a instrucţiunilor şi frazelor. Un program cu erori de sintaxă nu este acceptat de către calculatorul electronic. In alcătuirea instrucţiunilor sintaxa foloseşte regulile de punctuaţie acceptate de limbaj. De exemplu, în limbajul de programare VISUAL BASIC, instrucţiunea : PRINT « Valoarea este », VALOARE, 1
Curs 1,
lecţiile 1 şi 2
Anul II, Sem. I
Inf.de gest. LIMBAJE
Afişează pe ecran textul « Valoarea este » după care urmează c onţinutul variabilei VALOARE. In instrucţiunea PRINT distingem : PRINT- cuvînt rezervat (cheie) care exprimă o comandă de afişare pe ecran; « Valoarea este » - cuvinte utilizator, care prin încadrarea lor cu ghilimele dau textului semnificaţia de constantă şi se exprimă ca atare pe ecran. , (virgulă)- caracter special care se utilizează c onform regulilor de sintaxă şi punctuaţie impuse de limbaj ; VALOARE- cuvânt utilizator care defineşte o variabilă numerică în care este memorată o valoare şi care urmează să se afişeze pe ecran. o Morfologia cuprinde ansamblul regulilor de modificare a formei cuvintelor în contextual îmbunătăţirii lor. - Punctuaţia este dată de un ansamblu de reguli privind utilizarea semnelor convenţionale în scopul folosirii elementelor de limbaj. - Semantica defineşte sensul atribuit cuvintelor şi instrucţiunilor . Programul sursă este programul scris într-un limbaj evoluat de programare. Fiins scris într-un limbaj apropiat de cel uman, programul sursă nu este înţeles de către sistemul electronic de calcul ; pentru aceasta, este necesară traducerea lui într-un c od intern, accesibil calculatorului. Această operaţie se realizează cu un program translator. Compilatorul este componenta software care realizează traducerea programului sursă în program cod obiect. Din punct de vedere al traducerii programului sursă în codul intern al calculatorului, deosebim : - limbaje de programare interactive (BASIC), ceea ce înseamnă că imediat după tasstarea unei comenzi, calculatorul analizează acea comandă şi anunţă dacă este greşită. Faptul că se poate şti imediat dacă o comandă este greşită înseamnă foarte mult în activitatea de prograamare (există posibilitatea să se corecteze eroarea respectivă imediat). In acest caz componenta software care realizează traducerea programului sursă se numeşte interpretor. - Limbaje de programare care cer scrierea programului în totalitatea lui, fără a anunţa pe parcurs greşelile, ci numai la sfârşit, fie prin prezentarea unei recapitulaţii a erorilor, fie prin parcurgerea pas cu pas a erorilor până la eliminarea lor completă. (din această categorie fac parte : PASCAL, COBOL, FORTRAN). Programul obiect este rezultatul traducerii programului sursă în codul intern al calculatorului. Sistem de programare este ansamblul format din limbajul de programare şi programul translator asociat. Nivele ale limbajelor de programare “ Nivelul“ unui limbaj este apreciat prin poziţia pe care o ocupă pe scara constituită de limbajul recunoscut de microprocesor ( limbaj maşină ) şi limbajul natural al programatorului ( limba română , limba engleză …). Un limbaj de nivel scăzut este foarte apropiat de maşină, el manipulează cu elemente de nivel hardware, fizic, cum ar fi: registru , microprocesor , locaţie de memorie, port de intrare/ieşire etc . Un limbaj de nivel înalt sau foarte înalt manipulează cu concepte apropiate de limbajul natural, concepte de nivel logic , cum ar fi: colecţie de date , nume de operaţie ( sort , writeln , open ), variabile, constante ( asemănătoare ca înţeles cu cele din matematică). Cu ajutorul unui limbaj de nivel înalt programatorul se face mult mai uşor înţeles de către calculator. Uneori o singură linie de program scrisă cu un astfel de limbaj poate echivala cu sute de linii de program scrise în limbaj maşină . Deci din punct de vedere al reducerii timpului de realizare a unui program şi al siguranţei în funcţionare (absenţa erorilor de programare ) este de preferat un limbaj de nivel cât mai ridicat (înalt sau foarte înalt ). În schimb , pe măsură ce 2
Curs 1,
lecţiile 1 şi 2
Anul II, Sem. I
Inf.de gest. LIMBAJE
limbajul are un nivel mai ridicat execuţia programului conceput cu ajutorul său va fi mai lentă , decât a unui program ce realizează aceleaşi operaţii dar este scris în limbaj de asamblare. O altă diferenţă esenţială între cele două tipuri de limbaje o reprezintă portabilitatea, adică posibilitatea transferării programelor pe un alt tip de maşină decât cea pe care au fost construite. Din acest punct de vedere limbajul de asamblare este neportabil deoarece el este specific microprocesorului . Programele realizate pe un tip de maşină trebuiesc rescrise integral pentru noul tip de maşină , folosind un nou set de instrucţiuni – care deobicei diferă foarte. Lucrurile stau altfel cu programele concepute cu ajutorul unui limbaj de nivel înalt, deoarece acestea sunt detaşate de maşină . Între un astfel de program şi calculator se interpune compilatorul (sau interpretorul) care rezolvă corect transformarea fişierului-sursă în fişier executabil . Limbaje procedurale – neprocedurale Cele două tipuri de limbaje, procedurale şi neprocedurale, se diferenţiază prin nivelul de organizare (structurare ) a unui program . Limbajele neprocedurale sunt concepute pentru a gândi un program la nivel de instrucţiune, pe când cele procedurale, obligă programatorul să conceapă programe la nivel de bloc. Într-un limbaj procedural (numit şi limbaj structurat) programele sunt scrise instrucţiune cu instrucţiune, dar ele sunt organizate logic în blocuri (grupuri de instrucţiuni ) ce realizează o acţiune bine determinată. În general un bloc are un punct de intrare şi un punct de ieşire – nu mai multe . Un limbaj procedural oferă posibilitatea utilizării unui nivel ridicat de concepere a unui program şi duce la realizarea de programe coerente şi protejate la erori . Prin contrast , limbajele neprocedurale nu favorizează programatorul în a se desprinde de nivelul „instrucţiune „ şi duc deseori la programe greu de controlat – mai ales în cazul programelor de dimensiuni mari . Limbajele neprocedurale sunt încă preferate de unii utilizatori datorită timpului foarte scurt cât decurge învăţarea şi utlizarea lor . Limbaje orientate Din punctul de vedere al aplicabilităţii unui limbaj, limbajele pot fi orientate pe o anumită problemă sau concepute pentru soluţionarea oricărui tip de problemă – limbaje de uz general sau altfel spus, neorientate pe o problemă . Limbajele orientate prezintă un grad înalt de specificitate pe când un limbaj neorientat reprezintă un cadru general ce permite introducerea de către utilizator a conceptelor şi prelucrărilor dorite . Deci, diferenţa esenţială dintre cele două tipuri de limbaje o constitue nivelul conceptual definit. Cele specializate posedă deja integral suportul necesar şi permit programatorului să se concentreze la ansamblul problemei , pe când cele nespecializate lasă în sarcina programatorului manevrarea nivelelor inferioare ale problemei . Limbaje concurente Un limbaj concurent permite definirea de procese (prelucrări) paralel, execuţia sa fiind ramificată la un anumit moment de timp . Prin contrast limbajele neconcurente (majoritatea limbajelor) au o desfăşurare liniară, fiind activ un singur proces la un moment dat . Procesele concurente presupun în mod obligatoriu un sistem multi-tasking ce poate gestiona mai multe „sarcini„ la un moment dat . Limbaje de nivel scăzut Această categorie de limbaje are un reprezentant autoritar şi anume: limbajul de asamblare . Diferenţierile care se pot face pentru limbajele de nivel scăzut sunt următoarele : a) după tipul de maşină ; Regulile respectate de versiunile limbajului de asamblare sunt : - o nouă versiune o include complet pe cea anterioară; - versiunea nouă oferă funcţii suplimentare şi le realizează pe cele vechi mai rapid. b) după mediul de programare oferit. Aspectul unui limbaj poate fi schimbat radical de mediul de programare oferit. Pentru limbajul de asamblare există mai multe implementări disponibile, începând cu pachete ce 3
Curs 1,
lecţiile 1 şi 2
Anul II, Sem. I
Inf.de gest. LIMBAJE
operează în mod linie şi culminând cu medii integrate în care toate operaţiile se pot declanşa de la un acelaşi pupitru de comandă . Nu sunt luate în considerare decât aceste medii integrate (denumite generic medii Turbo), dintre care se detaşează Turbo Asamblorul firmei Borland TASM. Limbaje de nivel înalt neorientate BASIC Denumirea sa provine de la iniţialele cuvintelor Beginner’s Allpurpose Symbolic Instruction Code ( Cod de instrucţiuni simbolice , de uz general , destinat începătorilor ) . Are următoarele caracteristici fundamentale : - simplu de învăţat ; instrucţiunile sale sunt cuvinte din limba engleză sau prescurtări ale acestora ; - neorientat pe un anumit tip de problemă ; permite construirea de aplicaţii ; - este un limbaj nestructurat , ceea ce îi permite să fie uşor învăţat . Din cauză că a cunoscut o largă răspândire , au fost implementate noi versiuni de Basic : GW-BASIC , QUICK BASIC , TURBO BASIC , VISUAL BASIC ( Basic for Windows ) . FORTRAN Limbajul Fortran reprezenta iniţial un limbaj orientat pe calcule ştiinţifice având definite concepte precum: matrice, funcţii trigonometrice, numere reale în dublă precizie . Versiunile ulterioare care au cunoscut o mare popularitate au extins posibilităţile limbajului trasformându-l într-un limbaj eficient , de uz general .În prezent există pentru IBM-PC două implementări mai importante ale limbajului : Microsoft Fortran , Fortran for Windows . Deşi nu poate fi considerat „depăşit„ din punct de vedere conceptual ( este un limbaj algoritmic–structurat ) este neindicată folosirea lui datorită absenţei unor medii de programare performante şi pentru că tendinţa actuală îi este defavorabilă . PASCAL Limbajul PASCAL a introdus în versiunea sa iniţială noţiunea de programare structurată şi ulterior noţiunile de date (structuri) dinamice, date (structuri) definite de utilizator . În prezent standardul implementărilor PASCAL cuprinde următoarele elemente : - programare structurată de tip algoritmic ; - definirea de noi funcţii sau proceduri ; - tipuri de date definibile de către utilizator ; - structuri de date dinamice ; - adresări indirecte ale datelor ; - recursivitate ; - rutine complete de intrare / ieşire ; - funcţii de conversie a datelor din ASCII în format intern şi invers ; - set complet de funcţii matematice ; - funcţii elementare de grafică 2D ; - posibilitatea inserării direct în sursă a instrucţiunilor în limbaj de asamblare ; - posibilitatea definirii de overlay-uri pentru program . Versiunile standard ale implementărilor PASCAL sunt cele oferite de Microsoft şi Borland , cu avantaj pentru cele din urmă ( TURBO PASCAL 5.0 , TURBO PASCAL 5.5 ) datorită mediului de lucru performant (de tip “ TURBO “ ) . Combinaţia PASCAL + TURBO a reprezentat un succes imens în rândul programatorilor având ca singur rival cealaltă combinaţie : C+TURBO. Limbajul C Principalele caracteristici ale limbajului sunt : - limbaj structurat de nivel înalt ; - posedă concepte de nivel scăzut, ceea ce permite exploatarea portabilă a caracteristicilor intime unei maşini ; - rutine de conversie a datelor foarte evoluate ; - tipuri de date definibile de către utilizator ; 4
Curs 1,
lecţiile 1 şi 2
Anul II, Sem. I
Inf.de gest. LIMBAJE
- gestionarea elaborată a datelor de tip dinamic ; - definirea de noi funcţii ; - adresări indirecte ale datelor , variabilelor ( pointer-i ) ; - recursivitate ; - set complet de funcţii matematice ; - funcţii pentru realizarea de grafică elementară 2D; - funcţii de apel servicii DOS ; - posibilitatea definirii de overlay-uri pentru un program ; - concizie deosebită a limbajului . Pentru versiunile standard ale implementărilor limbajului C există medii de programare de tip “ TURBO “ce aparţin firmelor: Microsoft – produsul QUICK C şi firmei Borland – produsele TURBO C . Limbajul ADA A fost creat special pentru a gestiona totalitatea aplicaţiilor dezvoltate şi utilizate de N.A.S.A. Noutatea limbajului (de tip structurat , algoritmic ) o constitue concurenţa , deci posibilitatea lansării de procese paralele (sincronizate interactiv în finalul execuţiei lor ). Saltul calitativ este evident şi deschide un nou domeniu în programare … dar nu pentru IBM-PC . Versiunile implementărilor limbajului ADA pe IBM-PC nu posedă tocmai acestă parte de concurenţă, reducând limbajul la un simplu limbaj structurat de uz genera . Deci , ADA este un limbaj ultramodern din punct de vedere teoretic dar ineficient din punct de vedere practic pentru IBMPC-uri . Limbaje orientate pe gestiunea bazelor de date Necesităţile actuale în practica utilizării calculatoarelor se îndreaptă cu precădere spre gestionarea bazelor de date de mari dimensiuni. O explicaţie a acestei orientări e dată de faptul că o bază de date reprezintă un ansamblu de informaţii, iar cel ce deţine informaţii complete şi rapide într-o anumită problemă este indiscutabil cu un pas înaintea celorlalţi. Concurenţa din domeniul economic poate fi numită pe bună dreptate o bătălie informaţională . Un sistem de gestionare a bazelor de date ( S.G.B.D.) de tip clasic operează cu următorii termeni fundamentali : - câmp – o locaţie în care se poate memora o informaţie bine determinată ; - înregistrare – mai multe câmpuri alcătuiesc împreună o înregistrare ; - baza de date – colecţie de înregistrări . Deci , datele sunt gestionate prin intermediul unei structuri, organizată ierarhic, la un nivel de organizare logică . Tendinţa modernă în exploatarea bazelor de date constă în deplasarea interesului către bazele de date relaţionale. Diferenţa esenţială constă în definirea unui nivel logic suplimentar între datele gestionate . Acestea nu mai sunt privite ca simple fişiere izolate între ele ci pot fi analizate pe baza legăturilor (relaţiilor) ce există între ele . Noţiunile cu care operează un S.G.B.D. relaţional sunt următoarele : - tabel – structură fundamentală de “ depozitare “ a datelor ; - linie în tabel – echivalentul unei înregistrări clasice ; - coloană în tabel – echivalentul unui câmp de tip clasic ; - bază de date – o colecţie de tabele, conectate prin valorile anumitor coloane . Această nouă concepţie permite definirea de structuri 1: n . O “înregistrare“ poate conţine n valori pentru un “câmp“ anumit nu una singură ca în cazul clasic . Structurile de tip 1:n pot fi rezolvate şi cu ajutorul unui S.G.B.D. clasic dar întreaga gestiune a operaţiilor revine programatorului pe când un mediu relaţional furnizează din start servicii speciale . Spre deosebire de S.G.B.D.–urile clasice, un mediu relaţional presupune ca cerinţă minimală posibilitatea manipulării datelor prin intermediul conexiunilor logice stabilite. Pentru aceasta există definit ( şi impus ca standard unanim recunoscut ) limbajul de interogare SQL 5
Curs 1,
lecţiile 1 şi 2
Anul II, Sem. I
Inf.de gest. LIMBAJE
( Structured Query Language – limbaj de cereri structurate ). Prin intermediul său sunt permise următoarele operaţii : - regăsire date ( conexate logic ) ce îndeplinesc o anumită condiţie ; - definire ordine de returnare a datelor ; - redefinire conectări logice ale datelor ; - exploatare ; - programare . Avantajele unui S.G.B.D. clasic sunt : - simplitate în manevrare, deci efort de studiu redus ; - pot funcţiona pe un sistem de calcul ce nu implică resurse speciale, ci doar spaţiu de stocare extern suficient pentru problema dată ; - preţ de cost redus faţă de cele relaţionale . Avantajele unui S.G.B.D. relaţional sunt : - nivel logic superior ( corelaţii , structuri 1 : n ), - prelucrări (regăsiri) de date cu un înalt nivel de complexitate ; nivel superior de portabilitate a aplicaţiilor a datelor.
2. Evoluţia limbajelor de programare De-a lungul timpului, oamenii au inventat maşini pentru a calcula cât mai eficient. Inaintea calculatoarelor performante din zilele noastre, au existat alte maşini de calcul. Momentul iniţial al istoriei calculatoarelor este, de obicei legat de numele matematicianului englez Charles Babbage. El a propus în anul 1830 o Maşină Analitică care a anticipat în mod fascinant structura calculatoarelor actuale. Ideile sale au devansat cu peste 100 de ani posibilităţiile tehnologice ale vremii sale. Următorul moment de referinţă este anul 1937, când Howard Aiken, de la Universitatea Harvard a propus Calculatorul cu secvenţă de Comandă Automată, bazat pe o combinaţie între ideile lui Babbage şi calculatoarele electromecanice, produse de firma IBM. Construcţia acestuia a început în anul 1939 şi s-a terminat în anul 1944. El a fost în principal primul calculator electromecanic, fiind alcătuit din comutatoare şi relee. Pentru a răspunde noilor cerinţe moderne ale utilizatorilor, limbajele de programare de mare circulaţie s-au dezvoltat, apărând noi versiuni care să răspundă prelucrării interactive, multiprogramării şi utilizării în medii de programme. Primele calculatoare apărute după 1944 erau programaate în codul calculatorului. După 1950 apare noţinea de programare automată. Se elaborează primul limbaj de prograamare numit asamblor care era dedicat unui anumit calculator electronic. Acest moment marchează aparaiţia programelor de translatare asociate şi a sistemelor de operare. În jurul anului 1960 apar primele versiuni ale limbajelor evoluate (FORTRAN, ALGOL, COBOL, LIPS). Aceste limbaje oferă pentru prima dată omului posibilitatea de a se exprima cu ajutorul unui sistem de simboluri mai apropiat de modul de comunicare uman. In anii *60 au existat preocupări pentru a se realiza un limbaj de programare universal, elaborându-se limbajul PL/1 (Programming Language number 1), cu elemente din limbajele FORTRAN, COBOL şi ALGOL. Acest limbaj s-a dovedit a fi destul de dificil, problema limbajelor universale nefiind clarificată (controversată) nici în zilele noastre. După modul cum au evoluat în timp limbajele de programare pot fi: • limbaje de prima generaţie: limbajul maşină (machine language); • limbaje de generaţia a doua: limbajul de asamblare (assembly language); • limbaje de generaţia a treia: limbajele de înalt nivel (high-level programming languages); • limbaje de generaţia a patra: limbaje mai apropiate de limbajul uman decât limbajele de înalt nivel (ex. de comandă: FIND ALL RECORDS WHERE NAME IS "SMITH" )
6
Curs 1,
lecţiile 1 şi 2
Anul II, Sem. I
Inf.de gest. LIMBAJE
Limbajul maşină Când un computer urmează instrucţiunile unui program se spune că programul este în execuţie (running). Înainte de a fi executat programul trebuie să fie rezident în memorie. Adică programul trebuie să ocupe un set de bytes consecutivi în memorie. Totodată programul trebuie scris într-un limbaj maşină intern. Fiecare tip de procesor are propriul limbaj maşină. Acesta este conceptul de bază cu privire la modul de execuţie a unui program. Faptul că programul ce se execută este stocat (chiar şi parţial) în memoria principală (RAM) duce la concluzia că numai prin schimbarea programului din memoria RAM computerul poate trece la execuţia altui proces (task)/program. Aşa cum s-a prezentat mai sus toate computerele au un limbaj maşină intern (specific tipului de procesor). Acest limbaj este codat într-o reprezentare binară şi este foarte greoi (plictisitor) de utilizat pentru scrierea unui program. Majoritatea instrucţiunilor programului vor conţine astfel două părţi: • o parte care se referă la operaţia de codare – se vor indica ordinea operaţiilor; • o parte care se referă la adresa din meorie - indică locaţia de memorie ce se va utiliza ca operand al instrucţiunii. Astfel programatorii care utilizează limbajul maşină vor trebui să fie atenţi în ce zone de memorie se vor stoca date şi în ce zone de memorie se vor executa programele (instrucţiunile). Astfel pot apărea erori de programare datorate suprapunerii scrierii instrucţiunilor peste date. Prin urmare programarea în limbaj maşină presupune o bună capacitate de a interpreta datele şi instrucţiunile la nivel de bit. Totodată aceasta reprezintă si posibilitatea de a se genera alte programe şi de a le executa. Concluzii: • limbajul maşină este limbajul pe care computerul îl înţelege în mod direct; • în limbajul maşină programele se scriu în cod binar: succesiuni de 0 şi 1; • fiecare instrucţiune din limbajul maşină este o combinaţie de 4 bits (LOAD-0000;ADD0001); • programatorul trebuie să cunoască detaliat structura hardware a computerului; • programatorul trebuie să gestioneze fără greşeală alocarea adreselor de memorie pentru un program; • pot apărea multe erori datorită: concepţiei programului, sintaxei, suprapunerii adreselor de memorie, etc. Limbajul de asamblare Atenţia necesară evitării ocupării aceloraşi adrese de memorie este foarte solicitantă (greoaie) în programarea limbaj maşină. Astfel dacă programatorul modifică un program şi decide să mai introducă ceva atunci toate celelalte adrese de memorie utilizate până atunci se vor schimba şi trebuie să examineze întregul program din nou şi să decidă iarăşi cu privire la modul cum va aloca memoria datelor şi instrucţiunilor. Astfel au apărut începând cu 1950 limbajele de asamblare care sunt forme mult mai prietenoase decât cele ale limbajului maşină. Astfel comenzile limbajului maşină au fost înlocuite de comenzi mnemonice (gestionează memoria). Astfel limbajul de asamblare are grijă să convertească comenzile mnemonice în comenzile corespunzătoare limbajului maşină. Programatorul poate folosi adrese simbolice pentru reprezentarea datelor. Acest limbaj va atribui adresele în limbaj maşină şi va verifica dacă datele distincte nu se suprapun la stocare. Este evident că, acest limbaj evită o multitudine de erori de alocare a memoriei. Limbajul de asamblare presupune existenţa unui program numit assembler care să traducă programele în limbaj maşină. Asamblorul înlocuieşte codarea mnemonica (cum ar fi ADD) cu coduri binare corespunzătoare limbajului maşină şi alocă adrese de memorie pentru toate variabilele simbolice utilizate (A, B, C ) şi se asigură că aceste adrese sunt distincte. 7
Curs 1,
lecţiile 1 şi 2
Anul II, Sem. I
Inf.de gest. LIMBAJE
Astfel prin uşurarea procesului de programare s-a introdus un nou nivel de procesare pentru computer. Astăzi limbajele de asamblare sunt încă utilizate pentru unele programe critice deoarece aceste limbaje conferă programatorului un control foarte precis a ceea ce se întâmplă în computer. Limbajele de programare încă necesită ca programatorul să aibă foarte bune cunoştinţe cu privire la structura internă a computerului. Limbajele de asamblare sunt şi ele specifice computerului pe care rulează astfel că programatorul trebuie sa-şi rescrie programul pentru un alt tip de computer. Concluzii: • utilizând limbajele de asamblare, programele se scriu în mod text pentru ca apoi să fie traduse într-o formă binară corespunzătoare limbajului maşină; • limbajul de asamblare este tradus în limbaj maşină de către assembler; • limbajele de asamblare încă solicită programatorului cunoaşterea de multe detalii hardware; • limbajele de asamblare sunt specifice anumitor tipuri de computere; • limbajul de asamblare împreună cu limbajul maşină formează categoria limbajelor de nivel scăzut (low-level languages). Limbajele evoluate (High level Languages) Evident că de la apariţia computerului tot s-a pus problema de a se obţine un proces de programare cât mai uşor. Aceasta ar presupune ca activitatea de programare să se poată face cu un bagaj de cunoştinţe cu privire la funcţionarea internă a computerului cât mai mic. După cum s-a văzut anterior, limbajul maşină şi limbajul de asamblare presupune o bună cunoaşterea funcţionării interne a computerului. O altă direcţie pentru uşurarea programării ar fi aceea ca programele să fie prezentate într-o limbă cât mai familiară persoanei care doreşte să programeze (să rezolve o anumită problemă). Astfel a apărut programarea de înalt nivel care permite formularea soluţiilor problemei de rezolvat în termeni mai apropiaţi de cei folosiţi de oameni. Aceste limbaje au fost concepute pentru a permite programării să fie mult mai uşoară şi cu mai puţine erori iar programatorul nu trebuie să cunoască detalii cu privire la structura internă a unui anumit tip de computer. Aceste limbaje sunt mult mai apropiate de limbajul uman. Pentru a putea fi executate, ca şi în cazul limbajului de asamblare, computerul nu înţelege în mod direct aceste limbaje evolute şi de aceea ele trebuiesc procesate printr-un program specializat care traduce limbajele evolute în limbajul maşină intern al computerului respectiv. După modul cum se face această transpunere a programelor evoluate există două tipuri de astfel de programe specializate: • interpretor: traduce succesiv instrucţiunile de înalt nivel într-o formă intermediară care este apoi executată. • compiler: traduce instrucţiunile de înalt nivel direct în limbaj maşină. Avantajul interpretorului este că poate execută un program imediat. Compilatorul necesită mai mult timp. Programele produse de compilator rulează mult mai rapid decât cele produse de interpretor. Majoritatea programelor evolute au la dispoziţie atât compiler cât şi interpretor. De obicei interpretorul se foloseşte în timpul realizării unui program pentru testarea unor mici secţiuni ale programului. Unele limbaje evoluate sunt concepute să lucreze numai cu interpretor (BASIC, LISP). Un alt mare avantaj al limbajelor evoluate este acela că dacă limbajele sunt standardizate atunci fiecare producător de computere (procesoare) va putea să realizeze compilerul care să respecte standardele şi să traducă programele în limbajul maşină specific producătorului. Astfel devine posibil ca un program, respectându-se aceste standarde, să poată fi compilat pe diverse computere şi apoi executat. 8
Curs 1,
lecţiile 1 şi 2
Anul II, Sem. I
Inf.de gest. LIMBAJE
Prin scrierea unui program într-un limbaj evoluat se face o economie imensă de timp. Astfel programatorul pierde mai puţin timp pentru scrierea într-un limbaj mult mai apropiat de cel uman decât dacă acelaşi program ar fi scris în limbaj maşină. Timpul de compilare al programului poate fi de ordinul secundelor. De la apariţia limbajului FORTRAN II, au apărut şi dispărut multe limbaje evoluate. Cele mai utilizate la ora actuală sunt: COBOL FORTRAN PASCAL C, C++ PROLOG JAVA
Afacerilor (baze de date, etc) Inginerie + Matematică + Fizică + etc Uz general Uz general – cel mai popular Inteligenţa artificială Uz general – creşte în popularitate
FORTRAN (FORmula TRANlation) este primul limbaj de nivel înalt (1954-1958 Jim Bachus) şi cel care a introdus şi definit concepte ca variabile, expresii, enunţuri, iterative, subrutine compilate separat şi input/output format. FORTRAN este un limbaj compilat, structurat. Chiar numele arată originile ştiinţifice şi inginereşti; FORTRAN este încă foarte folosit în aceste domenii. COBOL (COmmon Business-Oriented Language) este un limbaj de programare dezvoltat între anii 1959-1961. Este utilizat în special pentru aplicaţii cu caracter economic şi administrativ. A fost iniţial susţinut de Departamentul de Apărare American şi ulterior dezvoltat pentru aplicaţii comerciale. Programele scrise în COBOL, limbaj compilat, conţin patru diviziuni: identifi-carea, mediul, date şi proceduri. PASCAL este un limbaj procedural concis, proiectat de Niklaus Wirth în perioada 1967-1971. Pascal, fiind un limbaj structurat, compilat, construit pe baza limbajului ALGOL, simplifică sintaxa, adăugând tipuri de date şi structuri ca subzone, tipuri enumerate de date, fişiere, înregistrări şi seturi. Acceptarea şi utilizarea limbajului Pascal s-a mărit considerabil o dată cu introducerea în 1984, de către Borland Internaţional, a mediului Turbo Pascal, un compilator ieftin, de mare viteză, utilizat în MS-DOS, care s-a vândut în peste un milion de copii în diverse versiuni. În timp, Pascal pierde din ce în ce mai mult teren în favoarea lui C ca limbaj standard de dezvoltare la microcomputere. C - 1. Acest Limbaj de programare dezvoltat de Dennis Ritchie la Bell Laboratories, New Jersey, în anul 1972, numit aşa pentru că limbajul anterior a fost limbajul B. Desi C este considerat de mulţi a fi mai mult un limbaj de asamblare decât un limbaj de nivel înalt, asocierea strânsă cu sistemul de operare UNIX, popularitatea şi standardizarea sa de către ANSI au făcut ca acesta să fie aproape un limbaj de programare standard. C este un limbaj compilat ce conţine un mic set de funcţii built-in care sunt machine-dependent. Celelalte funcţii sunt independente şi sunt conţinute în nişte fişiere numite library care pot fi accesate dintr-un program C. Programele C sunt compuse dintr-una sau mai multe funcţii definite de programator; astfel că C se consideră a fi un limbaj structurat. Compilatorul nu dispune, în general, de funcţii de intrare/ieşire, din pretenţia, de altfel îndreptătită, de a se asigura portabilitatea lui; aceste funcţii fiind într-o bibliotecă foarte vastă. Există două implementări de compilatoare foarte răspândite pe calculatoarele personale: Turbo C, produs de firma Borland în două versiuni, normală şi profesională şi Microsoft C, produs de firma Microsoft. C++ este o versiune a limbajului C, orientată spre obiect, dezvoltată de Bjarne Stroustrup la începutul anilor 80 la Bell Laboratories. C++ are trăsături specifice limbajelor de programare orientate obiect. Conceptul fundamental în C++ este clasa. El conţine de asemenea îmbunătăţiri care nu sunt direct legate de clase, cum ar fi: constante simbolice, substituţia “in-line” a 9
Curs 1,
lecţiile 1 şi 2
Anul II, Sem. I
Inf.de gest. LIMBAJE
funcţiilor, argumente cu valori implicite pentru funcţii, nume de funcţii supraâncărcate, operatori pentru gestionarea memoriei libere şi un tip de referinţă PROLOG (PROgramming LOGic) este un limbaj de programare creat în 1973 de Alain Colmeraner la Universitatea din Aix-Marseille. Este un limbaj descriptiv destinat inteligenţei artificiale, fiind utilizat în special la realizarea sistemelor expert. Programatorul formează o bază de cunoştinţe, adică un set de reguli şi fapte legate de mediul tratat, după care descrie problema de rezolvat. PROLOG-ul este un limbaj care sparge regulile tradiţionale de programare. ADA este un limbaj universal, definitivat în 1979 la care a participat un număr impresionant de specialişti din întreaga lume. Acest limbaj are o considerabilă putere de exprimare şi acoperă un larg domeniu de aplicaţii. El include facilităţi oferite de limbajele clasice (PASCAL), dar şi facilităţile întâlnite numai în limbajele de specialitate. Este un limbaj adecvat modularizării şi conţine structurile de control obişnuite. Concomitent au fost preocupări pentru a crea limbaje de programare accesibile unei mase cât mai largi de utilizatori. În acest sens se pot menţiona limbajele BASIC (Beginner*s All-Purpose Symbolic Instruction Code) şi PASCAL. Pentru limbajul BASIC se pot menţiona următoarele momente: -
BASIC : încă de la prima versiune a fost construit ca un limbaj interactiv (posibilitatea anunţării eventualelor erori de sintaxă în momentul tastării unei comenzi); BASICA este o o altă versiune care a apărut odată cu apariţia microcalculatoarele IBM PC, urmată de versiunea GW-BASIC;
-
QBASIC, o altă versiune cuprinsă în sistemul de operare MS-DOS 5.0,
-
Limbajul BASIC a devenit un limbaj puternic atunci când MICROSOFT a lansat Microsoft Windows, creând posibilitatea elaborării de programe de meniuri derulante, ferestre, casete de dialog etc.;
-
În 1991 Microsoft a lansat limbajul VISUAL BASIC, care a evoluat până la versiunea 5.0, caracterizat atât prin aspectul programelor cât şi prin funcţionalitatea şi utilitatea lui
Java este un limbaj de programare de nivel înalt, orientat obiect, proiectat iniţial pentru realizarea de aplicaţii pentru Internet şi mai cu seamă pentru Web. Acesta este utilizat în prezent cu succes şi pentru programarea aplicaţiilor destinate intranet-urilor. În acest sens, multe firme recurg la limbajul Java în procesul de informatizare întrucât oferă un foarte bun suport pentru tehnologiile de vârf şi, nu în ultimul rând, pentru faptul că este gratuit şi în mod continuu îmbogăţit şi îmbunătăţit.
10