Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Grammatica BNF dei numeri naturali:
G = (VT, VN, P, S) dove:
- VT = {0,1,2,3,4,5,6,7,8,9}
- VN = {<num>, <cifra>, <cifra-non-nulla>}
- S = <num>
- P = { <num> ::= <cifra> | <cifra-non-nulla> {<cifra>}
- <cifra> ::= 0 | <cifra-non-nulla>
- <cifra-non-nulla> ::= 1|2|3|4|5|6|7|8|9
Numeri Interi
È possibile descrivere in maniera sintattica anche l'insieme dei numeri interi:
- sintassi analoga a quella dei numeri naturali con la possibilità di un segno (+, -) davanti al numero naturale;
- stesse regole di produzione con l'aggiunta di una per gestire il segno;
- stesso alfabeto terminale con l'aggiunta dei due simboli "+" e "-".
Grammatica BNF dei numeri interi: G = (VT, VN, P, S) dove:
- VT = {0,1,2,3,4,5,6,7,8,9,+,-}
- VN = {<int>,<num>, <cifra>, <cifra-non-nulla>}
- S = <int>
- P = { <int> ::= + <num> | - <num>
- <num> ::= <cifra> | <cifra-non-nulla> {<cifra>}
<cifra-non-nulla> {<cifra>}50 <cifra> ::= 0 | <cifra-non-nulla> <cifra-non-nulla> ::= 1|2|3|4|5|6|7|8|9 Identificatori di variabili In quasi tutti i linguaggi di programmazione, gli identificatori di variabili possono essere composte da lettere e numeri ma non possono iniziare con un numero. Ipotizziamo di avere un linguaggio di programmazione che accetta solo identificatori di variabili composti da numeri e lettere maiuscole. Una possibile grammatica in BNF per descrivere questa situazione è: G = (VT, VN, P, S) dove: VT = {0,1,2,3,4,5,6,7,8,9,A,B,C,D,...Z} VN = {<id>,<lettera>, <cifra>} S = <id> P = { <id> ::= <lettera> { <lettera> | <cifra>} <lettera> ::= A | B | C | D | ... | Z <cifra> ::= 0|1|2|3|4|5|6|7|8|9 } Linguaggi di programmazione e processi di traduzione Linguaggio macchina Il linguaggio macchina o codice macchina è il linguaggio in cui sono scritti tutti i programmi
Il linguaggio macchina è un linguaggio di programmazione utilizzato per scrivere programmi eseguibili da un computer. È l'unico linguaggio che un computer può direttamente capire. Il linguaggio macchina è basato su un alfabeto binario che comprende due soli simboli, generalmente indicati con 0 e 1.
La CPU è quella componente hardware di un computer che è in grado di eseguire i programmi scritti in linguaggio macchina.
In linguaggio macchina sono definite l'insieme di istruzioni fondamentali che un processore è in grado di capire ed eseguire (l'insieme di queste istruzioni instruction set).
Compatibilità tra linguaggi macchina
Ogni modello di processore è in grado di comprendere un proprio particolare linguaggio macchina. Se un determinato processore P1 comprende esattamente il linguaggio di un altro processore P2, si dice che P1 è compatibile con P2.
I processori cosiddetti x86 sono chiamati in questo modo perché sono in grado di comprendere un linguaggio macchina inventato dalla Intel e in
seguito usato anche su processori AMD, VIA o Cyrix. Diversi processori compatibili non devono esserlo anche a livello hardware: i processori Intel e AMD x86 interpretano lo stesso linguaggio macchina anche se internamente sono molto diversi. Istruzioni in linguaggio macchinaNel linguaggio macchina, i simboli dell'alfabeto utilizzato (1 e 0) sono organizzati in parole che a loro volta costituiscono frasi. Le frasi del linguaggio macchina sono dette istruzioni elementari (ex prendi un dato in una cella di memoria e spostalo). Ognuna di esse ordina al processore di eseguire un'azione elementare afferente allo stato interno del computer, come la lettura di una locazione di memoria oppure il calcolo della somma dei valori contenuti in due registri.
Istruzioni in linguaggio macchinaLe frasi sono generalmente costituite da una parola iniziale detta codice operativo, che indica il tipo di azione da eseguire, seguita da altre parole che specificano gli eventuali parametri (o dati) a cui
l'azione deve essere applicata. I codici macchina si possono trascrivere, per comodità anche in notazione esadecimale ma questo generalmente non ne migliora la leggibilità. Ad esempio (codice macchina del processore Z80): Tipi di istruzione Sono solitamente presenti quattro tipi di istruzioni in linguaggio macchina: a. istruzioni di trasferimento tra memoria centrale e registri della CPU e viceversa; b. istruzioni aritmetiche: somma, differenza, moltiplicazione e divisione; c. istruzioni di input/output; d. istruzioni di confronto (confronta due numeri se uno è più grande dell'altro), salto (legge un'istruzione che si trova in un'altra locazione di memoria) e di stop (termina la compilazione). Svantaggi del linguaggio macchina Ci sono alcuni principali svantaggi nell'utilizzo diretto del linguaggio macchina da parte del programmatore: - il linguaggio macchina non è familiare per un essere umano ed è parecchio complesso.difficile da ricordare;- i programmi scritti in linguaggio macchina sono difficili da scrivere, capire e modificare;
- i programmi scritti in un particolare linguaggio macchina possono essere eseguiti solo sui processori compatibili con quel linguaggio;
- il programmatore deve occuparsi direttamente dell'interazione con i registri, con la memoria e i dispositivi di I/O e questo porta di solito a difficoltà ed inefficienze.
52 Linguaggio assembly
Il linguaggio assembly viene spesso confuso con il linguaggio macchina. È un linguaggio di programmazione a basso livello. I codici operativi e i dati nel linguaggio macchina sono stringhe di bit mentre l'assembly:
- utilizza al loro posto stringhe di caratteri dette istruzioni mnemoniche, che rendono più semplice al programmatore umano lo sviluppo e il debug di programmi;
- in particolare, esso utilizza:
- codici mnemonici per i
Codici operativi (parole inglesi); o nomi mnemonici (o identificatori) per gli indirizzi di memoria centrale (per accedere ai dati o nelle operazioni di salto) e per i registri. Il programma assembly risulta in questo modo relativamente più leggibile di quello in linguaggio macchina, con il quale mantiene però un totale (o quasi totale) isomorfismo, ovvero a ogni istruzione nel linguaggio macchina corrisponde un'istruzione nel linguaggio macchina. Esiste quindi un linguaggio assembly per ogni tipo di processore.
Esempio:
Supponiamo di voler eseguire l'operazione: 1+2+4
Un esempio di programma in linguaggio assembly che effettua questa operazione è il seguente:
MOV 1 R0
pone il numero 1 nel registro R0MOV 2 R1
pone il numero 2 nel registro R1ADD R0 R1
effettua la somma tra R0 e R1 e pone il risultato in R1MOV 4 R0
pone il numero 4 nel registro R0ADD R0 R1
effettua la somma tra R0 e R1 e pone il risultato in R1
Assembler:
Un programma scritto in linguaggio assembly
Non può essere eseguito direttamente dal calcolatore. Esso va tradotto. Il software che si comporta da traduttore tra linguaggio assembly e corrispondente linguaggio macchina è detto assembler (assemblatore). Il programma scritto in linguaggio macchina è detto solitamente codice oggetto, mentre il codice sorgente è quello che deve essere tradotto.
Considerazioni
Il linguaggio assembly consente al programmatore di ignorare il formato binario del linguaggio macchina e di ricordare più facilmente i codici operativi. Però valgono ancora alcune limitazioni:
- Anche i programmi scritti in un particolare linguaggio assembly possono essere eseguiti solo sui processori compatibili con quel linguaggio.
- Il programmatore deve ancora occuparsi direttamente dell'interazione con i registri, la memoria e i dispositivi di I/O.
Una conseguenza dal punto b. è che i programmi scritti in linguaggio assembly sono (come quelli in linguaggio
macchina ovviamente) molto lunghi e complessi proprio per la necessità di codificare tutte le istruzioni elementari necessarie ad eseguire un'operazione di alto livello (come ad esempio una semplice somma)
Servono dei linguaggi di programmazione di livello ancora più alto, ovvero che nascondano l'interazione con la memoria, con i registri ecc..!
Linguaggi di alto livello
"In informatica, un linguaggio di programmazione ad alto livello è un linguaggio di programmazione caratterizzato da una significativa astrazione dai dettagli del funzionamento di un calcolatore e dalle caratteristiche del linguaggio macchina." (Wikipedia, 2017)
I linguaggi di programmazione ad alto livello sono progettati per essere facilmente comprensibili dagli esseri umani. Ovvero nascondono i dettagli delle interazioni con i registri ecc...
Sono indipendenti dal calcolatore che andrà a eseguire il programma. Il calcolatore però il linguaggio formale non lo
Capisce quindi che c'è sempre bisogno di un processo di traduzione. Nonostante siano linguaggi formali, essi risultano più vicini al linguaggio naturale includendone anche alcuni elementi. I codici operativi sono espressi tramite parole (spesso dall'inglese) e simboli matematici.
Linguaggi di alto livello come astrazioni. I linguaggi di programmazione di alto livello forniscono allo sviluppatore l'illusione di trovarsi di fronte ad un calcolatore che, invece di comprendere unicamente il suo linguaggio macchina (come avviene effettivamente nella realtà), comprende ed è in grado di eseguire tale linguaggio di alto livello. Tale osservazione può essere formalmente esposta dichiarando che un linguaggio di programmazione di alto livello fornisce al programmatore una astrazione del calcolatore ovvero una macchina virtuale. Essa non è presente fisicamente perché è più complicata da costruire e da progettare.
È semplice il linguaggio che il calcolatore deve capire più la costruzione di esso e la sua manutenzione è semplice. Il continuo progresso nell'ambito dei linguaggi di programmazione di alto livello coincide con un continuo aumento del livello di astrazione fornito al programmatore. Macchine virtuali Volendo fare un passo in avanti nella formalizzazione teorica del concetto di macchina virtuale: - ipotizziamo di trovarci di fronte ad un calcolatore M0 che è in grado di capire ed eseguire il linguaggio di programmazione L0 (ovvero ipotizziamo che L0 sia il linguaggio macchina per il calcolatore M0); - ora ipotizziamo di trovarci di fronte ad un calcolatore M1 in grado di capire ed eseguire un linguaggio macchina L1; - infine ipotizziamo che L1 sia più semplice e vicino al linguaggio naturale per il programmatore. Se queste ipotesi sono vere, vale la seguente considerazione: - se la macchina M1 esistesse veramente, non ci sarebbe bisogno dellinguaggio L0 né della macchina M0 capace di eseguire solo programmi scritti in L0.