Fabio AiolliPROGRAMMAZIONE Introduzione 1 PARTE 4 La Macchina Software.
-
Upload
naldo-mosca -
Category
Documents
-
view
219 -
download
1
Transcript of Fabio AiolliPROGRAMMAZIONE Introduzione 1 PARTE 4 La Macchina Software.
Fabio Aiolli PROGRAMMAZIONE Introduzione
1
PARTE 4
La Macchina Software
Fabio Aiolli PROGRAMMAZIONE Introduzione
2
Macchina Hardware e Macchina Software
macchinahardware
Agli albori dell'informatica, si programmava in binario, cioe` in linguaggio macchina, "scrivendo" i programmi direttamente nella RAM
sistema operativo
applicativi
Adesso ci sono vari livelli e ogni livello rappresenta il supporto alla programmazione per il livello sovrastante
Fabio Aiolli PROGRAMMAZIONE Introduzione
3
Istruzioni (funzionalita’) elementari
Programmi complessi
Istruzioni di alto livello
Fabio Aiolli PROGRAMMAZIONE Introduzione
4
macchina hardware
utente
macchina software
"traduce" per l'utente in linguaggio macchina
Fabio Aiolli PROGRAMMAZIONE Introduzione
5
Software• La CPU è in grado di interpretare ed eseguire
istruzioni elementari espresse nel proprio Linguaggio Macchina, quali "leggi il dato presente in una locazione di memoria", "somma due valori", "scrivi questo dato in una locazione di memoria“ e poco altro! I ‘mattoncini della LEGO’ ;-)
• Windows, Word ed Excel sono dei software (‘intere costruzioni della LEGO’)– Windows e` un sistema operativo– Word ed Excel sono delle applicazioni (o programmi
applicativi); esistono le versioni per Windows e per Mac
Fabio Aiolli PROGRAMMAZIONE Introduzione
6
La macchina software:
• facilita l'input/output
• permette la programmazione in linguaggi ad alto livello, come C/C++/Java
• rende disponibili programmi applicativi per compiere operazioni molto complicateTutto viene alla fine "eseguito" dalla
macchina hardware!
Sistemi Operativi
Sistema operativo: insieme di programmi (software di base) che gestiscono l’hardware
CPUMemoria RAMMemoria di massa (Hard Disk)Dispositivi di I/O
Software applicativo: insieme dei programmi scritti da sviluppatori o dall'utente
Vari SO
Fino agli anni 1980 molti SO (dedicati alle varie macchine)Successivamente convergenza su pochi SO anche portabili su architetture diverse:
DOS (Microsoft), non esiste piu'Unix (Sun e altri), portabileLinux (open source), portabileWindows (Microsoft)Mac OS (Apple)SO dedicati, per macchine mainframe (es. IBM AS400)
Fabio Aiolli PROGRAMMAZIONE Introduzione
9
SO mono/multitasking
• I primi SO erano monotasking: ovvero in grado di gestire l’esecuzione di un solo programma per volta
• Solo alla terminazione di un programma era possibile eseguire un altro programma
• MS-DOS era monotasking
• Tutti i SO moderni sono multitasking: Windows, Linux, Unix, MacOSX, BSD, ...
Fabio Aiolli PROGRAMMAZIONE Introduzione
10
Gestione della memoria RAM
• Una parte della RAM viene riservata per il SO
• I programmi per poter essere eseguiti devono essere caricati -- almeno in parte -- in RAM assieme ai loro dati. Di questo compito se ne occupa un programma del kernel del SO detto caricatore (loader)
• Sappiamo che ci possono essere piu' processi concorrenti, cioe' piu' programmi simultaneamente in esecuzione che si contendono la CPU e si suddicidono la RAM
• La RAM e' una risorsa finita e generalmente "scarsa", quindi vi sono dei limiti al caricamento in RAM dei programmi
Fabio Aiolli PROGRAMMAZIONE Introduzione
11
• Il gestore della memoria deve essere in grado di suddividere la RAM per assegnarne delle porzioni a ciascun programma
• I programmi in linguaggio macchina fanno riferimento a degli indirizzi logici o virtuali di memoria e non ad indirizzi assoluti (cioe' fisici)
• Il caricatore deve quindi rilocare i programmi, cioe' trasformare gli indirizzi logici in indirizzi fisici, cioe' indirizzi delle locazioni di memoria ove il programma viene effettivamente caricato in RAM
Fabio Aiolli PROGRAMMAZIONE Introduzione
12
Il gestore della memoria offre al programma la visione di una memoria virtuale, diversa da quella fisica: cio' rende in particolare possibile l'esecuzione di programmi che richiederebbero piu’ della memoria disponibile (tecnica dell’overlay)
Fabio Aiolli PROGRAMMAZIONE Introduzione
13
Registri
Cache
Memoria Principace (RAM)
Memoria Secondaria (di massa)
Gerarchia di Memoria
Fabio Aiolli PROGRAMMAZIONE Introduzione
14
Gestore della memoria secondaria
• Il gestore della memoria di massa e' denominato file system. Si occupa di:
– Fornire programmi per accedere e gestire i file
– Rendere trasparente (cioe` nascondere) la struttura fisica della memoria di massa (dell'hard disk)
– Ottimizzare l’occupazione della memoria di massa (dell'hard disk)
Fabio Aiolli PROGRAMMAZIONE Introduzione
15
File• Un file e' l'unità logica di informazione di un file system• Fisicamente:
– e' una sequenza di byte che contiene informazioni tipicamente "omogenee"
– Es.: programma, testo, immagine, …• Tutti i dati del file system sono organizzati in file• I file sono memorizzati nelle memorie di massa, tipicamente
l'hard disk• Per ogni file vengono memorizzate varie ulteriori informazioni
– identificatore: nomefile.estensione– data di creazione e ultima modifica– dimensione– posizione effettiva dei dati nella memoria di massa– diritti di accesso– etc
Fabio Aiolli PROGRAMMAZIONE Introduzione
16
Estensioni dei file• .exe : programma eseguibile• .txt : file di testo• .doc : file di Microsoft Word• .xls : file di Microsoft Excel• .jpg, .gif : file di immagini• .wav, .mp3 : file di suoni• .mpg, .avi : file di filmati• .c, .cpp, .java : file di programmi C, C++, Java
Fabio Aiolli PROGRAMMAZIONE Introduzione
17
Organizzazione dei file
• I file sono organizzati logicamente in modo gerarchico
• E' una organizzazione logica che non e' in relazione con la loro organizzazione fisica, cioe' la loro posizione fisica nella memoria di massa
• Directory: e' un insieme di file e altre directory
Fabio Aiolli PROGRAMMAZIONE Introduzione
18
Organizzazione ad albero• I dischi fissi possono essere divisi in partizioni• Una partizione e' organizzata gerarchicamente come
un albero rovesciato (come quello genealogico)• Nodi e collegamenti padre-figlio tra nodi • Nodo dell'albero: file o directory• Nodi divisi per livelli• Collegamenti tra nodi di livelli vicini: nodo sopra =
padre, nodo sotto = figlio• Ogni nodo ha un solo padre• Padre più in alto = radice• I nodi che sono file non hanno figli• Cammino assoluto o relativo (per file)
directory
file
Fabio Aiolli PROGRAMMAZIONE Introduzione
19
Indirizzo (o percorso) dei file in Windows
A
ED
CB
F
d e
a
b c
hgf
partizione ZDirectory corrente
Z:\A\c
Z:\a
Z:\A\C\D\ff
Z:\A\C\E\h..\E\h
Z:
Fabio Aiolli PROGRAMMAZIONE Introduzione
20
Indirizzo (o percorso) dei file in Unix/Linux
A
ED
CB
F
d e
a
b c
hgf
Directory corrente
/A/c
/a
/A/C/D/f./ff
/A/C/E/h../E/h
/
Fabio Aiolli PROGRAMMAZIONE Introduzione
21
Operazioni su file
• Creazione• Apertura• Chiusura• Cancellazione• Copia • Rinomina• Visualizzazione• Scrittura• Modifica• …
Fabio Aiolli PROGRAMMAZIONE Introduzione
22
PARTE 5
Il processo di programmazione
Fabio Aiolli PROGRAMMAZIONE Introduzione
23
Problemi e algoritmi
• La programmazione e' la disciplina che si occupa della risoluzione di problemi tramite programmi scritti in qualche linguaggio di programmazione
• Il problema e' una definizione sintetica di cio' che il programma deve realizzare dal punto di vista dell'utente
• La soluzione fornisce un'idea dell'approccio che deve essere seguito per risolvere il problema, tenendo anche in considerazione quale software gia' esistente potrebbe essere riutilizzato
• L'algoritmo e' una descrizione precisa e non ambigua di una sequenza di passi da seguire per risolvere un problema. L'algoritmo e' quindi un raffinamento della soluzione. Gli algoritmi possono essere espressi in molti modi
• Il programma e' una (possibile) descrizione dell'algoritmo espressa usando un particolare linguaggio di programmazione. Si intende che il programma debba essere completo ed eseguibile
• Per i banali problemi che vedremo, useremo direttamente il linguaggio C per descrivere gli algoritmi. Quindi, per noi, algoritmi=programmi
Fabio Aiolli PROGRAMMAZIONE Introduzione
24
Il processo di programmazione
• Il processo di programmazione comprende tutte le attivita' necessarie per sviluppare dei programmi in modo che siano memorizzati e preparati per l'esecuzione
• Per sviluppare programmi su un computer e' necessario un ambiente di sviluppo che almeno comprenda, oltre al sistema operativo, un editor ed un compilatore
Fabio Aiolli PROGRAMMAZIONE Introduzione
25
Editor e compilatori• Un programma e' un testo che consiste in una sequenza di
istruzioni scritte in un particolare linguaggio di programmazione. Tale "testo" viene creato e salvato come un file su disco tramite un editor.
• Una volta che e' stato scritto e memorizzato, il (testo del) programma viene dato in input al compilatore
• Il compilatore ha una duplice funzione:– Controlla la validita' del programma: segnala gli errori di
sintassi. Questi errori devono essere corretti tramite l'editor ed il programma corretto deve quindi essere nuovamente compilato
– Se il programma non contiene errori, il compilatore traduce il programma in linguaggio macchina
Fabio Aiolli PROGRAMMAZIONE Introduzione
26
Esecuzione dei programmi
• Il compilatore naturalmente non e' in grado di scoprire gli errori logici o di esecuzione (i ben noti bug) del programma: in tali casi, il programma risulta essere sintatticamente corretto ma non si comporta come ci si aspetta
• Il programma viene eseguito (o "fatto girare") attraverso un comando al sistema operativo che lo carica in memoria e quindi diventa un processo in esecuzione
• Gli errori logici possono essere prevenuti seguendo delle buone regole di programmazione
• Spesso gli errori logici si individuano mandando in esecuzione il programma ed osservandone il comportamento tramite degli insiemi di test affidabili
• Una volta rilevato e corretto un errore logico, si dovrebbero nuovamente eseguire i test sul suo comportamento, in quanto le presunte "correzioni" potrebbero aver introdotto nuovi errori
• Il processo di rilevazione e correzione degli errori logici di un programma viene chiamato debugging
Fabio Aiolli PROGRAMMAZIONE Introduzione
27
HelloWorld in C
#include<stdio.h>
main() { printf(“Hello World!\n”); }
Nome file: helloword.c
gcc helloword.c -o helloword.exe
Fabio Aiolli PROGRAMMAZIONE Introduzione
28
Token
I token sono unita’ sintattiche di base del C
– Parole chiave– Identificatori– Costanti– Costanti stringa– Operatori– Simboli di interpunzione
Fabio Aiolli PROGRAMMAZIONE Introduzione
29
Parole chiave (Keyword) del C
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
Fabio Aiolli PROGRAMMAZIONE Introduzione
30
La libreria standardInput e Output <stdio.h>
Test dei caratteri <ctype.h>
Funzioni su stringhe <string.h>
Funzioni Matematiche <math.h>
Funzioni Utilita’ <stdlib.h>
Funzioni Diagnostiche <assert.h>
Liste argiomenti variabile <stdarg.h>
Salti non locali <setjmp.h>
Segnali <signal.h>
Funzioni Date e Ore <time.h>
Limiti dei tipi di variabile <limits.h>
Fabio Aiolli PROGRAMMAZIONE Introduzione
31
Tipi di Dato
Un singolo byte char
Numero Intero int
Numero Intero corto short
Numero Intero lungo long int
Numero in virgola mobile (singola precisione)
float
Numero in virgola mobile (doppia precisione)
double
Numero in virgola mobile (precisione estesa)
long double
Interi con segno signed {char/int}
Interi senza segno unsigned {char/int}
Fabio Aiolli PROGRAMMAZIONE Introduzione
32
Sequenze di Escape
\a bell \\ backslash\b backspace \? punto interrogativo\f formfeed \' apice singolo\n a capo \” apice doppio\r ritorno carrello \ooo carattere ottale\t tabulazione orizzontale \xhh carattere esadecimale\v tabulazione verticale
Fabio Aiolli PROGRAMMAZIONE Introduzione
33
Dichiarazioni di variabilitipo nome_della_variabile [ =
inizializzazione];
Esempi:● int a;● int a = 2;● int a, b;● float f = 2.345;● char c = 'X';● char messaggio[] = “Questa e' una stringa”;
Facendo precedere il tipo dal qualificatore const, si ottiene una “variabile costante”, il cui valore non potrà essere cambiato
const double pi = 3,141592653;
Fabio Aiolli PROGRAMMAZIONE Introduzione
34
Operatori
Operatori● Aritmetici: +, -, *, /, %● Relazionali: >, >=, <, <=, ==, !=● Logici: &&, ||, !● Incremento e decremento: ++, --● bitwise: &, |, ^, <<, >>, ~● Assegnazione: =, +=, -=, *=, ecc.● Condizionale ternario: expr1 ? expr2 :
expr
Fabio Aiolli PROGRAMMAZIONE Introduzione
35
Conversioni di Tipo
Quando un'espressione coinvolge valori di tipo diverso, essi vengono convertiti ad un tipo comune:
• automaticamente ad un tipo “più grande”, che quindi non fa perdere informazione
• esplicitamente, mediante un operazione di cast. Obbligatoria se non e' possibile una conversione implicita automatica.
Fabio Aiolli PROGRAMMAZIONE Introduzione
36
If (else)
if (condizione) {/* blocco eseguito se lacondizione e' vera */
} else {/* blocco eseguito se lacondizione e' falsa */
}
Fabio Aiolli PROGRAMMAZIONE Introduzione
37
Operatori Logici
Expr1 Expr2Expr1 &&
Expr2Expr1 || Expr2
! Expr1
Zero Zero 0 0 1
Zero Non Zero 0 1 1
Non Zero Zero 0 1 0
Non Zero Non Zero 1 1 0
Fabio Aiolli PROGRAMMAZIONE Introduzione
38
Valutazione short-circuit
La valutazione degli operatori logici && e || avviene in maniera short-circuit, cioè da sinistra verso destra e si interrompe non appena il risultato diventa noto.
(a != 0) && (++i < 10)(a!=0) || (++i < 10)
Fabio Aiolli PROGRAMMAZIONE Introduzione
39
Switch Case
switch (espressione) {case espr-costante1: istruzioni1case espr-costante2: istruzioni2case espr-costante3: istruzioni3case espr-costante4: istruzioni4...default: istruzioni_default
}
Laboratorio I
Comandi principali di Linux (1)
• Sintassi: [comando] –[opzioni] [argomenti]• ls mostra il contenuto di una director
– l versione lunga– a mostra anche i files nascosti che iniziano con “.”– t presenta in ordine di modifica (dal piu’ recente al
meno recente)• man [comando] invoca il manuale con le infomazioni
sul comando– per scorrere le pagine del manuale freccia in giu’ e in su– per uscire dal manuale: q
Fabio Aiolli PROGRAMMAZIONE Introduzione
41
Comandi principali di Linux(2)
• mkdir x crea una nuova directory con nome x• rmdir x elimina la directory x
– solo se e’ vuota• cd x (change directory) mi porta all’interno della directory indicata
dal path x– esempio cd /d1/d3/ mi porta dentro d3 che e’ una sottodirectory
di d1– path puo’ essere
• relativo da dove mi trovo a dove voglio andare• assoluto dalla home a dove devo andare
– ./ indica la directory corrente (dove mi trovo)– ../ indica le directory che contiene la directory corrente– cd da solo mi porta sempre alla home
• emacs nomefile & invoca l’editor emacs aprendo un file chiamato nomefile
Fabio Aiolli PROGRAMMAZIONE Introduzione
42
Emacs
• Permette di scrivere dei testi e fornisce numerose funzionalita’ per la gestione dei testi
• Salvataggio• Ricerca di una parola • Rimpiazzamento di una parola• Cambiare i font• Visualizzazione della sintassi attraverso colori
– importante per programmare– funziona solo se il file ha l’estensione giusta – per i programmi in C l’estensione e’ .c
Fabio Aiolli PROGRAMMAZIONE Introduzione
43
Comandi principali di Linux(3)
• cp x y crea una copia del file x chiamata y• mv x y rinomina il file x chiamandolo y• pwd (print working directory) stampa il cammino
(path) dalla home alla directory in cui ci si trova• rm x elimina il file x• Alcune scorciatoie della shell
– tasti con freccie in su e in giu’ per scorrere la storia dei comandi precedentemente inseriti
– tasto tab per completare automaticamente comandi e nomi da inserire
Fabio Aiolli PROGRAMMAZIONE Introduzione
44
Esercizio 1
1. creare due directory, ad esempio d1 e d2
2. spostarsi dentro d13. creare il file dataoggi.txt dentro d14. scrivere la data di oggi nel file5. salvare il file dataoggi.txt6. copiare dataoggi.txt nella directory
d2 Fabio Aiolli PROGRAMMAZIONE
Introduzione45
Esercizio 2
• Creare dentro d2 una directory d3• Spostarsi in d3• Aprire con emacs il file mese.txt
dentro d3• Scrivere dentro il file il mese corrente• Salvare il file• Spostare il file mese.txt dentro d2• Eliminare d3Fabio Aiolli PROGRAMMAZIONE
Introduzione46
Il compilatore …in breve
• Il compilatore – input: progamma in C– output: programma il linguaggio macchina pronto per essere eseguito
• Fasi del compilatore1. Analisi lessicale e sintattica: vengono riconosciute le parole
chiave ei costrutti fondamentali del linguaggio2. Analisi semnatica: viene dato un significato alle istruzioni
del programma3. Assembly: viene generato il codice assembler4. Linking e loading: viene generato il codice in linguaggio
macchina, vengono creati i collegamenti necessari e vengono caricati i dati in memoria necessari
Fabio Aiolli PROGRAMMAZIONE Introduzione
47
Compilatore per C
• gcc comando che invoca il compilatore per programmi scritti in C
• gcc x.c –o y compila x.c e mette l’eseguibile nel file y
• gcc –E x.c si ferma dopo la fase di preprocessing
• gcc –S x.c si ferma dopo la fase dell’assemblaggio
• gcc –c x.c si ferma prima della fase del linking
Fabio Aiolli PROGRAMMAZIONE Introduzione
48
Cygwin
• Emulatore della shell di Linux per Windows• Per scaricarlo: www.studenti.math.unipd.it• cliccare su “Software di laboratorio”• poi su “ Contenuto del CD Software …”
• con Cygwin potete usare i comandi visti in classe e il compilatore gcc
• per scrivere I programmi potete usare l’editor che preferite
Fabio Aiolli PROGRAMMAZIONE Introduzione
49