In informatica, un compilatore è un programma che traduce una serie di istruzioni scritte in un determinato linguaggio di programmazione (codice sorgente) in istruzioni di un altro linguaggio (codice oggetto). Questo processo di traduzione si chiama compilazione.
L’attività inversa, passare dal codice oggetto al codice sorgente è chiamata decompilazione ed è effettuata per mezzo di un decompilatore.
Se tutti i compilatori aderiscono esattamente alla specifica del linguaggio, lo stesso programma potrà essere compilato senza modifiche da ciascun compilatore, producendo risultati semanticamente uguali, ovvero programmi che producono lo stesso risultato se sottoposti agli stessi dati di ingresso. Nella realtà, molti compilatori implementano il linguaggio in modo incompleto, o aggiungono estensioni proprietarie, creando in effetti dei dialetti di ciascun linguaggio.
Per i linguaggi che adottano uno standard nella decorazione dei simboli, il codice oggetto generato da compilatori differenti può essere linkato assieme in un unico eseguibile.
Cenni storici
Negli anni 50 sono stati sviluppati diversi compilatori sperimentali (vedi ad esempio, i primi lavori di Grace Hopper sul linguaggio A-0), ma nel 1957 il team FORTRAN presso l’IBM, guidato da John Backus, fu accreditato come primo inventore di un compilatore completo.
Il COBOL fu uno dei primi linguaggi nel 1960 ad essere compilato su più architteture [1].
L’idea della compilazione prese velocemente piede e molti dei principi di design dei compilatori vennero sviluppati negli anni 60.
Un compilatore è esso stesso un programma scritto in un qualche linguaggio. I primi compilatori venivano scritti in Assembler. 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 MIT nel 1962 [2].
L’uso di linguaggio ad alto livello per scrivere i compilatori ebbe una spinta nei primi anni ‘70, quando i compilatori Pascal e C furono scritti negli stessi linguaggi. Creare un compilatore autocompilante introduce un problema di bootstrapping, il primo compilatore di quel linguaggio deve essere per forza scritto in un altro linguaggio o compilato facendo girare il compilatore come un interprete (come fecero Hart e Levin con il loro compilatore Lisp).
Schema di funzionamento
Il compilatore prende in ingresso un programma, il codice sorgente, su cui esegue una serie di operazioni in modo da ottenere, in assenza di 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.
I compilatori attuali dividono l’operazione di compilazione in due stadi principali il front end e il back end.
Nello stadio di front end il compilatore traduce il sorgente in un linguaggio intermedio (di solito interno al compilatore); nello stadio di back end avviene la generazione del codice oggetto.
Stadio di front end
Questo stadio si suddivide in più fasi:
- Analisi lessicale Attraverso un’analizzatore lessicale, spesso chiamato scanner o lexer, il compilatore divide il codice sorgente in tanti pezzetti chiamati token. I token sono gli elementi minimi (non ulteriormente divisibili) di un linguaggio, ad esempio parole chiave (for, while), nomi di variabili (pippo), operatori (+, -, <<).
- Analisi sintattica L’analisi sintattica prende in ingresso la sequenza di token generata nella fase precedente ed esegue il controllo sintattico. Il controllo sintattico è effettuato attraverso un grammatica. Il risultato di questa fase è un albero di sintassi.
- Analisi semantica L’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 cosi via. Come supporto a questa fase viene creata una tabella dei simboli (symbol table) che contiene informazioni su tutti gli elementi simbolici incontrati quali nome, scope, tipo (se presente) etc. Il risultato di questa fase è l’albero sintattico astratto (AST).
- Generazione del codice intermedio: Dall’albero di sintassi viene generato il codice intermedio.
Stadio di back end
Anche lo stadio di back end si divide in più fasi:
- Ottimizzazione del codice intermedio: in questa fase avvengono delle ottimizzazione sul codice intermedio.
- Generazione del codice target: in questa fase viene generato il codice nella forma del linguaggio target. Spesso il linguaggio target è un linguaggio macchina.
Schema riassuntivo
| Flusso |
Attività
|
| Codice sorgente |
Editing
|
| <math>\Downarrow</math> |
|
| Analizzatore lessicale
|
Analisi lessicale
|
| <math>\Downarrow</math> |
|
| Token |
|
| <math>\Downarrow</math> |
|
| Analizzatore sintattico |
Analisi sintattica
|
| <math>\Downarrow</math> |
|
| Albero di sintassi |
|
| <math>\Downarrow</math> |
|
| Analizzatore semantico |
Analisi semantica
|
| <math>\Downarrow</math> |
|
| Albero di sintassi astratta |
|
| <math>\Downarrow</math> |
|
| Generatore di codice intermedio
|
|
| <math>\Downarrow</math> |
|
| codice intermedio |
|
| <math>\Downarrow</math> |
|
| Ottimizzatore codice intermedio
|
|
| <math>\Downarrow</math> |
|
| codice intermedio |
|
| <math>\Downarrow</math> |
|
| Generatore codice target |
|
| <math>\Downarrow</math> |
|
| codice target |
|
Bibliografia
- di Alfred V. Aho, Ravi Sethi, e Jeffrey D. Ullman (ISBN 0201100886) è considerato il testo di riferimento sui principi della compilazione e sulle tecniche citate in precedenza. (Il libro è spesso chiamato Dragon Book (il libro del dragone) a causa dell’immagine della copertina che raffigura il Cavaliere della Programmazione che lotta con il Dragone del design dei compilatori.)
Collegamento esteso all’editore
Voci correlate
- Preprocessing
- Preprocessore
- Linker
Collegamenti esterni
- Un generatore di analizzatori lessicali
- Un generatore di analizzatori sintattici
Compilatori
Monday, December 31st, 2007
La volta a schifo è un tipo di copertura curva utilizzata in architettura. Può essere chiamata anche volta a specchio o a gavetta.
La tipica volta a schifo viene ottenuta sezionando una volta a padiglione con un piano orizzontale al di sopra del piano d’imposta (quello che divide i sostegni dalla volta vera e propria).
Per la sua caratteristica di avere un piano orizzontale, in genere, la volta a schifo non è portante, cioè non è in grado di sostenere un solaio. In questo caso si parla di falsa volta, che veniva spesso realizzata in camera a canne, oppure con tavelline poste di taglio e intonacate all’intradosso.
Altre volte, invece, ha una struttura portante in cui il solaio, costituito anche da tavole incrociate di legno, è sorretto dalle unghie della volta a padiglione sezionata.
La volta a schifo è stata spesso realizzata per fare da supporto ad affreschi e decorazioni, ma si trova anche nell’antica edilizia popolare, per esempio in Campania.
Esempi di strutture con volte a schifo
- Teatro Savoia, Campobasso
- Sagrestia della Chiesa di S. Maria della Mitria, Nave (BS), risalente al 1501
Posted in Uncategorized | No Comments »
Monday, December 31st, 2007
NACK è la contrazione di NOT ACK (negative acknoweldge character). È il pacchetto di controllo previsto dal protocollo TCP trasmesso dal ricevente al mittente per segnalare la mancata ricezione di uno o più pacchetti dati.
Questa sigla è anche usata nei forum e nelle chat per dire “non sono d’accordo”.
Posted in Uncategorized | No Comments »
Monday, December 31st, 2007
La velocità o frequenza di clock è la capacità di un’ unità di calcolo o di un microprocessore di eseguire una o più operazioni nell’unità di tempo di un minuto secondo, ed è espressa in cicli al secondo, o hertz e suoi multipli.
L’unità di calcolo del calcolatore Z1 (che utilizzava la tecnologia elettromeccanica, non elettronica) costruito dal tedesco Konrad Zuse nel 1938 andava da 0,3 cicli al secondo fino al massimo di 1 hertz. La velocità di clock del primo microprocessore moderno, l’Intel 4004 progettato dall’italiano Federico Faggin nel 1971, era di 740 khz. Le attuali CPU dei personal computer raggiungono e superano ormai i 3 Gigahertz, sono cioè in grado di eseguire più di 3 miliardi di operazioni al secondo. In queste moderne CPU la velocità di clock, essendo così elevata, deve essere regolata da un minuscolo oscillatore al quarzo inserito all’interno della stessa CPU, e regolabile tramite il BIOS.
Gli informatici esperti sono in grado di aumentare le prestazioni dei computers aumentando la velocità di clock nominale del processore, ma si tratta di un’operazione rischiosa che può portare al surriscaldamento della CPU.
Vi sono comunque alcuni processori di particolare efficienza e robustezza che sono in grado di supportare bene velocità di clock maggiori di quella nominale, senza subire danni. Nel gergo informatico questa operazione viene definita overclocking, ed è utilizzata anche dall’industria per testare l’affidabilità delle CPU prodotte.
Voci correlate
- Microprocessore
- CPU
- Clock
- Overcloccare
- Computer
- Konrad Zuse
Posted in Uncategorized | 1 Comment »
Monday, December 31st, 2007
Acronimi
- Data Carrier Equipment, Data Communications Equipment, Data Circuit-terminating Equipment - sinonimi per indicare dispositivi di trasmissione dati tipo modem
- Distributed Computing Environment - sistema software che utilizza il DCE/DFS (file system)
Posted in Uncategorized | No Comments »
Monday, December 31st, 2007
In informatica, l’espressione ciclo di fetch-execute si riferisce alla dinamica generale di funzionamento dei processori dei computer. In termini generali, un processore esegue iterativamente due operazioni: preleva (fetch) una istruzione dalla memoria, e la esegue (execute).
Funzionamento in dettaglio
Il registro chiamato Program Counter (PC) contiene l’indirizzo di memoria della prossima istruzione da eseguire. Per eseguire la “fetch” (caricamento) dell’istruzione, il processore copia tale indirizzo nel registro degli indirizzi e preleva l’istruzione dal bus dati del computer. L’istruzione prelevata viene depositata in un altro registro detto Current Instruction Register (CIR).
L’istruzione caricata viene quindi decodificata ed eseguita. L’esecuzione comporta l’invio di segnali di controllo a un certo numero di unità interne del computer, a seconda del significato dell’istruzione da eseguire.
Esempio in pseudocodice
I dettagli del funzionamento del ciclo dipendono, in genere, dal particolare processore e quindi dal particolare linguaggio macchina. Il seguente estratto di pseudocodice rappresenta, a titolo di esempio, un possibile algoritmo di funzionamento del ciclo di fetch-execute su un particolare computer. Nel testo si adotteranno le seguenti convenzioni:
-
AR sta per Address Register, registro degli indirizzi
-
DR sta per Data Register, registro dei dati
-
CIR sta per Current Instruction Register, registro dell’istruzione corrente
-
PC sta per Program Counter, contatore di programma
While (calcolatore è acceso)
{1. (*fase di fetch*)
a.AR = PC;
b.lettura parola di memoria con indirizzo in AR
- AR => bus indirizzi => memoria centrale
- comando L => bus controlli => memoria centrale
- esecuzione L => bus dati => parola memoria in DR
- OK esecuzione => bus controlli => CPU
c. CIR = DR
d. PC=PC + 1
2./*decodifica codice operativo*/
switch (CIR.Codice Operativo – primi 4 bit)
{/*esecuzione istruzione*/
3.case 0110(ADD):
a.AR = CIR.operando1 (bit 5<=>10)
b.Lettura parola di memoria con indirizzo in RI
(passi come nel fetch)
c.Registro A=
d.AR = CIR.operando2 (bit 11<=>16)
e.Lettura parola di memoria con indirizzo in RI
(passi come nel fetch)
f.Registro B = DR
g.Registro B = sommatore ALU (A, B)
h.AR => bus indirizzi => memoria centrale
i.DR = registro B
j.DR => bus dati =>memoria centrale
k.comando S => bus controlli => memoria centrale
l.esecuzione S
m.OK esecuzione => bus controlli => CPU
case 1001(BR): PC = CIR.operando
.........
}/*switch*/
}/*while*/
Voci correlate
- Ciclo del processore
- Architettura di un processore basato su registri generali
Posted in Uncategorized | No Comments »
Monday, December 31st, 2007
Christ The Album è un album della punk band inglese dei Crass, pubblicato nel 1982.
Il disco fu stampato in un box contenente 2 LP, il primo contenente materiale studio il secondo, chiamato “Well Forked - But Not Dead” contiene tracce live registrate nel Giugno del 1981 al 100 Club di Londra. l’Album contiene un book, A Series Of Shock Slogans and Mindless Token Tantrums, e un poster realizzato da Gee Vaucher.
Formazione
- Steve Ignorant - voce
- Joy De Vivre - voce
- Eve Libertine - voce
- Phil Free - chitarra
- N.A. Palmer - chitarra, voce
- Pete Wright - basso
- Penny Rimbaud - batteria, voce
- Paul Ellis - pianoforte
Lista tracce
Disco 1
- Have A Nice Day
- Smother Love
- Nineteen Eighty Bore
- I Know There Is Love
- Beg Your Pardon
- Birth Control ‘n’ Rock ‘n’ Roll
- Reality Whitewash
- It’s The Greatest Working Class Ripoff
- Deadhead
- You Can Be Who?
- Buy Now Pay As You Go
- Rival Tribal Revel Rebel (pt 2)
- Bumhooler
- Sentiment (White Feathers)
- Major General Despair
Disco 2 “Well Forked - But Not Dead”
- Banned From The Roxy
- The Sound Of One Hand
- Punk Is Dead
- Nagasaki Nightmare
- Darling
- Beta Motel Blues
- Berkertex Bribe
- Fold It In Half
- Big Hands
- Heart-throb Of The Mortuary
- Bumhooler
- Big A Little A
- First Woman
- Arlington 73
- Bomb plus Bomb tape
- Contaminational Power
- I Ain’t Thick
- G’s Song
- Securicor
- I Can’t Stand It
- Shaved Women
- A Part Of Life
- Do They Owe Us A Living
- So What
- Salt ‘n’ Pepper
- Sapere.it computer o calcolatore o elaboratore elettronico digitale La velocit
Posted in Uncategorized | No Comments »
Monday, December 31st, 2007
Mario Tchou fu un esperto di elettronica e tra gli sviluppatori dell’Olivetti.
Nato a Roma nel 1924, figlio di un diplomatico, ex ambasciatore della Cina imperiale presso il Vaticano, intraprese gli studi in Italia, laureandosi poi negli Stati Uniti al Polytechnic Brooklyn. All’età di 28 anni fu chiamato ad insegnare alla Columbia University di New York.
Data la sua conoscenza dell’elettronica, nel 1955 Adriano Olivetti lo portò in azienda, e gli diede l’incarico di formare un gruppo di lavoro che, in collaborazione con l’Università di Pisa, aveva l’obiettivo di progettare e costruire un calcolatore elettronico tutto italiano, su suggerimento di Enrico Fermi, utilizzando i 150 milioni già stanziati per un sincrotrone realizzato invece successivamente a Frascati.
Mario Tchou raccolse nel laboratorio di Barbaricina i migliori cervelli, tutti giovani, “perché le cose nuove si fanno solo con i giovani. Solo i giovani ci si buttano dentro con entusiasmo, e collaborano in armonia senza personalismi e senza gli ostacoli derivanti da una mentalità consuetudinaria.”
Il giovane ingegnere cercò personalmente di avvicinarsi a Ivrea, la sede storica dell’Olivetti, per abbattere il muro di diffidenza che gli impiegati del settore meccanico avevano nei confronti della neonata divisione elettronica. Purtroppo anche i tentativi di Tchou si dimostrarono vani: il settore meccanico e quello elettronico restarono divisi, come le rispettive sedi, l’una ad Ivrea, l’altra a Borgolombardo, dove si trasferì nel 1960 il gruppo di Barbaricina.
Mario Tchou morì in un incidente d’auto il 9 novembre 1961, a soli 37 anni.
Monday, December 31st, 2007
[[Immagine:RomanAbacusRecon.jpg|thumb|200px|Ricostruzione di un abaco di epoca romana realizzato dal museo RGZ a Magonza nel 1977]]
L’abaco è un antico strumento di calcolo, utilizzato come ausilio per effettuare operazioni matematiche.
Un abaco è costituito da una tavoletta con delle scanalature parallele, che convenzionalmente indicano le unità, le decine, le centinaia e così via. Ogni scanalatura contiene pietruzze o oggetti mobili con i quali vengono eseguiti i calcoli.
L’abaco fu in uso in Europa a partire dai periodi degli antichi greci e romani e fino al XVII secolo. Anche presso i popoli orientali (Cina, Giappone) erano in uso attrezzi simili; ancora nella seconda metà del XX secolo molti negozianti giapponesi utilizzavano un abaco per fare i conti. Nell’abaco giapponese la scanalatura è doppia: la parte inferiore contiene quattro oggetti e quella superiore uno solo, facendo sì che le operazioni ricordino in un certo senso quelle con i numeri romani.
Evoluzione dell’abaco è il pallottoliere, perfezionato dai romani che crearono così il primo calcolatore tascabile. Fu usato fino al Medioevo in tutta l’Europa e fino ai nostri giorni in alcune regioni dell’Oriente.
Posted in Uncategorized | No Comments »