<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://jardin.cscsp.ch/index.php?action=history&amp;feed=atom&amp;title=Compilatore</id>
	<title>Compilatore - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://jardin.cscsp.ch/index.php?action=history&amp;feed=atom&amp;title=Compilatore"/>
	<link rel="alternate" type="text/html" href="https://jardin.cscsp.ch/index.php?title=Compilatore&amp;action=history"/>
	<updated>2026-04-12T01:50:19Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://jardin.cscsp.ch/index.php?title=Compilatore&amp;diff=688&amp;oldid=prev</id>
		<title>imported&gt;22denny91: Punteggiatura</title>
		<link rel="alternate" type="text/html" href="https://jardin.cscsp.ch/index.php?title=Compilatore&amp;diff=688&amp;oldid=prev"/>
		<updated>2024-12-30T08:25:52Z</updated>

		<summary type="html">&lt;p&gt;Punteggiatura&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{nota disambigua|l&amp;#039;omonima professione editoriale|Curatore editoriale}}&lt;br /&gt;
{{nota disambigua|il tipo di album|Compilation|Compilazione}}&lt;br /&gt;
[[File:Compiler-it.svg|upright=1.4|thumb|Schema che illustra il funzionamento di un compilatore ideale.]]&lt;br /&gt;
&lt;br /&gt;
Un &amp;#039;&amp;#039;&amp;#039;compilatore&amp;#039;&amp;#039;&amp;#039; è un [[programma (informatica)|programma]] [[informatica|informatico]] che traduce una serie di [[istruzione (informatica)|istruzioni]] scritte in un determinato [[linguaggio di programmazione]] ([[codice sorgente]]) in istruzioni di un altro linguaggio ([[codice oggetto]]): il processo di traduzione si chiama compilazione mentre l&amp;#039;attività inversa - ovvero passare dal codice oggetto al codice sorgente - è chiamata [[decompilazione]] ed è effettuata per mezzo di un [[decompilatore]].&lt;br /&gt;
&lt;br /&gt;
Se tutti i compilatori aderissero esattamente alla [[specifica]] del linguaggio, lo stesso programma potrebbe essere compilato senza modifiche da ciascun compilatore, producendo risultati [[Semantica (informatica)|semanticamente]] uguali, ovvero programmi che producono lo stesso risultato se sottoposti agli stessi [[input|dati di ingresso]]. Nella realtà, molti compilatori implementano il linguaggio in modo incompleto o aggiungono estensioni proprietarie, creando quindi dei [[dialetto (informatica)|dialetti]] del linguaggio principale. Per i linguaggi che adottano uno standard nella [[decorator|decorazione]] dei simboli, il codice oggetto generato da compilatori differenti può essere collegato assieme in un unico eseguibile.&lt;br /&gt;
&lt;br /&gt;
== Storia ==&lt;br /&gt;
A partire dal 1950 vennero sviluppati diversi compilatori sperimentali (tra cui l&amp;#039;[[A-0 System]] di [[Grace Hopper]]), ma nel 1957 il team [[Fortran]] presso l&amp;#039;[[IBM]], guidato da [[John Backus]], fu il primo a realizzare un compilatore completo mentre, nel [[1960]], il [[COBOL]] fu uno dei primi linguaggi a essere compilato su più [[Architettura (computer)|architetture]].&amp;lt;ref&amp;gt;[http://www.interesting-people.org/archives/interesting-people/199706/msg00011.html The World&amp;#039;s First COBOL Compilers] {{webarchive|url=https://web.archive.org/web/20120220002430/http://www.interesting-people.org/archives/interesting-people/199706/msg00011.html |data=20 febbraio 2012 }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;idea della compilazione prese velocemente piede e molti dei principi di design dei compilatori vennero sviluppati negli anni sessanta. Un compilatore è esso stesso un programma scritto in un qualche linguaggio e i primi di essi vennero scritti in [[Assembly]]. Il primo compilatore auto-compilato, capace cioè di compilare il suo stesso codice, fu creato per il linguaggio [[Lisp]] da Hart e Levin presso il [[Massachusetts Institute of Technology|MIT]] nel [[1962]].&amp;lt;ref&amp;gt;{{Cita web |url=http://www.ai.mit.edu/research/publications/browse/0000browse.shtml# |titolo=AIM-39 |accesso=4 novembre 2005 |urlarchivio=https://web.archive.org/web/20060913001624/http://www.ai.mit.edu/research/publications/browse/0000browse.shtml# |dataarchivio=13 settembre 2006 |urlmorto=sì }}&amp;lt;/ref&amp;gt; L&amp;#039;uso di linguaggi ad alto livello per scrivere i compilatori ebbe una accelerazione nei primi anni settanta quando i linguaggi [[Pascal (linguaggio)|Pascal]] e [[C (linguaggio)|C]] furono usati per scrivere compilatori per loro stessi: ossia, ad esempio, furono scritti compilatori per il C scritti a loro volta in C.&lt;br /&gt;
&lt;br /&gt;
== Descrizione ==&lt;br /&gt;
{{vedi anche|Codice sorgente|Codice oggetto}}&lt;br /&gt;
&lt;br /&gt;
Quando un linguaggio di programmazione viene definito per la prima volta, sorge il problema di come realizzare il relativo compilatore. In questo caso esistono due approcci possibili:&lt;br /&gt;
* scrivere il compilatore in un linguaggio diverso;&lt;br /&gt;
* oppure - se esiste già un interprete per il nuovo linguaggio - è possibile sfruttarlo per scrivere una prima versione del compilatore, che verrà usata (dandogli in input il codice sorgente di sé stesso) per ottenere un primo compilatore funzionante in linguaggio macchina, che quindi renderà inutile l&amp;#039;uso dell&amp;#039;interprete. Il compilatore così ottenuto potrà essere usato per scrivere a sua volta compilatori migliori, e così via.&lt;br /&gt;
&lt;br /&gt;
=== Funzionamento ===&lt;br /&gt;
[[File:Multi-pass compiler-it.svg|thumb|Fasi tipiche della compilazione.]]&lt;br /&gt;
&lt;br /&gt;
Il compilatore prende in [[input|ingresso]] un [[Programma (informatica)|programma]], il codice sorgente, su cui esegue una serie di operazioni in modo da ottenere, in assenza di [[Affidabilità#Errore|errori]], il codice oggetto. In generale i compilatori sono in grado di riconoscere alcune classi di errori presenti nel programma, e in alcuni casi di suggerire in che modo correggerli.&lt;br /&gt;
&lt;br /&gt;
I compilatori attuali dividono l&amp;#039;operazione di compilazione in due stadi principali: il &amp;#039;&amp;#039;[[front end]]&amp;#039;&amp;#039; e il &amp;#039;&amp;#039;[[back end]]&amp;#039;&amp;#039;. Nello stadio di &amp;#039;&amp;#039;front end&amp;#039;&amp;#039; il compilatore traduce il sorgente in un linguaggio intermedio (di solito interno al compilatore); nello stadio di &amp;#039;&amp;#039;back end&amp;#039;&amp;#039; avviene la generazione del codice oggetto.&lt;br /&gt;
&lt;br /&gt;
=== Stadio di &amp;#039;&amp;#039;front end&amp;#039;&amp;#039; ===&lt;br /&gt;
Questo stadio si suddivide in più fasi:&lt;br /&gt;
* [[Analisi lessicale]]: attraverso un [[analizzatore lessicale]], spesso chiamato &amp;#039;&amp;#039;scanner&amp;#039;&amp;#039; o &amp;#039;&amp;#039;lexer&amp;#039;&amp;#039;, il compilatore divide il codice sorgente in tanti pezzetti chiamati &amp;#039;&amp;#039;[[token (testo)|token]]&amp;#039;&amp;#039;. I token sono gli elementi minimi (non ulteriormente divisibili) di un linguaggio, ad esempio parole chiave (&amp;#039;&amp;#039;for&amp;#039;&amp;#039;, &amp;#039;&amp;#039;while&amp;#039;&amp;#039;), nomi di variabili (&amp;#039;&amp;#039;pippo&amp;#039;&amp;#039;), operatori (&amp;#039;&amp;#039;+&amp;#039;&amp;#039;, &amp;#039;&amp;#039;-&amp;#039;&amp;#039;, &amp;#039;&amp;#039;«&amp;#039;&amp;#039;).&lt;br /&gt;
* [[Analisi sintattica]]: l&amp;#039;analisi sintattica prende in ingresso la sequenza di token generata nella fase precedente ed esegue il controllo sintattico. Il controllo sintattico è effettuato attraverso una [[grammatica]]. Il risultato di questa fase è un [[albero di sintassi]].&lt;br /&gt;
* [[Analisi semantica]]: l&amp;#039;analisi semantica si occupa di controllare il significato delle istruzioni presenti nel codice in ingresso. Controlli tipici di questa fase sono il [[type checking]] (ovvero il controllo di tipo), controllare che gli identificatori siano stati dichiarati prima di essere usati e così via. Come supporto a questa fase viene creata una [[tabella dei simboli]] (&amp;#039;&amp;#039;symbol table&amp;#039;&amp;#039;) che contiene informazioni su tutti gli elementi simbolici incontrati quali nome, &amp;#039;&amp;#039;[[scope]]&amp;#039;&amp;#039;, tipo (se presente) etc. Il risultato di questa fase è l&amp;#039;[[albero sintattico astratto]] (AST).&lt;br /&gt;
* Generazione del codice intermedio: dall&amp;#039;albero di sintassi viene generato il codice intermedio.&lt;br /&gt;
&amp;lt;!-- da completare --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Stadio di &amp;#039;&amp;#039;back end&amp;#039;&amp;#039; ===&lt;br /&gt;
Anche lo stadio di &amp;#039;&amp;#039;back end&amp;#039;&amp;#039; si divide in più fasi:&lt;br /&gt;
* [[Compilatore con ottimizzatore|Ottimizzazione]] del codice intermedio.&lt;br /&gt;
* Generazione del codice target: in questa fase viene generato il codice nella forma del linguaggio target. Spesso il linguaggio target è un [[linguaggio macchina]].&lt;br /&gt;
&lt;br /&gt;
=== Schema riassuntivo ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto;clear:both;text-align:center;&amp;quot;&lt;br /&gt;
! Flusso !! Attività&lt;br /&gt;
|- &lt;br /&gt;
| [[Codice sorgente]] || Editing&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;[[Analizzatore lessicale]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Analisi lessicale]]&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| [[Token (testo)|Token]] || &lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;[[Analizzatore sintattico]]&amp;#039;&amp;#039;&amp;#039; || [[Analisi sintattica]]&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| [[Albero di sintassi]] || &lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;[[Analizzatore semantico]]&amp;#039;&amp;#039;&amp;#039; || [[Analisi semantica]]&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| [[Albero di sintassi astratta]]||&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Generatore di codice intermedio&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| codice intermedio || &lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;[[Compilatore con ottimizzatore|Ottimizzatore codice intermedio]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| codice intermedio || &lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Generatore codice target&amp;#039;&amp;#039;&amp;#039; || &lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;math&amp;gt;\Downarrow&amp;lt;/math&amp;gt; || &lt;br /&gt;
|- &lt;br /&gt;
| codice target || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
* Alfred V. Aho, Ravi Sethi, e Jeffrey D. Ullman, &amp;#039;&amp;#039;Compilatori. Principi, tecniche e strumenti&amp;#039;&amp;#039;, Milano, Pearson, 2006. ISBN 978-88-7192-559-2&lt;br /&gt;
&lt;br /&gt;
== Voci correlate ==&lt;br /&gt;
* [[Programma (informatica)]]&lt;br /&gt;
* [[Codice sorgente]]&lt;br /&gt;
* [[Copy propagation]]&lt;br /&gt;
* [[Cross-compilazione]]&lt;br /&gt;
* [[Linker]]&lt;br /&gt;
* [[Assembler]]&lt;br /&gt;
* [[.bss]]&lt;br /&gt;
* [[Parallelizzazione automatica]]&lt;br /&gt;
* [[Preprocessing]]&lt;br /&gt;
* [[Preprocessore]]&lt;br /&gt;
&lt;br /&gt;
== Altri progetti ==&lt;br /&gt;
{{interprogetto|wikt=compilatore|preposizione=sul}}&lt;br /&gt;
&lt;br /&gt;
== Collegamenti esterni ==&lt;br /&gt;
* {{Collegamenti esterni}}&lt;br /&gt;
* {{FOLDOC|compiler|compiler}}&lt;br /&gt;
* {{cita web|https://www.gnu.org/software/flex|Un generatore di analizzatori lessicali}}&lt;br /&gt;
* {{cita web|https://www.gnu.org/software/bison|Un generatore di analizzatori sintattici}}&lt;br /&gt;
&lt;br /&gt;
{{Controllo di autorità}}&lt;br /&gt;
{{Portale|informatica}}&lt;br /&gt;
&lt;br /&gt;
[[Categoria:Implementazione dei linguaggi di programmazione| ]]&lt;br /&gt;
[[Categoria:Teoria dei linguaggi formali]]&lt;/div&gt;</summary>
		<author><name>imported&gt;22denny91</name></author>
	</entry>
</feed>