b'\n_START_ARTICLE_\nLinguaggio di programmazione ad alto livello\n_START_SECTION_\nCenni storici\n_START_PARAGRAPH_\nL\'idea di un linguaggio automaticamente "traducibile" in linguaggio macchina, ma pi\xc3\xb9 vicino alla logica umana fu introdotta in informatica negli a partire dal 1950, soprattutto grazie al lavoro di John Backus (IBM), a cui si deve il primo linguaggio ad alto livello ad avere avuto ampia diffusione, il Fortran. Per questa innovazione Backus ha ricevuto il premio Turing.\n_START_SECTION_\nDescrizione\n_START_PARAGRAPH_\nSono progettati per essere facilmente comprensibili dagli esseri umani, fino a includere alcuni elementi del linguaggio naturale. Per essere eseguiti da un calcolatore, i programmi scritti in linguaggio ad alto livello devono essere tradotti o interpretati da un altro programma._NEWLINE_In generale, la maggior parte dei linguaggi di programmazione ad alto livello moderni conserva alcuni concetti di fondo che \xc3\xa8 possibile ricondurre ad alcune caratteristiche tipiche del linguaggio macchina. Concetti come quelli di variabile e assegnamento sono una versione astratta dello spostamento di dati fra celle di memoria; e il fatto che il paradigma di programmazione dominante sia quello imperativo si pu\xc3\xb2 facilmente giustificare con la considerazione che anche i linguaggi macchina sono imperativi.\n_START_SECTION_\nProblemi del linguaggio macchina\n_START_PARAGRAPH_\nI linguaggi macchina sono formati da istruzioni elementari, che vengono codificate in forma numerica e che consentono di effettuare operazioni aritmetiche, conversioni di bit e poco altro. Scrivere programmi in tale linguaggio \xc3\xa8 quindi estremamente sconveniente: un\'operazione basilare pu\xc3\xb2 richiedere anche tre o quattro istruzioni; si rende cos\xc3\xac necessario molto codice anche per i programmi pi\xc3\xb9 semplici. Il fatto che tale codice sia solamente numerico comporta inoltre grosse possibilit\xc3\xa0 di errori e difficolt\xc3\xa0 nell\'individuarne. \xc3\x88 necessario inoltre avere continuamente a che fare con le caratteristiche fisiche della macchina in cui si programma: bisogna ad esempio specificare manualmente gli indirizzi di memoria in cui salvare le informazioni e i registri del processore in cui mantenere i dati temporanei._NEWLINE_Infine, ogni computer pu\xc3\xb2 comprendere solo il proprio linguaggio macchina, poich\xc3\xa9 esso \xc3\xa8 diverso da processore a processore. Esiste quindi anche lo svantaggio di dover riscrivere interamente un programma per farlo funzionare su un\'altra piattaforma.\n_START_SECTION_\nModelli di esecuzione\n_START_PARAGRAPH_\nUn linguaggio ad alto livello, per definizione, non \xc3\xa8 direttamente "eseguibile" da parte del calcolatore. L\'esecuzione dei linguaggi ad alto livello si pu\xc3\xb2 basare su due principali modelli, compilazione e interpretazione, che ammettono alcune varianti e possono essere combinati fra loro.\n_START_SECTION_\nCompilazione\n_START_PARAGRAPH_\nIn questo modello viene usato un programma detto compilatore, la cui funzione \xc3\xa8 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 \xc3\xa8 quindi un programma scritto nel linguaggio macchina locale, che pu\xc3\xb2 essere eseguito direttamente dal calcolatore. A valle della traduzione, sorgente e compilatore non sono pi\xc3\xb9 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 \xc3\xa8 "non portabile", essendo generato in uno specifico linguaggio macchina (e per uno specifico sistema operativo).\n_START_SECTION_\nInterpretazione\n_START_PARAGRAPH_\nIn questo modello viene usato un programma detto interprete, la cui funzione \xc3\xa8 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\xc3\xa0 (lo stesso programma pu\xc3\xb2 essere eseguito su diversi calcolatori e diversi sistemi operativi, a patto che sia disponibile un interprete) ma ha generalmente prestazioni inferiori (poich\xc3\xa9 il costo dell\'analisi e dell\'interpretazione del codice sorgente viene pagato durante l\'esecuzione).\n_START_SECTION_\nTranscompilazione\n_START_PARAGRAPH_\nIn questo modello viene usato un programma detto transcompilatore, la cui funzione \xc3\xa8 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). L\'esecuzione avviene poi secondo il modello previsto per il linguaggio "di arrivo" del processo di transcompilazione.\n_START_SECTION_\nApprocci ibridi\n_START_PARAGRAPH_\nMolti linguaggi moderni (per esempio 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 processore fisico. Questo approccio si distingue dalla transcompilazione perch\xc3\xa9 il linguaggio di arrivo, pur non essendo linguaggio macchina in senso stretto, non \xc3\xa8 un linguaggio ad alto livello (e in genere \xc3\xa8 un linguaggio progettato appositamente e non destinato all\'uso diretto da parte di un programmatore).\n_START_SECTION_\nLivelli di astrazione\n_START_PARAGRAPH_\nUn linguaggio di programmazione pu\xc3\xb2 essere descritto come "pi\xc3\xb9 ad alto livello" di un altro se si discosta in modo pi\xc3\xb9 radicale dalle caratteristiche tipiche del linguaggio macchina. In questo senso, si possono in linea di principio classificare tutti i linguaggi in funzione del loro livello di astrazione. In gran parte, una tale classificazione rispecchierebbe da vicino l\'evoluzione storica dei linguaggi e dei paradigmi di programmazione, con i linguaggi pi\xc3\xb9 antichi (FORTRAN, Cobol) evidentemente pi\xc3\xb9 vicini al linguaggio macchina rispetto alle ultime generazioni di linguaggi a oggetti come Java o Python._NEWLINE_Questi ultimi linguaggi furono categorizzati negli anni 90 come linguaggi ad altissimo livello, ma la terminologia \xc3\xa8 caduta in disuso, perch\xc3\xa9, proprio in virt\xc3\xb9 dell\'evoluzione storica, un linguaggio definito "ad alto livello" alla sua nascita in seguito diventa di "basso livello"; un esempio fra tutti \xc3\xa8 quello del C._NEWLINE_Fra i linguaggi a pi\xc3\xb9 alto livello in assoluto vanno probabilmente citati quelli corrispondenti a paradigmi di programmazione di origine matematica, come i linguaggi funzionali (LISP) e logici (Prolog).'