Limbaje de programare compilate vs. interpretate

In industria software exista nenumarate limbaje de programare cu ajutorul carora se scriu si se dezvolta programele si aplicatiile pe care ulterior noi, in calitate de utilizatori finali, le folosim. Fara limbaje de programare ar fi practic imposibil procesul de dezvoltare al aplicatiilor software (SDLC).

Diversitatea limbajelor folosite pentru coding este atata de mare, incat exista foarte multe criterii de clasificare a acestora, si adevarate dezbateri pe marginea acestui subiect. Unul din criteriile asupra carora ne vom indrepta atentia imediat se refera la distinctia intre limbajele de programare compilate si cele interpretate.

Idei generale despre limbajele de programare

Pentru a contextualiza putin mai bine prezentarea actuala, trebuie sa intelegem ca fiecare limbaj de programare are specificul sau: fiecare are caracteristici generale (care pot fi intalnite preponderent si la alte limbaje), trasaturi specifice (care le diferentiaza), si implicit avantaje si dezavantaje tehnice.

Din acest motiv, nu exista un singur limbaj de programare universal valabil folosit de toate companiile de IT, acest lucru ar fi o utopie. Tocmai de aceea avem aceasta diversitate de limbaje, car se folosesc in functie de cerintele proiectului/ proiectelor respectiv(e).

Astfel, discutand la modul general, putem avea limbaje de programare pentru zona de front-end (adica interfata softului) sau de back-end (pentru procesele din spate). Putem vorbi de limbaje loosely typed sau strongly typed (in functie de nivelul de detaliere a datelor), criteriu care poate influenta inclusiv alegerea in invatarea unui anumit limbaj la inceputul carierei sau inceperea unui proiect.

Si ajungem astfel la ce ne intereseaza, la limbajele compilate si cele interpretate. Aceasta distinctie deriva din modul cum aceste limbaje executa propriu-zis codul pe care noi il scriem, astfel incat sa il transforme in limbaj masina, inteles de procesorul computer-ului (adica limbaj binar cu ”0” si ”1”).

Limbajele de programare compilate

Prima categorie despre care vom detalia este cea a limbajelor de programare compilate. Denumirea acestor limbaje deriva din faptul ca pentru a transforma codul scris de noi in limbaj masina, limbajul respectiv foloseste un compilator care mai intai transforma codul nostru in ceea ce se cheama ”limbaj intermediar”.

Aceasta este doar prima etapa. In cea de-a doua acest limbaj intermediar intra in faza de runtime si se transforma in limbaj masina, inteles de computer, care ii executa actiunile si livreaza un rezultat pentru utilizatorul final.

Pentru a vizualiza mai bine aceste etape, putem urmari schema de mai jos, preluata de pe site-ul cu resurse de testare / IT Guru99.

Schema functionarii celor 2 tipuri de limbaje. Sursa: Guru99.

In cazul acestor procese, compilatorul are rolul de a organiza si sistematiza tot codul in bloc, sa se asigure ca nu sunt erori (de sintaxa de exemplu), daca exista chiar si o singura eroare, procesul se opreste dupa Build. Daca totul e ok, atunci se intra in etapa a doua, cand limbajul intermediar e transformat in limbaj masina si executat.

Tipul de compilator, precum si denumirea limabjului intermediar difera de la un limbaj de programare la altul, reprezentand deja niste detalii tehnice mai avansate. De exemplu in cazul limbajului Java, limbajul intermediar se cheama ”bytecode”.

Ca exemple, printre cele mai populare limbaje de programare compilate se numara Java, C, C++, C#, Go si conform anumitor opinii JavaScript.

Limbajele de programare interpretate

A doua categorie principala este cea a limbajelor interpretate. Numele acestora, intr-un mod intuitiv si asemanator ca in cazul primei categorii despre care am discutat, provine de la faptul ca acestea folosesc un ”interpret” pentru a transforma codul nostru in limbaj masina.

Ce inseamna asta mai exact? Limbajele interpretate traduc codul nostru linie cu linie, nu il compacteaza, nu ii fac build precum cele compilate. Executia codului este una directa, acesta fiind interpretat linie cu linie in limbaj masina, sarindu-se astfel de etapa limbajului intermediar.

Revenind la schema de mai sus, se poate observa destul de clar: limbajele interpretate trec direct la citirea, intelegerea (interpretarea) codului si executia acestuia. Si sistemele de interpretare difera de la un limbaj la altul din punct de vedere al particularitatilor tehnice, si uneori chiar si in cadrul aceluiasi limbaj, de la o versiune la alta.

Ca exemple, intre limbajele de programare interpretate cunoscute se regasesc Python, PHP, Ruby sau Perl. Si aici exista mai multe opinii care incadreaza JavaScript ca fiind mai degraba un limbaj interpretat.

Asemanari si deosebiri intre cele doua categorii de limbaje

De-a lungul timpului s-au facut foarte multe comparatii intre cele tipuri de limbaje, cele compilate si cele interpretate. Desigur, exista oameni carora le place mai mult o anumita categorie sau alta, insa acum nu ne intereseaza sa argumentam daca unele sunt mai bune decat altele, ci doar sa vedem o comparatie succinta.

O prima asemanare este legata de faptul ca ambele au acelasi scop din punct de vedere al rularii, si anume transformarea liniilor de cod scrise de oameni in limbaj masina, inteles de computer. Tot o asemanare este si aceea ca etapa de runtime este comuna, ea fiind necesara din perspectiva executiei codului in definitiv.

Insa de aici intervin numeroase deosebiri, prima si probabil cea mai importanta este prezenta etapei de compilare a codului in intregime la limbajele compilate, pe cand cele interpretate il citesc si executa linie cu linie. Ca sa ne dam usor seama ce limbaje sunt compilate si care nu, ne putem uita in IDE-ul folosit, si daca atunci cand rulam un anume cod ne apare optiunea de Build (project), atunci e un limbaj clar compilat inainte de runtime pentru a depista erorile.

O deosebire care este insa discutabila este viteza de rulare a codului. Aici opiniile intalnite sunt destul de impartite, unii zic ca limbajele compilate sunt mai rapide, altii ca cele interpretate au acest atu. Adevarul e pe undeva la mijloc: depinde foarte mult de tipul de compilator/ interpret folosit si de ce faza ne referim.

Daca ne referim doar la partea de runtime, e posibil ca cele compilate sa fie mai rapide deoarece codul a fost deja compactat si citit o data inainte de executia propriu-zisa. Daca ne referim la tot procesul, de la A la Z, atunci limbajele interpretate sunt mai rapide pentru ca nu trec si prin compilarea codului.

O alta deosebire este data de faptul ca limbajul compilat genereaza acel limbaj intermediar comparativ cu cel interpretat care niciodata nu ofera acest lucru. De aici decurge faptul ca acel limbaj intermediar poate fi ulterior rulat pe o alta masina independent de programul initial, pe cand codul unui limbaj interpretat poate fi rulat pe alta masina doar daca exista mediul de rulare (si interpretul) instalate.

De asemenea, la limbajul compilat erorile sunt depistate in bloc in etapa intai, de compilare, codul nefiind deloc executat daca acestea exista. Prin comparatie, la limbajul interpretat, codul incepe sa se executa linie cu linie, pana la prima eroare. Si de aici pot decurge avantaje si dezavantaje, o privire mai de ansamblu asupra tuturor erorilor in limbajul compilat versus faptul ca poti verifica direct ce linii de cod merg bine (pana la o prima eroare) in limbajul interpretat.

In final, si o deosebire ce implica partea de hardware a computer-ului. Compilatorul unui limbaj compilat nu necesita resurse de memorie deoarece programul care se solicita a fi compactat si executat se realizeaza independent. Prin comparatie, interpretul unui limbaj aferent exista in memoria computer-ului in timpul interpretarii codului respectiv.

Cum poate fi impactata testarea automata de limbajul de programare?

O intrebare legitima pe care merita sa ne-o adresam este daca si in ce fel procesul de testare automata poate fi impactat de limbajul de programare pe care il folosim. Si aici exista mai multe opinii si nuante in formularea unui raspuns care sa incline balanta spre o categorie de limbaje de programare sau spre alta.

Insa raspunsul cel mai onest si previzibil este ca depinde de extrem de multi factori si nu exista o solutie universala. Factorii care pot decide alegerea limbajului cu care sa automatizam testele pe un anumit soft pot fi tipul de testare urmat (unit testing, teste de integrare, teste End-to-end), complexitatea testarii, cerintele si / sau preferintele tehnice ale echipei de QA, compatibilitate, tool-uri aditionale si bineinteles costuri financiare.

In functie de proiect si de necesitatile sale, pot fi alese atat limbajele de compilare, cat si cele interpretate, de multe ori aceasta diferenta in modul de executie a codului nefiind cea mai importanta, in mod necesar.

Exista insa unele recomandari care privesc limbajul de programare pe care sa il alegem in vederea testarii automate. Aici ar fi vorba de avantajul de a alege un limbaj compilat ori interpretat care sa fie bine documentat, sa aiba ghiduri si documentatii tehnice solide care sa poata fi consultate la nevoie, sa fie usor de integrat in proiectul echipei si sa ofere o varietate mai mare de module, pachete si framework-uri dedicate pe diferite nivele si scopuri.

Daca ne referim din perspectiva invatarii la inceputul carierei a testarii automate, atunci personal as zice ca nu conteaza asa mult daca alegem un limbaj compilat sau interpretat. Oricare optiune din limbajele consacrate, precum JavaScript, Java sau Python, corelate cu un framework solid de automation precum Selenium sau Cypress se poate dovedi o alegere extrem de buna pe viitor.

Concluzii

In incheiere, reamintesc faptul ca modul de executie a codului scris de oameni a condus la impartirea limbajelor de programare in 2 mari categorii in functie de cum transforma acest cod in limbaj masina: limbaje compilate si interpretate.

Ambele sunt la fel de importante, sunt la fel de folosite in industria IT, si fiecare are avantajele si dezavantajele sale tehnice, neexistand o optiune perfecta. Chiar daca detaliile care seapara aceste 2 categorii ar putea fi putin mai avansate, cunoasterea celor 2 tipuri reprezinta un subiect foarte bun de stiut intr-o cariera de IT, deoarece ne ajuta sa intelegem mai bine instrumentele cu care lucram preponderent si ce alegeri sa facem pe viitor, inclusiv in zona testarii software.

Surse despre acest subiect

Tutorial despre limbaje compilate si interpretate de la Development Factory

Articol pe Guru99 despre subiect si unul de la freeCodeCamp

Un articol despre catalogarea limbajului JavaScript si cu multe detalii explicative despre compiler si interpreter

Un articol pe Linkedin despre limbaje de programare folosite in testare si sfaturi in alegerea unuia dintre ele

Mircea-Gabriel Macarie

https://www.linkedin.com/in/mirceamacarie/

Tech enthusiast și QA engineer, membru al comunității Vlog De IT. Interesat de testare software (QA) în general, de User Experience și Web Development.

Related post

Leave a Reply

Your email address will not be published. Required fields are marked *