Linguaggio di programmazione ad alto livello: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riformulo tutto. L'interprete non è un programma che *traduce* il linguaggio ad alto livello, è un programma che lo *esegue*.
Riga 24:
In generale, la maggior parte dei linguaggi di programmazione ad alto livello moderni conserva alcuni concetti di fondo che è possibile ricondurre ad alcune caratteristiche tipiche del linguaggio macchina. Concetti come quelli di [[variabile (informatica)|variabile]] e [[assegnamento]] sono una versione [[astrazione (informatica)|astratta]] dello spostamento di dati fra [[cella di memoria|celle di memoria]]; e il fatto che il paradigma di programmazione dominante sia quello [[programmazione imperativa|imperativo]] si può facilmente giustificare con la considerazione che anche i linguaggi macchina ''sono'' imperativi.
 
==Modelli di esecuzione==
== Politiche di traduzione del linguaggio ad alto livello in linguaggio macchina ==
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 tre diversi modelli: [[compilazione]], [[interpretazione]] o [[cross-compilazione]].
 
===Compilazione===
Com'è stato detto, il linguaggio ad alto livello non è direttamente comprensibile dal calcolatore. È quindi necessario effettuare una traduzione dal linguaggio del programmatore a quello della macchina.
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===
=== Traduzione che avviene una sola volta: la [[compilazione]] ===
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 questa politica di traduzione, un programma chiamato [[compilatore]] si occupa della traduzione. Questa avviene una sola volta: durante la compilazione le istruzioni in linguaggio di alto livello vengono tradotte in istruzioni macchina; ha così origine un file nel linguaggio macchina locale, che costituisce un [[File eseguibile|eseguibile]].
In questo modello viene usato un programma detto [[transcompilatore]], la cui funzione è quella di tradurre il programma sorgente in un programma scritto in un altro linguaggio anch'esso diverso dal linguaggio macchina. L'esecuzione avviene poi secondo il modello previsto per il linguaggio "di arrivo" del processo di transcompilazione. Una variante molto diffusa di questo modello prevede la compilazione in un linguaggio intermedio, molto vicino al linguaggio macchina, che viene interpretato. Il linguaggio intermedio viene talvolta detto [[bytecode]]. Un linguaggio moderno basato su questo approccio è per esempio [[Java (linguaggio di programmazione)|Java]].
 
=== Traduzione in tempo reale: l'[[Interprete (informatica)|interpretazione]] ===
 
In questo modello, il listato non viene tradotto una sola volta, bensì tutte le volte che viene eseguito. Un programma apposito, l'[[Interprete (informatica)|interprete]], durante l'esecuzione del programma traduce ogni istruzione di alto livello in istruzione macchina. In questo caso si ha una miglior [[portabilità]], ma peggiori prestazioni.
 
Esiste anche un modello di compilazione intermedio che consiste nel tradurre il codice sorgente non direttamente in un codice macchina (direttamente eseguibile dall'hardware) ma in un codice intermedio (che cerca di avvicinarsi il più possibile al codice macchina). In questo caso è necessaria la presenza di un interprete che sia in grado di rendere possibile l'esecuzione del codice intermedio generato.
 
Uno dei primi esempi di compilatore che ha usato questo approccio è stato l' UCSD-PASCAL che generava un codice intermedio denominato [[P-Code]].
 
== Livelli di astrazione ==