Linguaggio di programmazione ad alto livello: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
fix Etichetta: Annullato |
m portale |
||
(12 versioni intermedie di 11 utenti non mostrate) | |||
Riga 1:
{{F|linguaggi di programmazione|ottobre 2012}}
[[File:CPT-TheoryOfComp-Binary-Search-Python.png|miniatura|Esempio di [[Programma (informatica)|programma]] in [[Python]]]]
Un '''linguaggio di programmazione ad alto livello''', in [[informatica]], è un [[linguaggio di programmazione]] caratterizzato da una significativa [[Astrazione (informatica)|astrazione]] dai dettagli del funzionamento di un [[computer|calcolatore]] e dalle caratteristiche del [[linguaggio macchina]]. Il livello di astrazione definisce quanto sia di "alto livello" un linguaggio di programmazione.<ref>{{Cita web|url=http://www.ittc.ku.edu/hybridthreads/glossary/index.php|titolo=HThreads - RD Glossary|sito=web.archive.org|data=2007-08-26|accesso=2022-04-06|dataarchivio=26 agosto 2007|urlarchivio=https://web.archive.org/web/20070826224349/http://www.ittc.ku.edu/hybridthreads/glossary/index.php|urlmorto=sì}}</ref>
==
L'idea di un linguaggio automaticamente "traducibile" in linguaggio macchina, ma più vicino alla logica umana fu introdotta in informatica negli USA 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]].
== Descrizione ==
Riga 11 ⟶ 12:
=== Problemi del linguaggio macchina ===
I [[Linguaggio macchina|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 è quindi estremamente sconveniente: un'operazione basilare può richiedere anche tre o quattro istruzioni; si rende così necessario molto codice anche per i programmi più semplici. Il fatto che tale codice sia solamente numerico comporta inoltre grosse possibilità di errori e difficoltà nell'individuarne. È 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 [[Registro (informatica)|registri del processore]] in cui mantenere i dati temporanei.
Infine, ogni computer può comprendere solo il proprio [[linguaggio macchina]], poiché esso è diverso da processore a processore. Esiste quindi anche lo svantaggio di dover riscrivere interamente un programma per farlo funzionare su un'altra piattaforma.
Riga 24 ⟶ 25:
* 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).
==
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.
===
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]]).
===
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).
===
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>
===
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 ⟶ 48:
=== 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).
Riga 58 ⟶ 60:
* 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.
==
<references/>
Riga 69 ⟶ 71:
== Collegamenti esterni ==
* {{FOLDOC|high-level language|high-level language}}
* {{Collegamenti esterni}}
{{Controllo di autorità}}
{{Portale|informatica}}
[[Categoria:Paradigmi di programmazione]]
[[Categoria:Linguaggi di programmazione]]
|