Limbaj de programare de nivel înalt

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Un limbaj de programare la nivel înalt , în informatică, este un limbaj de programare caracterizat printr-o abstracție semnificativă de la detaliile funcționării unui computer și caracteristicile limbajului mașinii .

fundal

Ideea unui limbaj „traductibil” automat în limbajul mașinii, dar mai apropiat de logica umană, a fost introdusă în informatică în anii 1950, mai ales datorită muncii lui John Backus ( IBM ), căruia îi datorăm primul mare -definirea nivelului limbajului pentru a fi avut o largă difuzie, Fortran . Pentru această inovație, Backus a primit premiul Turing .

Descriere

Acestea sunt concepute pentru a fi ușor de înțeles de către oameni, inclusiv unele elemente ale limbajului natural . Pentru a fi executate de un computer, programele scrise într-un limbaj de nivel înalt trebuie traduse sau interpretate de un alt program.

În general, majoritatea limbajelor moderne de programare la nivel înalt păstrează câteva concepte de bază care pot fi trasate înapoi la unele caracteristici tipice ale limbajului mașinii. Concepte precum variabilă și atribuire sunt o versiune abstractă a mișcării datelor între celulele de memorie ; iar faptul că paradigma de programare dominantă este imperativă poate fi ușor justificată prin considerarea că limbajele mașinii sunt, de asemenea, imperative.

Probleme de limbaj automat

Limbajele mașinii sunt formate din instrucțiuni elementare, care sunt codificate în formă numerică și care vă permit să efectuați operații aritmetice, conversii de biți și puțin altceva. Scrierea programelor în acest limbaj este, prin urmare, extrem de incomodă: o operație de bază poate necesita chiar trei sau patru instrucțiuni; este nevoie de mult cod chiar și pentru cele mai simple programe. Faptul că acest cod este doar numeric implică, de asemenea, o mare posibilitate de erori și dificultăți în identificarea acestora. De asemenea, este necesar să vă ocupați în mod constant de caracteristicile fizice ale mașinii în care programați: de exemplu, trebuie să specificați manual adresele de memorie în care să salvați informații și registrele procesorului în care să păstrați date temporare.

În cele din urmă, fiecare computer își poate înțelege propriul limbaj al mașinii , deoarece diferă de la procesor la procesor. Prin urmare, există și dezavantajul de a trebui să rescrieți complet un program pentru a-l face să funcționeze pe o altă platformă.

Impactul limbajelor la nivel înalt

Ideea limbajelor de nivel înalt stă deja la baza limbajelor de asamblare , care însă nu sunt altceva decât „transliterări” ale limbajelor mașinii corespunzătoare, care, de exemplu, fac ca un cod mnemonic (deci mai lizibil) să corespundă fiecărui binar codul de instrucțiuni. Pe de altă parte, în limbajele de programare la nivel înalt adevărate, o singură instrucțiune vă permite să efectuați o operație simplă, dar completă. Instrucțiunile nu sunt în formă numerică, sunt cuvinte (în general în engleză), al căror sens corespunde operației pe care o efectuează. Spre deosebire de limbajele de asamblare , prin urmare, procesul de traducere poate avea o complexitate arbitrară, astfel încât limbajul la nivel înalt poate fi, de asemenea, complet diferit (în termeni de sintaxă și semantică ) de limbajul mașinii de bază.

În esență, programarea la nivel înalt a avut ca efect separarea completă (sau aproape) a caracteristicilor limbajelor de programare de cele ale hardware - ului destinat executării acestora. Principalele consecințe includ următoarele:

  • proiectarea procesorului a fost complet eliberată de orice cerință legată de lizibilitatea limbajelor mașinii, deoarece se putea presupune în mod rezonabil că nimeni (sau aproape nimeni) nu ar scrie sau citi cod direct în limbaj mașină sau de asamblare ; eficiența a devenit singura preocupare reală a proiectanților de hardware;
  • limbajele de programare la nivel înalt au avut o evoluție complet independentă de cea a hardware-ului; scopul general al acestei evoluții a fost de a face ca aceste limbaje să fie „mai ușor” de utilizat pentru programatorul uman;
  • a fost introdus conceptul că limbajele și programele de programare pot fi portabile , adică executabile pe diferite computere (atâta timp cât aveți compilatoare sau interpreți pentru aceste computere).

Modele de execuție

Un limbaj la nivel înalt, prin definiție, nu este direct „executabil” de către computer. Executarea limbajelor la nivel înalt se poate baza pe două modele principale, compilarea și interpretarea , care admit unele variații și pot fi combinate între ele.

Compilare

În acest model este utilizat un program numit compilator , a cărui funcție este de a traduce programul sursă (adică în limbajul de nivel înalt) într-un program de limbaj mașină echivalent (adică care prezintă același comportament). Rezultatul traducerii este deci un program scris în limbajul mașinii locale , care poate fi executat direct de computer. În aval de traducere, sursa și compilatorul nu mai sunt necesare pentru executarea programului. Costul traducerii în limbajul mașinii (în termeni de timp și memorie necesară pentru a o finaliza) este „plătit” numai în timpul fazei de compilare . Rezultatul compilației este „ non-portabil ”, fiind generat într-un limbaj specific al mașinii (și pentru un sistem de operare specific).

Interpretare

Acest model folosește un program numit interpret , a cărui funcție este de a interpreta instrucțiunile programului sursă și de a le executa. Spre deosebire de compilator, interpretul nu produce niciodată un executabil. În consecință, interpretul și sursa sunt întotdeauna necesare pentru fiecare rulare a programului. Această abordare permite o portabilitate mai mare (același program poate rula pe computere și sisteme de operare diferite, atâta timp cât este disponibil un interpret), dar are în general performanțe mai mici (deoarece costul analizei și interpretării codului sursă este plătit în timpul rulării).

Transcompilare

În acest model, se folosește un program numit transcompiler , a cărui funcție este de a traduce un program sursă scris într-un limbaj de nivel înalt într-un program scris într-un alt limbaj de nivel înalt (adică de un nivel comparabil). [1] Execuția are loc apoi conform modelului furnizat pentru limba „țintă” a procesului de transcompilare.

Abordări hibride

Multe limbaje moderne (de exemplu Java ) adoptă o abordare hibridă între compilare și interpretare, în care codul sursă este „compilat” într-un limbaj intermediar, foarte apropiat de limbajul mașinii, care este apoi interpretat de un program care are un funcționare similară cu cea a unui procesor fizic. Această abordare diferă de transcompilare deoarece limba țintă, deși nu este un limbaj mașină în sens strict, nu este un limbaj la nivel înalt (și este, în general, un limbaj special conceput și nu este destinat utilizării directe de către un programator).

Niveluri de abstractizare

Un limbaj de programare poate fi descris ca „nivel superior” decât altul dacă diferă mai radical de caracteristicile tipice ale limbajului mașinii. În acest sens, toate limbile pot fi, în principiu, clasificate în funcție de nivelul lor de abstractizare. În mare parte, o astfel de clasificare ar reflecta îndeaproape evoluția istorică a limbajelor și paradigmelor de programare, cu limbaje mai vechi ( FORTRAN , Cobol ) evident mai aproape de limbajul mașinii decât ultimele generații de limbaje orientate obiect, cum ar fi Java sau Python. . .

Aceste ultime limbi au fost clasificate în anii 90 ca limbaje de nivel foarte înalt , dar terminologia a căzut în desuetudine, deoarece, tocmai în virtutea evoluției istorice, un limbaj definit ca „nivel înalt” la naștere devine ulterior „nivel scăzut” "; un exemplu dintre toate este cel al lui C.

Printre limbajele de cel mai înalt nivel, trebuie să le menționăm probabil pe cele corespunzătoare paradigmelor de programare de origine matematică, cum ar fi limbajele funcționale ( LISP ) și logice ( Prolog ).

Nivelul de abstractizare și eficiență

Există cei care spun că, cel puțin în termeni generali, cu cât traducerea dintr-o limbă dată în limbajul mașinii este mai complexă, cu atât limbajul tinde să fie mai ineficient (deoarece programatorul își pierde orice percepție, chiar indirectă, despre ceea ce se va întâmpla cu adevărat , la nivel hardware, când programul va fi executat și, în consecință, își pierde orice posibilitate de „optimizare” a acestei execuții).

Cu toate acestea, această pierdere a eficienței software-ului este considerată în general un cost acceptabil pentru a obține o serie de avantaje (pentru unele dintre care termenul „eficiență” ar putea fi încă folosit, deși cu o conotație ușor diferită):

  • limbajele la nivel înalt oferă timpi de dezvoltare foarte scurți;
  • distanța conceptuală dintre analiză și implementare este redusă, cu o reducere consecventă a riscului de traducere incorectă a specificațiilor în cod;
  • erorile logice sunt mai ușor identificate, fiind exprimate în logica domeniului problemei;
  • erorile mașinii care sunt interceptate și raportate în mod adecvat de limbajul la nivel înalt sunt în mare parte evitate;
  • timpii de execuție se pot îmbunătăți odată cu eficiența algoritmilor (riscul, în caz contrar, este de a executa rapid algoritmi ineficienți);
  • profilatorii furnizează informații detaliate despre care sunt blocajele, se va evalua dacă este necesar să traducă sau să rescrie acele părți în limbaje de programare care să permită o execuție mai rapidă, având deja obținute și verificate specificații clare și certe.

Notă

Elemente conexe

linkuri externe

Controlul autorității LCCN (EN) sh2007005228 · GND (DE) 4160367-9