Linguaggio di programmazione ad alto livello: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
fix
Etichetta: Annullato
Riga 24:
* si introdusse il concetto che i linguaggi di programmazione e i programmi potessero essere [[portabilità|portabili]], ovvero eseguibili su diversi computer (a patto di disporre di compilatori o interpreti per tali computer).
 
== Modelli di esecuzione ==
Un linguaggio ad alto livello, per definizione, non è ''direttamente'' "eseguibile" da parte del calcolatore. L'esecuzione dei linguaggi ad alto livello si può basare su due principali modelli, [[compilazione]] e [[Interpretazione (informatica)|interpretazione]], che ammettono alcune varianti e possono essere combinati fra loro.
 
=== Compilazione ===
In questo modello viene usato un programma detto [[compilatore]], la cui funzione è quella di tradurre il programma sorgente (ovvero nel linguaggio ad alto livello) in un programma in [[linguaggio macchina]] equivalente (ovvero che esibisce lo stesso comportamento). Il risultato della traduzione è quindi un programma scritto nel linguaggio macchina ''locale'', che può essere eseguito direttamente dal calcolatore. A valle della traduzione, sorgente e compilatore non sono più necessari per l'esecuzione del programma. Il costo della traduzione in linguaggio macchina (in termini di tempo e memoria necessari per portarla a termine) viene "pagato" solo durante la fase di ''compilazione''. Il risultato della compilazione è "[[portabilità|non portabile]]", essendo generato in uno specifico linguaggio macchina (e per uno specifico [[sistema operativo]]).
 
=== Interpretazione ===
In questo modello viene usato un programma detto [[Interprete (informatica)|interprete]], la cui funzione è quella di interpretare le istruzioni del programma sorgente ed eseguirle. A differenza del compilatore, l'interprete non produce mai un eseguibile. Di conseguenza, interprete e sorgente sono sempre necessari a ogni esecuzione del programma. Questo approccio consente una maggiore portabilità (lo stesso programma può essere eseguito su diversi calcolatori e diversi sistemi operativi, a patto che sia disponibile un interprete) ma ha generalmente prestazioni inferiori (poiché il costo dell'analisi e dell'interpretazione del codice sorgente viene pagato durante l'esecuzione).
 
=== Transcompilazione ===
In questo modello viene usato un programma detto [[transcompilatore]], la cui funzione è quella di tradurre un programma sorgente scritto in un linguaggio ad alto livello in un programma scritto in un altro linguaggio ad alto livello (ovvero, di livello paragonabile).<ref>[http://www.compilers.net/paedia/compiler/index.htm Types of compilers]</ref> L'esecuzione avviene poi secondo il modello previsto per il linguaggio "di arrivo" del processo di transcompilazione.
 
=== Approcci ibridi ===
Molti linguaggi moderni (per esempio [[Java (linguaggio di programmazione)|Java]]) adottano un approccio ibrido fra compilazione e interpretazione, in cui il codice sorgente viene "compilato" in un linguaggio intermedio, molto vicino al linguaggio macchina, che viene poi interpretato da un programma che ha un funzionamento molto simile a quello di un [[CPU|processore]] fisico. Questo approccio si distingue dalla transcompilazione perché il linguaggio di arrivo, pur non essendo linguaggio macchina in senso stretto, non è un linguaggio ad alto livello (e in genere è un linguaggio progettato appositamente e non destinato all'uso diretto da parte di un programmatore).
 
Riga 47:
 
=== Livello di astrazione ed efficienza ===
 
C'è chi dice che, in termini almeno generali, quanto più complessa è la traduzione da un dato linguaggio al linguaggio macchina, tanto più inefficiente ''tende'' a essere il linguaggio (in quanto il programmatore perde ogni percezione, anche indiretta, di ciò che accadrà ''realmente'', a livello hardware, quando il programma verrà eseguito; e di conseguenza perde anche ogni possibilità di "ottimizzare" tale esecuzione).
 
Line 59 ⟶ 58:
* i profiler forniscono informazioni dettagliate su quali siano i colli di bottiglia, si valuterà se è necessario tradurne o riscriverne quelle parti in linguaggi di programmazione che ne consentano una esecuzione più rapida, avendo già ottenuto e verificato specifiche chiare e certe.
 
== Note ==
<references/>