PROGRAMMAZIONE Introduzione PARTE 4 La Macchina Software Fabio Aiolli PROGRAMMAZIONE Introduzione
Macchina Hardware e Macchina Software Agli albori dell'informatica, si programmava in binario, cioe` in linguaggio macchina, "scrivendo" i programmi direttamente nella RAM applicativi sistema operativo macchina hardware Adesso ci sono vari livelli e ogni livello rappresenta il supporto alla programmazione per il livello sovrastante Fabio Aiolli PROGRAMMAZIONE Introduzione
PROGRAMMAZIONE Introduzione Programmi complessi Istruzioni di alto livello Istruzioni (funzionalita’) elementari Fabio Aiolli PROGRAMMAZIONE Introduzione
PROGRAMMAZIONE Introduzione "traduce" per l'utente in linguaggio macchina macchina software macchina hardware utente Fabio Aiolli PROGRAMMAZIONE Introduzione
PROGRAMMAZIONE Introduzione 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
Tutto viene alla fine "eseguito" dalla macchina hardware! 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 complicate Tutto viene alla fine "eseguito" dalla macchina hardware! Fabio Aiolli PROGRAMMAZIONE Introduzione
Sistemi Operativi Sistema operativo: insieme di programmi (software di base) che gestiscono l’hardware CPU Memoria RAM Memoria 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), portabile Linux (open source), portabile Windows (Microsoft) Mac OS (Apple) SO dedicati, per macchine mainframe (es. IBM AS400)
PROGRAMMAZIONE Introduzione 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
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
PROGRAMMAZIONE Introduzione 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
PROGRAMMAZIONE Introduzione 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
Gerarchia di Memoria Registri Cache Memoria Principace (RAM) Memoria Secondaria (di massa) Fabio Aiolli PROGRAMMAZIONE Introduzione
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
PROGRAMMAZIONE Introduzione 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
PROGRAMMAZIONE Introduzione 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
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
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 Fabio Aiolli PROGRAMMAZIONE Introduzione file
Indirizzo (o percorso) dei file in Windows partizione Z Directory corrente A a Z:\a c Z:\A\c b B C Z:\A\C\D\f f d e D E F f g h Z:\A\C\E\h ..\E\h Fabio Aiolli PROGRAMMAZIONE Introduzione
Indirizzo (o percorso) dei file in Unix/Linux Directory corrente a A /a /A/c b B c C /A/C/D/f ./f f d e D E F f g h /A/C/E/h ../E/h Fabio Aiolli PROGRAMMAZIONE Introduzione
PROGRAMMAZIONE Introduzione Operazioni su file Creazione Apertura Chiusura Cancellazione Copia Rinomina Visualizzazione Scrittura Modifica … Fabio Aiolli PROGRAMMAZIONE Introduzione
Il processo di programmazione PARTE 5 Il processo di programmazione Fabio Aiolli PROGRAMMAZIONE Introduzione
PROGRAMMAZIONE Introduzione 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
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
PROGRAMMAZIONE Introduzione 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
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
PROGRAMMAZIONE Introduzione HelloWorld in C Nome file: helloword.c #include<stdio.h> main() { printf(“Hello World!\n”); } gcc helloword.c -o helloword.exe Fabio Aiolli PROGRAMMAZIONE Introduzione
PROGRAMMAZIONE Introduzione Token I token sono unita’ sintattiche di base del C Parole chiave Identificatori Costanti Costanti stringa Operatori Simboli di interpunzione Fabio Aiolli PROGRAMMAZIONE Introduzione
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
PROGRAMMAZIONE Introduzione La libreria standard Input 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
PROGRAMMAZIONE Introduzione 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
PROGRAMMAZIONE Introduzione 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
PROGRAMMAZIONE Introduzione Dichiarazioni di variabili tipo 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
PROGRAMMAZIONE Introduzione Operatori Operatori ● Aritmetici: +, -, *, /, % ● Relazionali: >, >=, <, <=, ==, != ● Logici: &&, ||, ! ● Incremento e decremento: ++, -- ● bitwise: &, |, ^, <<, >>, ~ ● Assegnazione: =, +=, -=, *=, ecc. ● Condizionale ternario: expr1 ? expr2 : expr Fabio Aiolli PROGRAMMAZIONE Introduzione
PROGRAMMAZIONE Introduzione 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
PROGRAMMAZIONE Introduzione If (else) if (condizione) { /* blocco eseguito se la condizione e' vera */ } else { condizione e' falsa */ } Fabio Aiolli PROGRAMMAZIONE Introduzione
PROGRAMMAZIONE Introduzione Operatori Logici Expr1 Expr2 Expr1 && Expr2 Expr1 || Expr2 ! Expr1 Zero 1 Non Zero Fabio Aiolli PROGRAMMAZIONE Introduzione
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
PROGRAMMAZIONE Introduzione Switch Case switch (espressione) { case espr-costante1: istruzioni1 case espr-costante2: istruzioni2 case espr-costante3: istruzioni3 case espr-costante4: istruzioni4 ... default: istruzioni_default } Fabio Aiolli PROGRAMMAZIONE Introduzione
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
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
PROGRAMMAZIONE Introduzione 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
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
PROGRAMMAZIONE Introduzione Esercizio 1 creare due directory, ad esempio d1 e d2 spostarsi dentro d1 creare il file dataoggi.txt dentro d1 scrivere la data di oggi nel file salvare il file dataoggi.txt copiare dataoggi.txt nella directory d2 Fabio Aiolli PROGRAMMAZIONE Introduzione
PROGRAMMAZIONE Introduzione 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 d3 Fabio Aiolli PROGRAMMAZIONE Introduzione
Il compilatore …in breve input: progamma in C output: programma il linguaggio macchina pronto per essere eseguito Fasi del compilatore Analisi lessicale e sintattica: vengono riconosciute le parole chiave ei costrutti fondamentali del linguaggio Analisi semnatica: viene dato un significato alle istruzioni del programma Assembly: viene generato il codice assembler 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
PROGRAMMAZIONE Introduzione 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
PROGRAMMAZIONE Introduzione 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