1
Introduzione alla Programmazione
… prima qualche “richiamo” …
… algoritmo ….
… programma …
… linguaggio di programmazione
… esecutore …
… elaboratore …
… linguaggio macchina …
Linguaggio macchina
La CPU interpreta solo programmi in linguaggio macchina
… programmare in linguaggio macchina implica:
• conoscenza dell’architettura del calcolatore
• pianificazione dell’impiego della memoria
• uso di un numero notevole di istruzioni elementari, anche per semplici operazioni
…. attività di programmazione ardua e complessa …
… necessità di linguaggi più vicini a quello naturale …
… linguaggio naturale non usato perché ambiguo (non deterministico) …
3
Linguaggi simbolici
Linguaggi di programmazione più vicini al linguaggio naturale ma con una struttura che elimina ambiguità rendendoli più adatti alla definizione di un algoritmo
… rispetto al linguaggio macchina:
consentono di esprimere un programma sempre secondo rigide regole formali
ma con istruzioni più sintetiche e vicine alla logica del pensiero umano
Linguaggi simbolici
Diversi linguaggi di programmazione
…. alcuni dei più noti e diffusi:
FORTRAN ( FOR mula TRAN slator):
anno progettazione 1959, problemi tecnico-scientifici
• COBOL ( CO mmon B usiness-O riented L anguage):
1959, problemi amministrativi-gestionali
BASIC (Beginners All-purpose Symbolic Instruction Code) 1965, programmazione per i principianti
• Pascal (dal nome del matematico francese Blaise Pascal) : 1969, strumento didattico
5
Linguaggi simbolici
C (evoluzione del BCPL dal quale derivarono B e poi C)
1972, scrittura software di base (il S.O. UNIX è sviluppato in C) C++ (evoluzione di C)
1980, programmazione orientata agli oggetti (Object Oriented) JAVA
prima metà anni 1990, programmazione orientata agli oggetti, indipendenza dalla piattaforma
PROLOG ( PRO gramming in LOG ic)
1970, programmazione di tipo logico (non imperativa)
Linguaggi simbolici
Ciascun linguaggio di programmazione è caratterizzato da
• lessico
insieme delle parole che formano il linguaggio (vocabolario)
• sintassi
insieme delle regole per la formazione delle frasi (istruzioni)
• semantica
significato da associare ad ogni parola ed istruzione
… esistenza di standard ….
… esistenza di dialetti …
7
Dal programma sorgente al programma eseguibile
Traduttore
Collegatore/
Caricatore
00100101 10101010 00101001 10101010
--- --- --- ---
00100101 10101010 00101001 10101010
--- --- --- ---
Programma in linguaggio simbolico (Programma Sorgente)
Programma in linguaggio macchina (Programma Oggetto)
Moduli di Libreria
Programma eseguibile
... i programmi in linguaggio simbolico devono essere tradotti in programmi in linguaggio macchina ...
Dal programma sorgente al programma eseguibile
Traduttore: genera il programma oggetto mediante la traduzione del programma sorgente da linguaggio simbolico a linguaggio macchina
compilatore: la traduzione è effettuata una sola volta e tutta in una volta
inteprete: ciascuna istruzione viene tradotta ed eseguita, ogni volta che si vuole eseguire il programma
linguaggi compilati
FORTRAN, COBOL, PASCAL, C, C++, … linguaggi INTERPRETATI
BASIC, PROLOG, ...
9
Dal programma sorgente al programma eseguibile
collegatore: genera il programma eseguibile mediante il collegamento del programma oggetto a componenti di librerie caricatore: provvede a caricare il programma eseguibile in memoria per poterne effettuare l’esecuzione
il programma sorgente è, tipicamente, generato con un text editor
Struttura di un programma
Un programma è tipicamente strutturato nel seguente modo:
Intestazione
Sezione dichiarativa
Corpo del programma
Intestazione: nome del programma
Sezione dichiarativa: riporta tutte le informazioni, nomi e relativi tipi, che saranno usate nel programma
Corpo del programma: sequenza di istruzioni formanti il programma
11
Struttura di un programma
… con riferimento ad un ipotetico linguaggio generalizzato ...
Program <nome programma>;
sezione dichiarativa
<nomi_variabili: tipo>
begin
<corpo del programma>
end.
Tipi di informazione
• Tipi semplici (atomici)
l’informazione non può essere ulteriormente decomposta Es:
numero intero carattere alfabetico
• Tipi strutturati
l’informazione può essere decomposta in tipi più semplici Es:
data (composta da: giorno, mese, anno)
numero complesso (parte reale, coefficiente immaginario) generalità anagrafiche (cognome, nome, data nascita, indirizzo)
13
Tipi strutturati
Numero Complesso
Parte reale coefficiente immaginario
(3.2 , 5.4)
3.2 5.4
Data di nascita
giorno mese anno
16/11/1978
16 11 1978
Struttura
Esemplare
Tipi semplici
• Un tipo è definito tramite
• enumerazione
• proprietà caratteristiche
• operazioni
i vari linguaggi di programmazione hanno tipi predefiniti (primitivi)
15
Il tipo Intero
tipo intero = {i | i è un numero intero, m< i < M}
non coincide con l’insieme dei numeri interi: m≠−∞ , Μ≠+∞
m ed M variano col linguaggio di programmazione Esempi di m e M:
-32768 (-2 15), +32767 (+2 15-1) tipo intero short
-2147483648 (-2 31), +2147483647 (+2 31-1) tipo intero long
Il tipo Intero
Operazioni:
+ somma − sottrazione
* moltiplicazione / divisione
% modulo
Sono operazioni interne al tipo cioè il risultato assume ancora un valore di tipo intero
L'operatore % denota il resto della divisione intera.
Esempio:
supposto che n1 = 12 e n2 = 10 n1 % n2 = 2
La divisione intera ha come risultato un intero: n1 / n2 = 1
17
Il tipo Intero
Per le operazioni aritmetiche le precedenze sono quelle definite in matematica:
le operazioni *, /, e % hanno precedenza sulle operazioni + e −
L’uso delle parentesi può cambiare l’ordine di valutazione Attenzione:
proprietà valide per i numeri interi non lo sono (sempre) per i tipi interi
Esempio:
l’uguaglianza tra le due espressioni A+ (B - C) e (A+B) - C è vera per i numeri interi, ma non è (sempre) vera per i tipi interi se il tipo intero è [-10, 10], A=8, B=7, C=6 in questo caso il primo termine vale 9, il secondo è indefinito
…. OVERFLOW ...
Il tipo Intero
Il tipo intero è un tipo ordinato, ovvero tra i suoi elementi esiste una relazione d’ordine (dato un suo elemento è possibile stabilirne il predecessore ed il successore)
Su un tipo ordinato sono definiti gli operatori di relazione:
= uguale <> diverso
< minore > maggiore
<= minore uguale >= maggiore uguale
Le operazioni di confronto tra elementi del tipo intero, ottenute usando gli operatori di relazioni, restituiscono un risultato esterno al tipo
19
Il tipo Reale
tipo reale =
{un sottoinsieme finito dell’intervallo di numeri reali [m, M], tale che detto rs un qualsiasi numero reale con m <= rs <= M, esiste un valore r del tipo che lo approssima con precisione assegnata
Abs[(rs-r)/r]<eps}
…. Ogni valore del tipo reale rappresenta tutti i componenti di un intervallo di numeri reali …
• è un tipo primitivo
• è un tipo ordinato
• m, M, eps variano col linguaggio e col processore
cardinalità del tipo e precisione sono fortemente variabili (… numero di bit e rappresentazione interna ...)
Il tipo Reale
in quasi tutti i linguaggi vengono messi a disposizione due tipi reali:
tipo reale semplice (float in C++)
tipo reale doppia precisione (double in C++)
cardinalità e precisione del secondo sono maggiori di quelle del primo
le operazioni base del tipo reale sono gli operatori aritmetici interne al tipo: +, −, *, /
… naturalmente definite a meno di overflow … operazioni di confronto, esterne al tipo
21
Il tipo Carattere
• Il tipo carattere contiene l’insieme dei simboli con cui un
elaboratore comunica verso il mondo esterno attraverso i dispositivi di input/output
• E’ l’insieme dei caratteri riproducibili su unità di ingresso ed uscita (ad esempio la tastiera)
• prevale come tipo primitivo dei linguaggi l’insieme dei caratteri occidentali
• è possibile considerarlo come l’unione di quattro “sotto-tipi”
Lettere Minuscole, Lettere Maiuscole, Cifre Decimali, Caratteri di Interpunzione e Speciali
Il tipo Carattere
Ordinamento:
• concettualmente, è un insieme parzialmente ordinato (non ha senso definire un ordine tra cifre e lettere), ma per motivi pratici si è imposto un ordine
a<b<c<...<z A<B<C<....<Z 0<1<2<...<9
• non esiste ordinamento sugli altri caratteri
! “ £ $ % & / ( ) = ? ^ * ° § ç ; : _ , . - > < @ #
• stabilito un ordinamento totale sulla base codice ASCII
23
Il tipo enumerativo
• Il tipo è definito enumerando gli elementi che lo compongono
… più corretto dire che si tratta di un costruttore di tipi di utente ...
• in particolare si possono definire tipi di utente semplici ed ordinali
• l’utente definisce il NOME del tipo che intende introdurre ed
“enumera” in ordine crescente i valori (costanti) del tipo
• è possibile applicare gli operatori relazionali a variabili e costanti di un tipo enumerativo (operazioni esterne al tipo)
• Es:
colore_semaforo {ROSSO, GIALLO, VERDE};
corso_univ {FIS, INF, MAT, ECO};
seme_carta {coppe, denari, bastoni, spade};
Il tipo Logico (Boolean)
L'insieme del tipo booleano è costituito dai due valori di verità, true (vero) e false (falso):
Tipo booleano = (false, true) E’ un tipo ordinato: false < true
Operazioni = {OR, AND, NOT), operazioni interne al tipo OR: disgiunzione logica o somma logica
risultato vero se almeno un operando è vero AND: congiunzione o prodotto logico
risultato vero se tutti gli operandi sono pari a vero NOT: negazione logica (operazione unaria)
risultato vero se l’operando è falso (e viceversa)