Diferență între revizuiri ale paginii „Noțiuni despre Java”
Linia 29: | Linia 29: | ||
[[Fișier:compilare.png|Schema bloc a mecanismului de compilare]] | [[Fișier:compilare.png|Schema bloc a mecanismului de compilare]] | ||
− | Compilatorul este un program care are ca rol, traducerea unui limbaj în alt limbaj. În principiu, acesta este un program de traducere, dar nu între două limbi, ci între două limbaje formale. Diferența dintre limbă și limbaj formal este că acesta din urmă are un set de reguli stricte care fac traducerea riguroasă posibilă pentru un algoritm. Spre deosebire de interpretor, compilatorul face traducerea static, adică la ceea ce se numește ''compile-time'', între limbajul de nivel înalt și limbajul de asamblare a unui procesor specific. Odată programul translatat în limbaj de asamblare, acesta este rulat direct pe procesor, fără alte programe ajutătoare. | + | Compilatorul este un program care are ca rol, traducerea unui limbaj în alt limbaj. În principiu, acesta este un program de traducere, dar nu între două limbi, ci între două limbaje formale. Diferența dintre limbă și limbaj formal este că acesta din urmă are un set de reguli stricte care fac traducerea riguroasă posibilă pentru un algoritm. Spre deosebire de interpretor, compilatorul face traducerea static, adică la ceea ce se numește ''compile-time'', între limbajul de nivel înalt și limbajul de asamblare a unui procesor specific. Odată programul translatat în limbaj de asamblare, apoi în cod mașină cu ajutorul unui asamblor și al unui linker, acesta este rulat direct pe procesor, fără alte programe ajutătoare. |
Versiunea de la data 17 iulie 2012 08:06
Java este un limbaj de programare dezvoltat de fosta companie Sun Microsystems (actual Oracle) și lansat în anul 1995. Bazându-se pe acest limbaj și pe ideea de mașină virtuală, în momentul actual au apărut nenumărate tehnologii pentru aplicații web și distribuite [1].
Compilare vs. Interpretare
Înainte de a prezenta mecanismul de mașină virtuală, trebuie să facem o scurtă descriere a metodelor de execuție a programelor pentru diferite limbaje de programare.
Procesorul unui calculator (sau a unei mașini de calcul în general) poate executa un număr fix de instrucțiuni cunoscute procesorului, numit set de instrucțiuni. Un program poate fi scris folosind direct aceste instrucțiuni (mnemonicile lor), adică în limbaj de asamblare, sau într-un limbaj de nivel înalt. Există avantaje și dezavantaje pentru ambele variante.
Un program scris în limbaj de asamblare nu este deloc portabil, deci nu poate fi executat decât pe mașina pentru care a fost scris, adică depinde de setul de instrucțiuni pe care procesorul știe să îl execute, de sistemul de operare care rulează pe mașină, de perifericele prezente, etc. Alt dezavantaj este că pentru o funcționalitate relativ simplă a programului, trebuie scrisă o cantitate mult mai mare de cod decât într-un limbaj de nivel înalt (cum ar fi C sau Java), lucru care face ca mentenanța codului, ca și posibilitățile de dezvoltare să fie mult limitate. Pe de altă parte, un programator cu experiență poate face cele mai bune optimizări în limbaj de asamblare, el având control absolut asupra tuturor resurselor disponibile.
Totuși, pentru aplicații foarte complexe, este necesar un compromis între performanță și dimensiunea/ complexitatea codului. Astfel au apărut limbaje formale, de nivel înalt, care sunt mult mai intuitive, mai ușor de învățat și de înțeles, și care abstractizează o mare parte din straturile de nivel jos ale unei mașini de calcul (setul de instrucțiuni, harta memoriei, structura stivei de execuție, alocarea memoriei, etc.). Avantajele sunt uriașe, începând cu simplitatea sintactică și semantică a unui program și terminând cu faptul că apare acum un anumit grad de portabilitate. Această portabilitate apare datorită faptului că limbajul în sine este unic și un algoritm este descris în același fel pentru orice mașină, dar astfel apare și problema: din moment ce un procesor nu știe să execute decât setul lui de instrucțiuni, cum se face tranziția de la un program scris într-un limbaj de nivel înalt generic, la limbajul de asamblare? Există două soluții: interpretarea și compilarea.
Interpretarea
Interpretarea unui program se face folosind un alt program, numit interpretor. Acesta parsează codul sursă al programului pe care doriți să-l executați și îl transformă în timpul rulării în cod mașină. Avantajul acestui sistem este că există posibilitatea generării de program dinamic, la runtime, adică la momentul rulării acestuia. Un exemplu de limbaj interpretat este Javascript. Acesta acceptă construcții de forma:
eval("x=10;y=20;document.write(x*y)");
document.write("<br />" + eval("2+2"));
document.write("<br />" + eval(x+17));
Se vede faptul că funcția eval ia ca argument un șir de caractere care este construit dinamic, și apoi evaluat ca o expresie a limbajului. Acest lucru nu este posibil în cazul programelor compilate. Dezavantajul major al programelor interpretate este viteza redusă de execuție (în timpul rulării se face translația de la limbajul de nivel înalt la codul mașină).
Compilarea
Compilatorul este un program care are ca rol, traducerea unui limbaj în alt limbaj. În principiu, acesta este un program de traducere, dar nu între două limbi, ci între două limbaje formale. Diferența dintre limbă și limbaj formal este că acesta din urmă are un set de reguli stricte care fac traducerea riguroasă posibilă pentru un algoritm. Spre deosebire de interpretor, compilatorul face traducerea static, adică la ceea ce se numește compile-time, între limbajul de nivel înalt și limbajul de asamblare a unui procesor specific. Odată programul translatat în limbaj de asamblare, apoi în cod mașină cu ajutorul unui asamblor și al unui linker, acesta este rulat direct pe procesor, fără alte programe ajutătoare.