corso progettazione
DESCRIPTION
TRANSCRIPT
Progettazione del software
Giuseppe Dell'Abate
Produzione del software
il programmatore ascolta le esigenze del cliente
il programmatore scrive il codice che soddisferà le varie esigenze
questo approccio è valido se...
Il problema è molto semplice Il cliente formuli il problema in modo chiaro Il programmatore capisca esattamente
cosa il cliente si aspetta Il programmatore lavora senza la
collaborazione di altri colleghi
ma è inadatto quando...
le esigenze dei clienti sono aumentate la complessità del problema è aumentata un unico programmatore non era
sufficiente per la completa produzione del software
...ed ecco cosa succede.
Progettazione
Una indagine della Standish Group, basata su un campione di 28.000 progetti e pubblicata da Computer Weekly il 9 luglio 1998, fornisce questi risultati... 26% progetti riusciti 46% progetti chiusi con notevole ritardo sui
tempi e/o costi imprevisti e/o funzionalità inadeguate
28% progetti falliti
Triangolo di successo
Al fine di ottenere i risultati sperati si è individuato il così detto “triangolo di successo”
1. Stakeholder: persone che hanno un ruolo nel progetto software
2. Processi: insieme di attività e procedure organizzative
3. Modellazione: linguaggio per costruire modelli da discutere con i clienti e gli sviluppatori
stakeholder
modellazioneprocessi
1-Stakeholder
Qualunque persona che influenza lo sviluppo del software Clienti: utilizzatori o proprietari del sistema Sviluppatori: analisti, progettisti, programmatori
ecc
Cause di fallimento legate al cliente
Le necessità dei clienti sono mal comprese o comprese insufficientemente
I requisiti dei clienti cambiano troppo frequentemente
I clienti non forniscono sufficienti risorse ai progetti
I clienti non vogliono cooperare con il team di sviluppo
I clienti hanno attese non realistiche Il sistema non porta più benefici ai clienti
Cause di fallimento legate allo sviluppo
Gli sviluppatori (analisti, progettisti, programmatori ecc) possono: Non essere all'altezza delle attività Non vengono adeguatamente motivati
(economicamente e personalmente) Non vengono seguite le loro necessità di
formazione
Quindi cosa possiamo fare ?
Assumere gli sviluppatori migliori Fornire agli sviluppatori una formazione
continua Incoraggiare lo scambio di conoscenze tra gli
sviluppatori al fine del sostegno reciproco Motivare gli sviluppatori rimuovendo gli
ostacoli e incanalando i loro sforzi in attività produttive
Offrire un ambiente di lavoro stimolante Allineare gli obiettivi delle persone con quelli
dell'organizzazione Enfatizzare il lavoro di gruppo
2-Processo
Stabilire un processo di sviluppo del software che definisca le attività e le procedure organizzative per incrementare la collaborazione nel gruppo di sviluppo.
Stabilire un modello di processo che preveda: Un ordine di esecuzione delle attività Quando e quali elaborati dello sviluppo fornire Le attività ed assegnare i compiti I criteri per monitorare il progresso del
processo per misurare i risultati
Migliorare il processo
Occorre definire un modello da utilizzare per cercare di migliorare il processo di sviluppo software.
Modelli utilizzati: CMM - Capability Maturity Model ISO 9000 - International Organization for
Standardization
Capability Maturity Model
Definito dal Software Engineering Institute (SEI) presso la Carnegie Mellon University di Pittsburgh, USA, largamente usato in America dalle industrie IT
E' un modello per la valutazione del livello di maturità delle capacità aziendali.
E' realizzando partendo da un questionario che permette di assegnare uno dei cinque livelli del modello
La scala verso l'eccellenza del software
Sono individuati 5 livelli di maturità:
1) Iniziale situazione caotica, processi non predicibili e non
disciplinati, dipendenti dal personale attualmente presente
1) Ripetibile gestione del processo ripetibile, possibilità di
prevedere tempi e costi per progetti simili
1) Definito uso di metodi e strumenti per sviluppo e gestione
del processo, i processi di gestione e ingegnerizzazione sono specificati e seguiti
La scala verso l'eccellenza del software
4) Gestito possibilità di valutazione del processo. Sono
introdotte delle metriche per la valutazione e l controllo del processo
5) Ottimizzato miglioramento continuo del processo. E'
resa fattibile l'evoluzione permanente del processo
Sono necessari anni per progredire di un livello nella scala della maturità
Domande di esempio del questionario
E' presente un processo formale per la verifica del software?
E' presente una procedura formale per determinare le tempistiche di sviluppo del software?
Esistono procedure formali per stimare il costo di sviluppo del software?
Sono raccolte le statistiche sugli errori nel codice e sui test?
E' presente un meccanismo per controllare le modifiche dei requisiti del software?
ISO 9000
Le norme della famiglia ISO 9000 danno indicazioni su come una azienda deve operare per poter fornire un prodotto o un servizio di qualità, cioé rispondente a quanto richiesto dal cliente.
La certificazione secondo questa famiglia di norme é una certificazione di sistema e NON di prodotto, cioé non viene certificato il bene o il servizio, ma il sistema di gestione dell'azienda.
ISO 9000
Questa famiglia di norme fornisce indicazioni organizzative, per questo si adatta a diversi settori di attività
Con questa certificazione il cliente ha una certa sicurezza che l'azienda certificata fornirà quanto richiesto.
La certificazione é fondamentalmente un esame a cui l'azienda si sottopone per poter avere una dichiarazione rilasciata da parte di un ente terzo specializzato, questo ente si chiama Organismo di Certificazione.
Il certificato che viene rilasciato é la dichiarazione che l'azienda adotta un sistema di regole, responsabilità, controlli, ecc... conforme alla famiglia di norme ISO 9000.
Solo gli Organismi accreditati presso un Ente di Accreditamento riconosciuto possono rilasciare certificati di conformità alla ISO 9000.
ISO 9000
Modellazione
Gli sviluppatori hanno bisogno di un linguaggio per costruire modelli da discutere con i clienti
Il modello deve prevedere vari livelli di astrazione in modo da presentare le soluzioni a vari livelli di dettaglio
Gli sviluppatori hanno bisogno di strumenti CASE (Computer-Assisted Software Engineering) per memorizzare i modelli, visualizzarli e manipolarli
Il CASE prevede la creazione di uno scheletro del codice che deve essere implementato dagli sviluppatori
Qualità di un modello
Accuratezza: deve descrivere il sistema correttamente,
completamente e senza ambiguità; Consistenza:
le diverse viste devono completarsi vicendevolmente per formare un insieme coerente
Semplicità: deve poter essere compreso, senza troppi
problemi, da persone estranee al processo di modellazione;
Manutenibilità: la variazione dello stesso deve essere la più
semplice possibile.
Pianificazione di sistema
Pianificazione di sistema
Al fine del raggiungimento dell’obiettivo di business, occorre pianificare il sistema.
Pianificare significa: identificare, classificare, selezionare, sviluppare e migliorare un progetto.
Le piccole organizzazione hanno un obiettivo di business influenzato dal mercato che impone continue modifiche
Le grandi organizzazioni sono obbligate a fissare degli obiettivi di business e si ritrovano ad influenzare il mercato che ha una durata di lungo periodo.
Pianificazione di sistema
La pianificazione può essere fatta utilizzando vari approcci: SWOT : Strengths, Weaknesses, Opportunities,
Threads VCM : Value Chain Model BPR : Business Process Reenginering ISA : Information System Architecture
Fare le cose in modo efficace e non necessariamente in modo efficiente
Approccio SWOT
Modello top-down (Albert Humphrey 1965) Definire i punti di forza e di debolezza
interna dell’azienda Definizione delle opportunità del mercato e dei
suoi pericoli Definire la “mission aziendale” ossia la
ragion d’essere. Es.: Microsoft “consentire a persone e
organizzazioni di tutto il mondo di realizzare il proprio potenziale”
Approccio SWOT
Definire la “vision aziendale” ossia lo scenario futuro che rispecchia gli ideali, i valori e le aspirazioni Es.: Microsoft “Un personal computer su ogni
scrivania, e ogni computer con un software Microsoft installato”
Approccio VCM Analizzare l’intero sequenza delle
attività al fine di individuare gli anelli forti e deboli dell’organizzazione (Porter 1985)
Attività primarie, creano o aggiungono valore al prodotto finale: Logistica in ingresso Operazioni Logistica in uscita Vendita e marketing Servizi
Attività secondarie, non aggiungono valore ma sono necessarie Amministrazione e infrastruttura Gestione delle risorse umane Ricerca e sviluppo
Approccio VCM
Approccio BPR
Per adattarsi velocemente alla variazione del mercato occorre modificare l’organizzazione aziendale (Hammer e Champy 1993).
Bisogna passare: da una organizzazione “verticale” basata su
funzioni, gerarchie, prodotti e servizi ad una organizzazione “orizzontale” basata sui
processi di business Occorre definire:
un responsabile di processo un workflow per implementazione e controllo
Approccio ISA
Modello bottom-up (Zachman 1987) Schema architetturale neutrale che
permette di descrivere l’intero sistema E’ rappresentato attraverso una griglia
composta da prospettive descrizioni
Approccio ISA
Le prospettive sono costituite dagli attori di un Sistema Informativo Pianificatore: definisce lo scopo Responsabile: definisce il modello concettuale Progettista: definisce il modello fisico Programmatore: definisce la soluzione Sottocontraente: fornisce i componenti
Descrizioni, servono per definire le caratteristiche del sistema: Composizione dei dati Descrivere i processi di business I componenti del processi dove si posiziona Chi usa i componenti In che modo vengono usati
Approccio ISA
Metodologia di sviluppo
Metodologia di sviluppo
La metodologia serve per specificare: quale linguaggio utilizzare per descrivere il
lavoro progettuale quali sono i passi necessari per raggiungerlo.
Tipi di Metodologie pesante: waterfall iterativa: spirale leggera: extreme programming
Waterfall - “A cascata”
Big Design Up Front (BDUF)
Suddivisione del progetto in grosse fasi: Studio di fattibilità Analisi dei requisiti Progettazione Sviluppo Test/Collaudo Delivery Maintenance
Studio di fattibilità
Valuta la convenienza dell'applicazione costi/benefici ( risorse richieste, costi, tempi )
Punti salienti: Definizione del contesto e del problema Soluzioni, alternative e relativi vantaggi Offerta al Cliente
Analisi dei requisiti Definizione dei dettagli (funzionali e non )
della specifica sulla base dello studio di fattibilità
Problemi: Assenza di linguaggio comune tra gli attori
(ambigui, incompleti) Requisiti spesso poco chiari
Progettazione
Definire l’architettura del sistema Strutturato in componenti: sottosistemi e moduli Descrive le relazioni fra componenti, e cosa fa
ciascuno, non come la fa Problemi:
Si devono prendere molte decisioni Non tutte le strutture sono uguali Una cattiva architettura per un palazzo non puo’
essere compensato da una buona costruzione
Sviluppo Implementare i moduli
Problemi: tempi, costi e competenze degli
sviluppatori
Unit testing Module testing Sub-system testing System testing Acceptance testing = alfa-testing beta-testing
Testing
Maintenance
Manutenzione 60% dei costi di sviluppo
Possiamo distinguerla in 3 tipologie: Correttiva: rimuovere errori (20%) Adattiva: adattare l’applicazione a cambi
nell’ambiente in cui il sistema ‘gira’ (20%) Perfettiva: migliorare, cambiare, aggiungere
qualita’ o funzioni (60%)
Requisiti
Requisiti Definizione degli obiettivi Linearita del processo Rigidita degli stadi
Pregi e Difetti Pregi
Controllo dello stadio di lavorazione (SAL) Problematiche specifiche x singole fasi Fasi indipendenti ed autonome
Difetti Formalismo documentale Flussi di ritorno non gestibili (es: modifica
requisiti) Mancanza di interazione
Spirale
Scomposizione: la complessita' viene
risolta procedendo per piccoli passi.
Incrementalità: I cambiamenti possono
essere integrati senza impatti.
Il progetto viene diviso per sottoinsiemi di funzionalità che vengono incrementati per periodo temporali.
Spirale
Parzialità: un uso parziale del software e non aspettare la
fine.
Iteratività: Possibile avere feed-back dal client e fare
integrazioni.
Parallelità: L'attivita' puo' essere svolta da gruppi diversi
su sottosistemi diversi .
Requisiti – Pregi - Difetti
Requisiti Elasticità di tempi e costi
Pregi Linearità ciclica Comunicazione interna Ridotto formalismo documentale
Difetti: Effetto farfalla: fare continui test di regressione
e refactoring Tempi impredicibili
Metodi Agili
Metodi agili: Extreme Programming (Kent Beck, Ward
Cunningham e Ron Jeffries) Scrum Feature Driven Development (FDD) Crystal DSDM (Dynamic Systems Development
Method) Orientati:
alle persone e alle loro qualita' ai fattori sociali e relazionali sono poco cerimoniosi (documentazione,
blueprint)
I 4 requisiti
1) Comunicazionetutti possono parlare con tutti, persino l'ultimo
dei programmatori con il cliente
1) Semplicitàgli analisti mantengano la descrizione formale
il più semplice e chiara possibile
1) Feedbacksin dal primo giorno si testa il codice
1) Coraggiosi dà in uso il sistema il prima possibile e si
implementano i cambiamenti richiesti man mano
1) Progettare con il cliente;2) Test funzionali e unitari;3) Refactoring
riscrivere il codice senza alterarne le funzionalità esterne
1) Progettare al minimo;2) Descrivere il sistema con una metafora,
anche per la descrizione formale;3) Proprietà del codice collettiva
contribuisce alla stesura chiunque sia coinvolto nel progetto
Le 12 regole di Extreme Programming
Le 12 regole di Extreme Programming
7) Scegliere ed utilizzare un preciso standard di scrittura del codice;
8) Integrare continuamente i cambiamenti al codice;
9) Il cliente deve essere presente e disponibile a verificare
sono consigliate riunioni settimanali
7) Open Workspace;8) 40 ore di lavoro settimanali;9) Pair Programming
due programmatori lavorano insieme su un solo computer
Quindi come pianifichiamo ?
Predittiva Conoscenta anticipata di requisiti, tempi, costi,
risorse
Adattativa Impossibilità reale di avere delle informazioni in
tempi non ancora maturi oppure inevitabilmente cambieranno
Progettazione
I progetti software sono differenti per molti motivi: la tipologia di sistema che devi sviluppare la tecnologia da usare la dimensione e la distribuzione del team le conseguenze del fallimento lo stile di lavoro del team la cultura dell'organizzazione
UML Unified Modeling
Language
Cos'è UML ?
UML ( Unified Modeling Language) è un linguaggio standard di modellazione visuale per specificare, visualizzare, costruire e documentare domini applicativi eterogenei, adatto maggiormente a progettare sistemi object-oriented e sistemi component-based.
UML è un linguaggio…
UML è un linguaggio pertanto costituito da sintassi e semantica sintassi: regole attraverso le quali gli elementi
del linguaggio (parole) sono assemblate in espressioni (frasi).
semantica: regole attraverso le quali alle espressioni sintattiche viene assegnato un significato.
UML non è una metodologia!
La metodologia serve per specificare: quale linguaggio di modellazione utilizzare per
descrivere il lavoro progettuale quali sono i passi necessari per raggiungerlo.
UML non è un processo!
Il processo è un insieme di regole che definiscono come un progetto di sviluppo dovrebbe essere condotto.
Include una descrizione e sequenzializzazione delle attività, documenti e modelli.
UML è un linguaggio standard...
Per standard si intende: una base di riferimento, un paradigma codificato per la produzione di tecnologie fra loro
compatibili e interoperabili riferiti ad hardware, software o infrastrutture di
rete.
Come si arriva allo standard?
E chi contribuisce ad UML?
UML è definito: sotto l'egidia dell'OMG (Object Management
Group) a partire dal contributo dei “Tre Amigos” (Grady
Booch, Jim Rumbaugh e Ivar Jacobson) ed il supporto delle più importanti società di
software mondiali
“Method wars”
Metodi Storici SADT: Structured Analysis and Development
Technique DFD: Data Flow Diagram IDEF0: Integration Definition for Function
Modeling
“Tre Amigos”
Tre Amigos Grady Booch: Object Oriented Design – OOD James Rumbaugh: Object Modeling
Technique - OMT Ivar Jacobson: Object-Oriented Software
Engineering - OOSE
Storia di UML
Booch e Rumbaugh lavoravano alla Rational 1994 Unified Object Notation v0.8
Jacobson capo di Objectory che nel 1995 fu acquistata dalla Rational 1995 Unified Modeling Language v0.9
Booch e Rumbaugh e Jacobson crearono consorzio “UML Partners” e redassero UML v1.0
Storia di UML
Microsoft, HP, Oracle, Rational ed altri crearono consorzio “OMG” novembre 1997 versione v1.1 dicembre 1998: versione 1.2 giugno 1999: versione 1.3 maggio 2001: versione 1.4 marzo 2003: versione 1.5 agosto 2005 : versione 2.0 ottobre 2006: versione 2.1
UML è un linguaggio standard di
modellazione... Modellare significa descrivere un sistema in
termini di: entità coinvolte relazioni esisteni tra di loro
Esempio: Diagrammi di flusso UML Diagrammi Entita-Relazione
Qualità di un modello
Accuratezza: deve descrivere il sistema correttamente,
completamente e senza ambiguità; Consistenza:
le diverse viste devono completarsi vicendevolmente per formare un insieme coerente
Semplicità: deve poter essere compreso, senza troppi problemi,
da persone estranee al processo di modellazione; Manutenibilità:
la variazione dello stesso deve essere la più semplice possibile.
UML è un linguaggio standard di modellazione visuale...
Per quale motivo è utile un approccio visuale alla progettazione? chi progetta un qualsiasi tipo di costruzione o
artefatto utilizza sempre figure, schemi, diagrammi per svolgere la propria attività:
ingegneri, architetti, ma anche stilisti utilizzano diagrammi e figure per visualizzare i propri progetti
anche i progettisti e gli analisti di sistemi informativi utilizzano figure e diagrammi per visualizzare il risultato del loro lavoro.
Perchè visuale?
Sintesi a “colpo d'occhio” Visione delle entità coinvolte Visione delle Relazioni Visione delle Comportamenti
Approccio ad UML
1) Abbozzo
2) Progetto
3) Linguaggio
Approccio ad UML
UML come abbozzo (sketch) Documentazione, discussione e condivisione
delle idee Bassa, se non nulla dipendenza dal tool di
modellazione Selettività: focalizzazione solo su alcuni aspetti
dell’applicazione Basso rigore formale
Approccio ad UML
UML come progetto (blueprint) Forward e reverse engineering Forte dipendenza dal tool di modellazione Alto rigore formale Completezza
Approccio ad UML
UML come linguaggio di programmazione Diagrammi compilabili No forward e reverse engineering Fortissima dipendenza dal tool di modellazione
...specificare, visualizzare, costruire e documentare... Specificare
Dettagli di implementazione Visualizzare
Un immagine è meglio di 100 parole Costruire
Idee, pensieri Documentare
Interazione con gruppi esterni
...domini applicativi eterogenei...
Dominio eterogenei sanita, finanza, tlc, aereospazio indipendentemente dalla piattaforma
Sistema: una singola organizzazione vista nella sua
globalità (es. azienda) una parte di un’organizzazione (es. divisione,
oppure processo) un insieme di organizzazioni, o di parti di
organizzazioni, in relazione tra loro (es. processi di interazione Business-to-Business)
...adatto maggiormente a progettare sistemi object-oriented...
I concetti OO si sono sviluppati dal 1970 attraverso diversi linguaggi di programmazione C++, Smalltalk, Java, Eiffel.
Il paradigma ad oggetti è basato su 3 principi: Incapsulamento Generalizzazione Poliformismo
Incapsulamento
Permette di nascondere la complessita' sulla base dell'information hiding
Le informazioni vengono esposte o impostate senza dover conoscere la logica implementativa.
Gestire meglio i cambiamenti centralizzando l'implementazione in un unico punto.
Generalizzazione Specializzazione
Permette di poter specializzare il comportamento di un oggetto ereditando le caratteristiche di un oggetto padre, senza dover riscrivere la logica.
Permette di gestire: i cambiamenti la complessita' il riuso propagare i cambiamenti su tutti i figli
Polimorfismo
Molti modi per fare la stessa cosa Combinando la generalizzazione, la
specializzazione e l'incapsulamento è possibile definire un oggetto generico e decidere a Run-time quale oggetto specializzato utilizzare sulla base dell'incapsulamento.
...e sistemi component-based.
I quattro “dogmi” della modularizzazione sono: Alta coesione (omogeneità interna) Basso accoppiamento (indipendenza da altri moduli) Interfacciamento esplicito (chiare modalità d’uso) Information hiding (poco rumore nella comunicazione)
...e sistemi component-based.
Il PC che stiamo utilizzando ne è un esempio...
Di cosa parliamo? Componenti riutilizzabili Dividere la logica dall'interfaccia Utilizzare uno standard di
comunicazione(esempio: CORBA, COM ecc...)
Diagrammi UML
Diagrammi UML
Classica suddivisione dei diagrammi UML
Strutturali: come è composto il sistema ( package, object, deployment, class, composite, component )
Comportamentali: come interagisce sistema (activity, use-case, state-machine ) Interattivi: che messaggi si scambia il sistema
( overview, sequence, timing, comunication )
Diagrammi UML
Diagrammi UMLUML 1.x
Class diagram Object diagram Deployment diagram Component diagram Package diagram Activity diagram Use case diagram Sequence diagram
Comunication diagram State Chart diagram
UML 2.x Class diagram Object diagram Deployment diagram Component diagram Package diagram Activity diagram Use case diagram Sequence diagram
Collaboration diagram State Machine diagram
Overview diagram Timing diagram Composite structure
diagram
uguali
modificati
nuovi
Class Diagram
Consentono di descrivere tipi di entità, con le loro caratteristiche e le eventuali relazioni fra questi tipi.
Concetti di: classe, associazione, dipendenze, generalizzazione.
Object Diagram
Consentono di descrivere un sistema in termini di oggetti e relative relazioni.
Concetti di: oggetto, relazione.
Deployment Diagram
Consentono di descrivere un sistema in termini di risorse hardware detti nodi, e di relazioni fra di esse.
Spesso si combina con le componenti software per mostrare dove sono distribuite (Component Diagram).
Concetti di: nodo, connessione.
Component Diagram
Consentono di descrivere l'organizzazione e le dipendenze tra componenti software.
Concetti di: componente, interfaccia.
Package Diagram
Consentono di mostrare l'organizzazione dei packages e dei loro elementi.
Concetti di: package, merge, import, nested.
Sequence Diagram
Consentono di mostrare il comportamento dinamico di un gruppo di oggetti che interagiscono.
Concetti di: entità, messaggi.
Activity Diagram
Consentono di rappresentare la logica interna di un processo.
Concetti di: attività, flusso, responsabilità.
Use Case Diagram
Consentono la descrizione delle funzioni o servizi offerti da un sistema, così come sono percepiti e utilizzati dagli attori che interagiscono col sistema stesso.
Concetti di: sistema, attore, caso, associazioni.
Collaboration Diagram
Consentono la descrizione dell'interazione fra più oggetti ed i messaggi scambiati, focalizzandosi sugli oggetti e non sul tempo.
Concetti di: oggetti, messaggi.
State Machine Diagram
Consentono la descrizione del comportamento di entità o di classi in termini di stato.
Concetti di: stato, transizione.
Overview Diagram
Fornisce una visione complessiva delle interazioni che cooperano in un flusso molto simile a quella di un diagramma di attività
Concetti di: oggetto, relazione.
Timing Diagram
Mostra le interazione tra gli oggetti ed il loro cambiamento di stato in un dato periodo di tempo.
Concetti di: oggetto, relazione, tempo.
Composite-structure Diagram
Mostra i sottosistemi che compongono il sistema
Concetti di: parte, connettore, porte.
UML 2.0
UML 2 è distribuito dall' OMG in 4 specifiche1) Diagram Interchange Specification
layout dello schema con strumenti diversi (xmi)
1) UML Infrastructure definisce il core dell'uml, cio' il metamodello
utilizzato
1) UML Superstructure definizione formale degli elementi uml, utilizzata
dai tool dei vendor e definisce in dettaglio i diagrammi utilizzati
1) Object Constraint Language (OCL) definisce le regole e le logiche da utilizzare. Ha
una sintassi e delle parole chiavi.
Computer Aided Software Engineering ( CASE )
Tool di modellazione Supporto alla creazione dei diagrammi e
validazione Ricerca tra i mille modelli creati
Generazione del codice Supporto a diversi linguaggi di
programmazione, DDL, DML Reverse engineering
Supporto all'analisi partendo dal codice UML 1.x – 2.x
Supporto alle versioni
CASE
Rose; Rational Modeler ed Architect (IBM - Rational)
Together (Borland) Visio (Microsoft) TAU (Telelogic) Objecteering (Softeam) Poseidon (Gentleware) Enterprise Architect (Sparx
Systems) Magic Draw (No Magic) ArgoUML (open source) StarUML (open source) UModel 2005 (Altova) TAU Developer and TAU
Architect (Telelogic) Jude (open-source)
Real-time Studio(ARTiSAN) OMONDO EclipseUML Studio
(open source) PathMATE (Pathfinder
Solutions) Metis with UML 2.0 Template
(Computas) Describe (Embarcadero) I-Logix Rhapsody MetaMatrix MetaBase Modeler
(Tibco) Java Studio Enterprise (Sun
Microsystems) Model-in-Action (Mia Software) Pattern Weaver Ver. 2.0 EDGE UML Suite (Mentor
Graphics) InnovatorAOX 2006 Object
eXcellence (MID)
Sistema di elaborazione
Sistema di elaborazione
Il termine sistema di elaborazione(SE) indica solitamente un dispositivo in grado di eseguire una serie di operazioni a seguito di comandi impartiti dall’utente
Un sistema di elaborazione è dotato di una serie dispositivi che gli permettono di comunicare con “il mondo esterno”, ricevendo dati e comandi e trasmettendo all’esterno i risultati delle sue elaborazioni
Sistema di elaborazione
Nel senso più generale del termine un sistema di elaborazione è caratterizzato da due parti:
l’hardware che è l’insieme delle parti elettroniche e meccaniche del sistema
il software che è l’insieme dei programmi che possono essere eseguiti dal sistema
Il seguente diagramma (“struttura a cipolla”) schematizza i livelli di un sistema di elaborazione:
Sistemi di elaborazione Classificazione
I sistemi di elaborazione sono usualmente classificati nelle seguenti categorie: super computer: sistemi multiutente e
multiprocessore, utilizzati per il calcolo scientifico intensivo (es. previsioni meteorologiche) costo: > 10 MLD
mainframe: sistemi multiutente di fascia alta (> 100 utenti), potenza di calcolo elevata, costo: 1-10 MLD
mini computer e super-mini: sistemi multiutente di fascia media, media potenza, costo: 100-1000 MIL
Sistemi di elaborazione Classificazione
continuo… microcomputer super-micro: sistemi
multiutente di fascia bassa, costo: 10-100 MIL workstation: calcolatori in genere mono-
utente dotati di dispositivi e software di qualità superiore, costo: 10-100 MIL
personal computer: calcolatori personali di piccole dimensioni, economici e mono-utente, costo: 1-10 MIL
laptop e notebook:personal computer di ridotte dimensioni al fine di renderli trasportabili
continuo… palmtop: personal computer di ridotta potenza
utilizzati come agende elettroniche home computer: calcolatori di bassa potenza e
molto essenziali (il video è un televisore, es. Commodore 64)
console: evoluzione dei precedenti, dedicati esclusivamente all’uso ludico
Sistemi di elaborazione Classificazione
Sistema di elaborazione Architettura
Non è possibile identificare un unico schema fisico (realizzativo) dell’architettura interna di un sistema di elaborazione, in quanto questa può variare notevolmente
E’ invece possibile identificare uno schema logico di massima che si adatta abbastanza bene per descrivere l’architettura della maggior parte dei SE attuali
Sistema di elaborazioneHardware
CPU Memoria RAM Scheda Video Periferiche I/O BUS di sistema
Sistemi di elaborazione Principi di funzionamento
In generale, un’istruzione specifica una serie di operazioni elementari da svolgere e quali dati devono essere considerati
Un programma è una sequenza di istruzioni usata per risolvere un determinato problema
Il programma indica quali sono le operazioni da svolgere e la CPU le esegue
Nei primi calcolatori le istruzioni venivano inserite in modo meccanico, ad esempio, mediante schede perforate
Sistemi di elaborazione Principi di funzionamento
La parte della CPU che permette di “distinguere” tra dati e istruzioni si chiama Program Counter (PC)
Il Program Counter è un registro che contiene l’indirizzo della locazione di memoria nella quale è memorizzata la prossima istruzione da eseguire
Le locazioni che seguono possono contenere dati su cui operare, indirizzi di memoria contenenti dati oppure altre istruzioni
Sistemi di elaborazione Principi di funzionamento
Il calcolatore, comunque, è a conoscenza della lunghezza dell’istruzione che sta eseguendo. Questo gli permette di aggiornare il Program Counter in modo che contenga sempre l’indirizzo di memoria della prossima istruzione da eseguire
Il concepire i dati al pari delle istruzioni come sequenze di bit presenta il vantaggio di avere un’unica memoria (e non una per i dati e una per le istruzioni)
Sistemi di elaborazione Principi di funzionamento
All’accensione del calcolatore, il Program Counter contiene sempre un indirizzo di memoria ROM prestabilito (solitamente la cella all’indirizzo 0)
A partire da questa locazione di memoria vi è il programma che inizializza la macchina e i dispositivi e fa sì che il sistema operativo venga caricato in memoria dal disco
La fase di caricamento di questo programma viene detta “bootstrap”
Sistemi di elaborazione Ciclo macchina
La CPU conosce la posizione in memoria (l’indirizzo) della prossima istruzione da eseguire: è memorizzato nel Program Counter
Fase di fetch L’indirizzo di cui sopra viene messo
dalla CPU sull’address bus La memoria riceve l’indirizzo e
mette sul data bus il contenuto della locazione indicata
La CPU legge il dato dal data bus e lo mette nel registro delle istruzioni
Fase di decode La CPU esamina il contenuto
del registro delle istruzioni (IR) e riconosce qual è l’istruzione che deve essere eseguita
Fase di execute La CPU manda ai vari
dispositivi (ALU inclusa) i comandi per eseguire l’istruzione indicata
Sistemi di elaborazione Ciclo macchina
Sistemi di elaborazione Ciclo macchina
Se l’istruzione ha più di 1 parte, le successive sono i dati su cui operare
I dati possono essere: dei valori veri e propri gli indirizzi di memoria dei valori
In quest’ultimo caso la fase di fetch è più complessa in quanto la CPU dovrà: mettere sull’address bus gli indirizzi degli
operandi leggere dal data bus gli operandi
Quando la CPU dispone di tutti gli operandi può finalmente eseguire l’istruzione
CPU - Central Processing Unit
La CPU (Central Processing Unit) è il “cervello” del sistema;
E’ la componente che è in grado di eseguire i programmi, fare i calcoli oltre a controllare le altre componenti del sistema
E’ l’unità di elaborazione delle istruzioni prelevate dalla memoria centrale
Composta da unita elementari: Unità di controllo (CU) Unità logico-aritmetica (ALU) Registri (R) Unità di virgola mobile ( FPU ) Unita di gestione della memoria ( MMU )
CPU - Central Processing Unit Unita elementati
Unità di controllo (CU) preposta alla organizzazione della sequenza di
attività , ha il compito di coordinare l’attività interna
della CPU stessa con quella di tutte le altre componenti del sistema
Unità logico-aritmetica (ALU) Predisposta alle operazioni logiche (somma,
divisione, condizioni, iterazioni)
CPU - Central Processing Unit Unita elementati
Registri Predisposti a contenere informazioni, ad
accesso rapido, recuperate nella memoria centrale o frutto di elaborazione
Unità di virgola mobile ( FPU ) Preposta ad eseguire calcolo in virgola mobile
Unita di gestione della memoria ( MMU ) Preposta a mappare la memoria virtuale in
fisica, al supporto di protezione della memoria ed alla gestione della memoria virtuale
CPU - Central Processing Unit Unita elementati
CPU - Central Processing Unit Registri
La CPU mantiene al suo interno le informazioni da elaborare in appositi “contenitori” chiamati registri
Il motivo per cui il processore mantiene, se possibile, le informazioni al suo interno è quello di aumentare la velocità di esecuzione: non deve andare a cercare i dati in memoria
Alcuni registri possono avere un compito specifico mentre altri possono essere generici Contatori di programma (PC) Registro di istruzione (IR) Registri generali (R) Registri di stato (SR) Registro di indirizzi della memoria (MAR) Registri dati della memoria (MDR)
CPU - Central Processing Unit Registri
Contatori di programma (PC) contiene l’indirizzo dell’istruzione da eseguire
in un dato istante Registro di istruzione (IR)
contiene l’istruzione elementare da eseguire Registri generali (R)
contengono informazioni di accesso rapido
CPU - Central Processing Unit Registri
Registri di stato (SR) Contengono informazioni riguardo lo stato del
processore, l’istruzione da eseguire, le condizioni particolari e le azioni da intraprendere per gestirle
Registro di indirizzi della memoria (MAR) Contiene i puntatori ai registri della memoria
utilizzati in I/O Registri dati della memoria (MDR)
Contiene i dati trasferiti o da trasferire nella memoria
CPU - Central Processing Unit Registri
CPU - Central Processing Unit Schema a blocchi
Memoria Centrale
Bus
Unità di controllo( UC )
Unità aritmetico –logica( ALU )
Registri generali( R )….R0R1R2….Rn
Contatore di programma( PC )
Registro di Stato( SR )
Registro di indirizzo della memoria
( MAR )
Registro dei datidella memoria
( MDR )
Registro di istruzione( IR )
CPU - Central Processing Unit La velocità di elaborazione
La velocità di elaborazione dipende da più fattori, tra i quali: l’architettura dell’elaboratore presenza di molti o pochi registri componenti più o meno veloci
il programma eseguito alcune CPU sono particolarmente veloci ad
elaborare valori interi la frequenza del segnale di clock
il clock è il segnale di sincronizzazione di tutto il sistema, più è alta la frequenza più è veloce il sistema
CPU - Central Processing Unit La velocità di elaborazione
La CPU è in grado di eseguire un’istruzione (in media) ogni “n” colpi di clock
La frequenza “f” del clock si misura in MHz La velocità di esecuzione delle istruzioni si
misura in “MIPS” (Million Instructions Per Second)
Il numero di istruzioni eseguite per secondo sarà allora: MIPS=f / n
Esempio CPU con f = 100 MHz e in media 1 istruzione
ogni 2 colpi di clock: allora 100/2 = 50 MIPS
Memoria
I programmi, per essere eseguiti, devono essere presenti nel sistema di elaborazione, ovvero memorizzati in componenti dette memorie
Le memorie sono dei contenitori di informazioni (istruzioni e dati) a cui il processore può accedere al fine dell’elaborazione.
Poiché l’informazione elementare comprensibile da un calcolatore è il bit, le memorie contengono un certo numero di celle(variabile a seconda della dimensione della memoria) ognuna delle quali può contenere un bit, l’unione di otto celle consecutive è detta byte
Memoria
Quando la CPU fa riferimento ad una cella si dice che la “indirizza”, ovvero la identifica con un “nome” numerico univoco tra tutte le celle
Questo è il motivo per cui si parla di indirizzi di memoria
In realtà la CPU, per motivi di efficienza, non accede mai ad una singola cella (bit) alla volta, ma a multipli di m byte: locazione
Ad ogni indirizzo di memoria corrispondono m byte, ossia 1 locazione
Memoria
La CPU comunica alla memoria l’indirizzo della locazione che intende leggere o scrivere per mezzo dell’address bus (bus degli indirizzi)
Il trasferimento dei dati dalla CPU alla memoria e viceversa avviene tramite il data bus
La dimensione (il numero di fili) del data bus indica il parallelismo della memoria:
se il data bus ha 8 fili significa che si può scrivere o leggere dalla memoria un byte alla volta
se il data bus ha 16 bit possono essere effettuate operazioni di lettura e scrittura della memoria che coinvolgono 2 byte
Tipo di Memoria
Le memorie si dividono in due categorie principali: RAM ROM
Memoria RAM
Le memorie RAM (Random Access Memory) possono essere scritte e lette un numero
illimitato di volte sono dette volatili in quanto se il sistema
viene spento il loro contenuto viene perso
Memoria ROM
Le memorie ROM (Read Only Memory) scritte una volta sola dal costruttore i dati non sono persi togliendo l’alimentazione
(non sono “volatili”) possono essere lette un numero illimitato di
volte Utilizzi:
piccoli programmi di uso frequente istruzioni che il sistema di elaborazione deve
eseguire ogni volta all’accensione (BIOS)
Memoria ROM Classificazione
ROM Scritte dal costruttore
PROM ( Programmable ROM) Possono essere scritte una volta sola con
dispositivi speciali EPROM ( Erasable PROM)
Possono essere riscritte solo alcune volte con dispositivi speciali (cancellazione a raggi UV)
continua… EEPROM ( Electrically EPROM)
Come le precedenti, vengono cancellate con impulsi elettrici
Flash EPROM Riscrivibili più volte senza apparecchiature
particolari; si possono scrivere solo a settori ⇒non utilizzabili come DRAM, ma come piccole memorie di massa per dispositivi programmati (es. modem)
Memoria ROM Classificazione
MemoriaModalità di accesso
Il processore può accedere ai dati: direttamente ( tramite IRQ ) indirettamente “Controller MMU”
La memoria può essere utilizzata dai processori, in modo: Esclusivo : allocazione esclusiva dell’area di
memoria Condiviso: condivisione dell’area di memoria Misto: parte condivisa e parte esclusiva
MemoriaConservazione del dato
L’informazione è mantenuta in modo:1) Dinamico
usano i condensatori, ma richiedono continui refresh elettrici delle celle cariche.
Sono le memorie più economiche e frequentemente usate. Sono memorie relativamente “lente” perché richiedono un continuo aggiornamento dei dati durante il quale la memoria non è utilizzabile
2) Statico usano i flip-flop, ma sono molto costosi. Più veloci e costose delle DRAM, non hanno
bisogno del continuo aggiornamento dei dati
MemoriaConservazione del dato
3) A cambiamento di fase: usano GST - Germano, Antimonio, Tellurio –
sollecitando il cambio di fase del materiale ma sono prototipi (02/2008)
La temporizzazione dell’accesso è di tipo: Sincrona: basato sulla velocità di clock Asincrona: basato sui segnali del dispositivo
MemoriaSchede RAM
Il package delle RAM è di tipo:1) SIMM, Single In-Line Memory
Module è un modello di scheda di memoria
RAM caratterizzata da contatti su una sola faccia della scheda.
Usata per Pentium I
2) DIMM, Dual In-line Memory Module
è l'evoluzione delle SIMM, da cui si differenziano per il numero di contatti, la dimensione leggermente maggiore e il tempo di accesso.
Usata per Pentium II e successivi
Memoria gerarchica
Nei sistemi di elaborazione moderni, al fine di aumentare l’efficienza, le memorie sono organizzate in modo gerarchico
L’obiettivo è quello di mettere diversi livelli di memoria. I livelli più vicini al processore sono più veloci di quelli più lontani
Una maggior velocità da parte delle memorie implica anche un maggior costo, quindi, i livelli più vicini al processore hanno una capacità di memorizzazione inferiore rispetto a quelli lontani
Memoria Cache
Tra la CPU e la memoria DRAM di sistema vengono “interposti” uno o due livelli di SRAM detta memoria cache
La cache si classifica in: cache di I° livello fisicamente situata nello stesso
chip del processore (4-64 KByte) cache di II° livello esterna al processore (256-
2048 KByte) su un chip a parte
Memoria Cache
Quando la CPU richiede un dato non presente in cache si verifica un “cache miss”
A seguito di un cache miss il dato richiesto (e quelli successivi) deve essere portato dalla memoria di sistema alla cache prima di poter essere usato dalla CPU
Periferiche I/O
Per interagire con il “mondo esterno” il sistema di elaborazione ha bisogno di opportuni dispositivi
Tali componenti si dicono dispositivi di Input-Output(I/O)
I dispositivi di Input servono per introdurre nel sistema di elaborazione, dal mondo esterno, dati o istruzioni
I dispositivi di Output servono a trasferire verso l’esterno le informazioni elaborate dal calcolatore
Periferiche I/O
I dispositivi di I/O non sono gestiti direttamente dalla CPU, ma attraverso circuiti di controllo chiamati I/O controller ( controllori di dispositivi di I/O )
Lo schema tipico è il seguente:
Periferiche I/O
Quando la CPU vuole che un dispositivo periferico esegua una determinata operazione invia il comando corrispondente al controller del dispositivo
Il controller interpreta il comando ricevuto e “pilota” il periferico (gli invia segnali elettrici di controllo) in modo che esegua il comando impartito dalla CPU
Periferiche I/O
La CPU può usare due tecniche differenti per accorgersi che il dispositivo periferico ha assolto al comando impartito: gestione in polling gestione in interrupt
Con la gestione in polling (detta anche di attesa attiva) la CPU periodicamente va a controllare lo stato del dispositivo
Periferiche I/O Gestione in polling
Nella gestione in polling può accadere che: la CPU controlli per un certo numero di volte lo stato
del dispositivo senza che questi abbia ancora terminato il suo compito: spreco di tempo di CPU che potrebbe essere utilizzato per svolgere altre attività
la CPU non si accorga immediatamente che il dispositivo ha terminato perché il controllo avviene periodicamente
Inadatta per sistemi operativi multitasking dove la CPU deve essere sempre sfruttata al massimo
Molto semplice da realizzare e non richiede hardware aggiuntivo
Periferiche I/O Gestione in interrupt
Con la gestione in interrupt (interruzioni) la CPU assegna un compito ad un dispositivo e poi procede a svolgere altre attività
Quando il dispositivo ha terminato il suo compito avverte la CPU mediante un segnale detto interrupt
La CPU, a seguito di un interrupt, interrompe appena possibile la sua elaborazione attuale per “servire” il dispositivo periferico
Periferiche I/O Gestione in interrupt
In realtà la CPU può decidere di interrompere le sue attività in seguito a un qualunque interrupt in seguito a interrupt selezionati
Con la gestione mediante interrupt la CPU non spreca mai tempo per controllare inutilmente lo stato del dispositivo ed è immediatamente avvertita quando il periferico ha terminato il compito
Periferiche I/O Gestione in interrupt
La gestione mediante interrupt è più complessa di quella in polling e richiede hardware aggiuntivo
Le interruzioni provenienti dai dispositivi, in genere, non vanno direttamente alla CPU, ma ad un circuito chiamato interrupt controller
La gestione mediante interrupt è in generale adatta a gestire eventi asincroni (ossia eventi “inattesi”)
Periferiche I/O Modalità di collegamento
Le modalità di collegamento di una periferica al calcolatore sono legate alle modalità di trasferimento dei dati: Comunicazione seriale i bit vengono trasmessi
uno per volta (ad esempio su un unico filo) Comunicazione parallela più dati vengono
trasmessi alla volta (ad esempio su più fili)
Periferiche I/O Bit di controllo
Spesso, insieme ai dati veri e propri si trasmettono anche dei bit di controllo, così che il dispositivo in ricezione possa controllare la correttezza dei dati ricevuti
Il metodo di controllo più semplice è il bit di parità (parity bit)
Consiste nel trasmettere, dopo un byte di dati, un bit in più;
Si conta il numero di bit 1per ogni byte: se sono in numero dispari, si aggiunge un bit di
parità 1 se invece sono pari, si aggiunge un bit di parità 0
Periferiche I/O Bit di controllo
Nel calcolare la velocità effettiva di comunicazione, bisogna considerare che il bit di parità non è un bit di dato e come tale “degrada” le prestazioni della comunicazione
Esempio: Si devono trasmettere 1000 byte ad una velocità di
300 bit/sec adottando la tecnica del controllo di parità
Ogni 8 bit ce n’è uno di parità, quindi si trasmettono 1000 blocchi di 9 bit: 1000 · 9 = 9000 bit totali
A 300 bit al secondo sono necessari 30 secondi per la trasmissione
Bus di sistema
Un bus non è altro che una serie di fili (in realtà sono delle piste metalliche) ognuno dei quali può “trasportare” dei segnali elettrici digitali (assumono solo 2 valori di tensione "Algebra di Boole")
Possiamo distinguere 3 tipi di BUS:
Control Bus Data Bus Address Bus
Bus di sistema
Control bus: La CPU controlla tutto il sistema di elaborazione
mandando e ricevendo segnali per mezzo del “control bus”
Address bus: La CPU comunica alla memoria l’indirizzo della
locazione che intende leggere o scrivere per mezzo dell’address bus (bus degli indirizzi)
Data bus: Il trasferimento dei dati dalla CPU alla memoria
e viceversa avviene tramite il “data bus”
Sistemi Operativi
Sistema Operativo
Il software può essere diviso un due classi: i programmi di sistema che gestiscono le operazioni
del sistema di elaborazione i programmi applicativi che risolvono i problemi dei
loro utilizzatori Il più importante dei programmi di sistema è il
sistema operativo che controlla tutte le risorse del calcolatore e fornisce la base sulla quale possono essere sviluppate le applicazioni
Il programmatore deve essere il più possibile svincolato dalla complessità dell’hardware
Sistema Operativo
Per ovviare al problema è necessario mettere uno strato di software tra l’hardware e l’utente
Questo strato di software, chiamato sistema operativo, si presenta all’utente con una interfaccia o macchina virtuale più facile da: capire usare programmare
Sistema Operativo
La situazione può essere rappresentata graficamente nel seguente modo:
E’ molto difficile descrivere esattamente cos’è un sistema operativo
Il problema è dovuto al fatto che il sistema operativo svolge due funzioni tra loro scorrelate:
sistema operativo come interfaccia uomo-macchina
sistema operativo come gestore delle risorse
Sistema Operativo
La definizione come interfaccia tende ad evidenziare come il sistema operativo sia in grado di nascondere all’utente i dettagli dell’hardware
La definizione come gestore delle risorse evidenzia la capacità del sistema operativo di gestire le risorse di sistema ( la CPU, la memoria, i dispositivi di I/O ecc)
Sistema OperativoComponenti funzionali
Non è possibile individuare un unico schema realizzativo per tutte le tipologie di sistemi operativi, però si possono identificare cinque componenti funzionali comuni a tutti i sistemi: gestore della CPU gestore della memoria gestore dei dispositivi di I/O gestore del file system interprete dei comandi
Sistemi OperativiGestore della CPU
Il gestore della CPU è quel modulo del sistema operativo che ha il compito di decidere a quale task(non a quale utente) spetta l’assegnazione della CPU
Tale componente prende spesso il nome di scheduler e gli algoritmi di scheduling sono le strategie adottate per assegnare la CPU ai task
Sistemi OperativiGestore della Memoria
Il gestore della memoria è quel modulo del sistema operativo incaricato di assegnare la memoria ai vari task (per eseguire un task è necessario che il suo codice sia caricato in memoria)
La complessità del gestore della memoria dipende dal tipo di sistema operativo
Nei sistemi multi-tasking più programmi contemporaneamente possono essere caricati in memoria
Sistemi OperativiGestore della Memoria
Spesso la memoria non è sufficiente per contenere completamente tutto il codice dei vari task
Il disco però è molto capiente, si può simulare una memoria più grande tenendo nella memoria di sistema (RAM) solo le parti di codice e dei dati che servono in quel momento, lasciando sul disco tutto il resto: è il concetto di memoria virtuale
Lo scambio di dati tra memoria fisica (RAM) e il disco è chiamato swap (scambio)
Sistemi OperativiGestore dei dispositivi di I/O
Il gestore dei dispositivi di I/O è quel modulo del sistema operativo incaricato di assegnare i dispositivi ai task che ne fanno richiesta
In particolare deve gestire i conflitti, ovvero le situazioni in cui due o più task vogliono accedere contemporaneamente allo stesso dispositivo
Sistemi OperativiGestore del File System
Il gestore del file system è quel modulo del sistema operativo incaricato di gestire le informazioni memorizzate sui dispositivi di memoria di massa
Il gestore del file system deve garantire la correttezza e la coerenza delle informazioni
Inoltre, nei sistemi multi-utente, deve mettere a disposizione dei meccanismi di protezione in modo tale da consentire agli utenti di proteggere i propri dati dall’accesso da parte di altri utenti non autorizzati
Sistemi OperativiL’interprete dei comandi
L’interprete dei comandi è la vera interfaccia del sistema operativo verso l’utente
Riceve i comandi dall’utente (generalmente da tastiera) e li esegue
Nei sistemi multi-tasking l’utente può mandare in esecuzione un comando senza aspettare che il precedente sia terminato
Istruzioni e linguaggi
Istruzioni e linguaggi
Un linguaggio di programmazione è costituito, come ogni altro tipo di linguaggio,
da un alfabeto con cui viene costruito un insieme di parole chiave (il vocabolario)
da un insieme di regole sintattiche (la grammatica) per l’uso corretto delle parole del linguaggio.
I microprocessori presenti all’interno della macchina sono stati progettati per riconoscere ed eseguire un insieme piuttosto ristretto di istruzioni; tali istruzioni costituiscono il cosiddetto linguaggio macchina.
Istruzioni e linguaggi
Il linguaggio macchina è basato su una codifica estremamente compatta e poco intuitiva.
Codificare un programma utilizzando il linguaggio macchina è assai arduo e richiede una conoscenza approfondita del funzionamento di un particolare calcolatore (o meglio: del microprocessore che costituisce la CPU della macchina).
Istruzioni e linguaggi
Per ovviare a questo problema, che ha costituito per molti anni un grosso limite alla diffusione della programmazione e quindi anche dell’uso dei calcolatori, sono stati sviluppati dei linguaggi di programmazione più evoluti, che si pongono a metà strada fra il nostro linguaggio naturale ed il linguaggio macchina.
Sono semplici e poveri (poche parole chiave, poche regole), ma privi di qualsiasi ambiguità.
Istruzioni e linguaggi
In informatica si parla di programmazione a basso livello quando si utilizza un linguaggio molto vicino alla macchina, al suo funzionamento interno.
Si parla invece di programmazione ad alto livello quando si utilizzano linguaggi più sofisticati ed astratti, slegati dal funzionamento fisico della macchina.
Istruzioni e linguaggi
Si viene così a creare una gerarchia di linguaggi, dai meno evoluti (il linguaggio macchina e l’assembler) a quelli più evoluti(Pascal, Fortran, Cobol, Perl, Java);
Per esempio il linguaggio C si pone ad un livello intermedio.
Istruzioni e linguaggi
La programmazione a basso livello è più ardua e meno intuitiva, ma consente di sviluppare programmi efficienti.
Ad alto livello la programmazione è più“naturale” e rapida, ma è possibile che non consenta di produrre software efficiente.
Istruzioni e linguaggi Linguaggio ASSEMBLY
Il linguaggio assembly (e il linguaggio macchina) è diverso per ogni tipo di CPU
Ad esempio, il linguaggio assembly dei processori Intel 80x86 (Personal Computer) non è compatibile con quello dei processori Motorola (Macintosh) o Digital
Quindi i programmi scritti in assembly per una determinata macchina non possono essere trasportati su calcolatori di tipo diverso
Istruzioni e linguaggiLinguaggio ASSEMBLY
L’istruzione di somma potrebbe avere il nome simbolico ADD invece di 01001010
Questo simbolismo è chiamato linguaggio ASSEMBLY (o ASSEMBLER)
Per tradurre un programma scritto in assembly in codice macchina (che è l’unico linguaggio compreso dal calcolatore) viene utilizzato un programma chiamato assemblatore (assembler)
L’assemblatore traduce i nomi simbolici delle istruzioni, dei dati e degli indirizzi assembly nei corrispondenti valori numerici
Istruzioni e linguaggi Linguaggio ASSEMBLY
Al fine di rendere più agevole la stesura dei programmi si è deciso di assegnare a istruzioni, dati e indirizzi dei nomi simbolici
L’operazione di stesura di un programma diventa quindi organizzata nelle seguenti fasi:
scrittura del programma assembly (codice sorgente) con un editor
traduzione del codice sorgente con l’assemblatore in codice macchina (programma oggetto)
esecuzione del programma oggetto
Istruzioni e linguaggi
Al fine di ovviare a questo inconveniente è preferibile utilizzare linguaggi ad alto livello
Nei linguaggi ad alto livello si hanno istruzioni con un più alto potere espressivo e, soprattutto, indipendenti dal tipo di CPU sulle quali devono essere eseguite
Istruzioni e linguaggi
Possiamo aggregare i numerosi linguaggi di programmazione esistenti sulla base del modello astratto ( paradigma ) di programmazione
Istruzioni e linguaggi
Linguaggi imperativi: Il modello computazionale è basato sui
cambiamenti di stato della memoria della macchina.
È centrale il concetto di assegnazione di un valore ad una locazione di memoria.
Il compito del programmatore è costruire una sequenza di assegnazioni che producano lo stato finale (in modo tale che questo rappresenti la soluzione del problema).
Istruzioni e linguaggi
Linguaggi dichiarativi: Il modello computazionale è basato sui concetti
di funzione e relazione. Il programmatore non ragiona in termini di
assegnazioni di valori, ma di relazioni fra entità e di valori di una funzione.
Istruzioni e linguaggi
Sulla base dell’ambito in cui è necessario risolvere il problema, è opportuno adottare un linguaggio piuttosto che un altro:
Calcolo scientifico: Fortran, C Intelligenza Artificiale: Prolog, Lisp Applicazioni gestionali: Cobol, SQL, C Sistemi, device driver: Assembler, C Applicazioni client visuali: C++, Java, Visual
Basic Applicazioni su Web: Perl, ASP, Java Applicazioni distribuite: Java, C, C++
Istruzioni e linguaggi
Un programma scritto in un linguaggio ad alto livello deve essere convertito in linguaggio macchina per essere eseguito
A seconda del modo in cui avviene la conversione, si parla di: Linguaggio interpretato Linguaggio compilato
Linguaggio interpretato: ogni riga di codice sorgente viene letta,
convertita in linguaggio macchina e poi eseguita da un programma detto interprete
Interprete: itera più volte questo processo Legge un’istruzione del programma “sorgente” Traduce l’istruzione in linguaggio macchina Esegue l’istruzione Passa all’interpretazione dell’istruzione
successiva
Istruzioni e linguaggi
Al termine di questa operazione, del programma in linguaggio macchina non rimane alcuna traccia (la traduzione non viene memorizzata).
Se il programma torna più volte su una stessa istruzione, questa verrà tradotta (ed eseguita) ogni volta.
Istruzioni e linguaggi
Istruzioni e linguaggi
Linguaggio compilato tutto il codice viene letto e convertito in linguaggio
macchina da un programma detto compilatore, l’esecuzione avviene in un momento successivo in seguito ad una richiesta esplicita dell’utente
Istruzioni e linguaggi
Compilatore: esegue una sola volta il processo Legge tutte le istruzioni del programma
“sorgente” e le traduce in linguaggio macchina. Memorizza su disco il programma “eseguibile”
tradotto in linguaggio macchina. Al termine della compilazione avremo un
programma “eseguibile” in linguaggio macchina.
La traduzione di ogni istruzione del programma avviene una sola volta, anche se una stessa istruzione viene ripetuta più volte all’interno del programma.
Non ho bisogno di avere il compilatore ed il “sorgente” per eseguire il programma: mi basta il programma “eseguibile”.
Istruzioni e linguaggi
Istruzioni e linguaggi
Schema ibrido compilazione/interpretazione nel caso di Java
Il compilatore a partire dal listato in Java crea del codice binario non per una architettura specifica (Intel, Linux,...)
ma per una architettura virtuale (JVM)
L’interprete l’interpretazione viene effettuata dalla JVM è un “simulatore” della architettura virtuale per
le architetture effettive ( • Intel, Linux, Macintosh )
Filosofia: write-once run everywhere
Istruzioni e linguaggi
Istruzioni e linguaggi
Un linguaggio è definito da 2 aspetti:1) Sintassi:
Indica la sequenza di parole o simboli appartenenti alle giuste categorie sintattiche
1) Semantica Indica se il programma ha senso, se sarà possibile
eseguirlo
Esempio: “Il cane gioca in borsa”
è sintatticamente corretta, ma non semanticamente 3+true=false
è sintatticamente corretta, ma non semanticamente
Valori, tipi e operatori
Valori, tipi e operatori- Valori -
Nella vita di tutti i giorni siamo abituati a rappresentare i numeri in base 10.
In questo tipo di numerazione utilizziamo 10 simboli convenzionali (l’alfabeto della nostra codifica): 0, 1, 2, 3, …, 9.
Utilizzando un criterio simile possiamo scegliere di rappresentare i numeri con basi diverse da 10, ad esempio la base 2 o la base 16
La macchina opera con una logica binaria che riflette direttamente la struttura fisica delle sue componenti.
Nella numerazione binaria ogni numero viene rappresentato fattorizzandolo in multipli di potenze di 2
La memoria della macchina è un “casellario” molto grande suddiviso in locazioni di memoria, numerate progressivamente mediante degli indirizzi di memoria che ne identificano univocamente la posizione.
Valori, tipi e operatori- Valori -
Valori, tipi e operatori- Valori -
Ogni locazione è composta da un insieme di 8 bit che compongono un byte.
Con un solo byte è possibile rappresentare piccoli numeri interi (compresi tra 0 e 255).
Per rappresentare numeri più grandi la macchina aggrega più locazioni di memoria contigue: ad esempio con 2 byte è possibile rappresentare numeri binari di 16 cifre (16 bit), compresi tra 0 e 65.535.
Valori, tipi e operatori- Valori -
Per rappresentare numeri con il segno (interi relativi) si adotta la convenzione di considerare il primo bit come rappresentante del segno: ad esempio 0 per il segno negativo ed 1 per il segno positivo.
Con 2 byte (16 bit, di cui 15 per la rappresentazione del numero ed 1 per il segno) potremo così rappresentare numeri compresi tra +32.767 e –32.767.
Complessivamente vengono così rappresentati comunque 65.535 numeri, di cui 32.768 positivi (considerando anche lo zero) e 32.767 negativi.
Valori, tipi e operatori- Valori -
Per rappresentare numeri con la virgola (razionali positivi o negativi) si utilizza la notazione scientifica: –12,345 = –12345 × 10 ^–3
Quindi basta adottare un’altra convenzione: ad esempio, su un insieme di 32 bit: il primo rappresenterà il segno 28 bit rappresenteremo le cifre significative del
numero gli ultimi 3 bit rappresenteremo l’esponente
Così si possono rappresentare alcuni numeri razionali compresi, tra –268.435.455 e +268.435.455, con un massimo di 8 cifre dopo la virgola.
Più è grande (in valore assoluto) il numero e meno cifre decimali potremo rappresentare.
Valori, tipi e operatori- Valori -
Valori, tipi e operatori- Valori -
Con i computer spesso si trattano informazioni non numeriche, come caratteri alfabetici (o meglio, alfanumerici) o rappresentazioni grafiche.
Mediante opportune convenzioni è possibile rappresentare utilizzando la codifica binaria ogni tipo di informazione.
Per i caratteri alfanumerici (caratteri alfabetici, simboli di interpunzione, cifre numeriche ed altri simboli ancora) esiste una tabella di codifica standard che associa ad ogni carattere un codice numerico intero: la codifica ASCII (American Standard Code for Information Interchange).
Ad esempio il carattere “a” è associato al codice 61, al carattere “b” il 62, e così via.
Valori, tipi e operatori- Valori -
Valori, tipi e operatori- Valori -
Valori, tipi e operatori- Valori -
La codifica ASCII base viene rappresenta utilizzando uno spazio di 2^7 ossia 127 caratteri
La codifica ASCII estesa viene rappresentata utilizzando uno spazio di 2^8 ossia 256 caratteri, pertanto i caratteri da 128 a 255 rappresentano vari caratteri speciali, simboli matematici e lettere.
La codifica UNICODE viene rappresentata utilizzando uno spazio di 2^16 ossia 65536 caratteri, pertanto risolve i problemi legati al mapping di tutte le lingue.
Valori, tipi e operatori- Tipi -
Una medesima sequenza di bit può dunque rappresentare: un numero relativo ( es: 15 , -30) un numero razionale (24.434, -78.778) un carattere alfanumerico (A, m, #).
Per indicare alla macchina come dovrà essere trattata una certa sequenza di bit memorizzati in un determinato blocco della memoria, è necessario che il programmatore a priori dichiari il tipo di dato che intenderà associare ad una certa variabile nell’ambito di un intero programma o di una determinata funzione.
Con la dichiarazione del tipo di una variabile si indica anche alla macchina la quantità di memoria che dovrà essere riservata (allocata) per la memorizzazione delle informazioni trattate dal programma.
Valori, tipi e operatori- Tipi -
Valori, tipi e operatori- Tipi -
In ogni linguaggio di programmazione vengono messi a disposizione del programmatore dei tipi di dato elementari con cui possono essere definite le variabili o le strutture dati più complesse ed articolate.
I tipi di dato fondamentali, disponibili in quasi tutti i linguaggi di programmazione sono i seguenti: Intero (in C: short, unsigned, int e long) Floating point (in C: float, double) Carattere (in C: char)
I puntatori sono delle variabili che contengono l’indirizzo di memoria in cui è allocata un’altra variabile: si dice così che puntano ad un’altra variabile.
Valori, tipi e operatori- Tipi -
Valori, tipi e operatori- Tipi -
I tipi definiscono l’insieme di tutti i suoi possibili valori
boolean={true,false} byte = {-128,..,0,..,127}
I tipi sono denotati da un “identificatore” (o nome) Ad ogni tipo si associano anche gli operatori che è
possibile applicare ai suoi valori (! + * / )
Valori, tipi e operatori- Tipi -
Perchè i tipi? Semplificano la scrittura/lettura dei
programmi se di ogni valore gestito si conosce il tipo, si
sa quali operatori sono applicabili. Consentono di controllare la correttezza dei
programmi:(correttezza semantica) In alcuni casi, consentono anche di
ottimizzare le performance del programma si collega direttamente ad un operatore
l’azione/i elementari da effettuare
Valori, tipi e operatori- Operatori -
Il linguaggio di programmazione mette a disposizione del programmatore una serie di operatori utili, tra i quali:
Valori, tipi e operatoriOperatori di
assegnamento
L’operatore di assegnamento “=” consente al programmatore, una volta definita una variabile, di assegnarle un valore.
int res1 = 5; Assegna il valore 5 alla destra dell’operatore
alla variabile res1.
int res1 = 5+10; Esegue l’espressione alla destra dell’operatore
e ne assegna il risultato (15) a res1.
Valori, tipi e operatoriOperatori di
assegnamento
La variabile a sinistra dell’operatore di assegnazione (simbolo =) viene definita
Eventuali variabili presenti nell’espressione (a destra dell’operatore di assegnazione) vengono usate
variabile = espressione; X = 23; w = ‘a’; y = z; alfa = x + y; r3 = (alfa*43 - xgg) * (delta - 32*ijj); x = x + 1;
il valore dell’espressione viene registrato (assegnato) alla variabile
l’assegnazione non è una relazione di uguaglianza produce una modifica della memoria
Valori, tipi e operatoriOperatori di
assegnamento
Valori, tipi e operatoriOperatori di
assegnamento
I due elementi di un istruzione di assegnazione sono asimmetrici
variabile = espressione; A sinistra una cella di memoria a destra
un valore Non ha senso invertire gli elementi
espressione = variabile;
Valori, tipi e operatoriOperatori aritmetici
Sono i più comuni operatori aritmetici (somma, sottrazione, moltiplicazione, divisione e modulo).
Sono operatori binari ovvero operatori che necessitano di due operandi:
Valori, tipi e operatoriOperatori relazionali
Gli operatori relazionali servono ad effettuare un confronto tra valori producendo come risultato di ritorno un valore booleano (true o false) come prodotto del confronto.
Nella tabella sono riassunti gli operatori ed il loro significato.
Valori, tipi e operatoriOperatori relazionali
Gli operatori di relazione più noti sono quelli che permettono di confrontare quantità numeriche: uguale ( simbolo ‘==’) diverso ( simbolo ‘!=’) maggiore ( simbolo ‘>’) minore ( simbolo ‘<’) maggiore o uguale ( simbolo ‘>=’) minore o uguale ( simbolo ‘<=’)
Gli operatori ‘=’ e ‘!=’ sono applicabili a valori di qualunque natura
Gli altri operatori richiedono una relazione d’ordine sull’insieme di valori
Valori, tipi e operatoriOperatori relazionali
Valori, tipi e operatoriOperatori relazionali
Gli operatori di relazione permettono di esprimere predicati semplici 1 < 2 (valore: vero) 7 < 0 (valore: falso) x != 0 (valore: dipende cosa rappresenta ‘x’) oggi = venerdì (valore: dipende cosa
rappresenta ‘oggi’)
Non sono operatori logici, ma consentono di costruire espressioni che possono essere usate come argomenti di operatori logici -1 <= x AND x <= 1
Valori, tipi e operatoriOperatori relazionali
Valori, tipi e operatoriOperatori di shift bit a bit
Gli operatori di shift bit a bit consentono di manipolare tipi primitivi spostandone i bit verso sinistra o verso destra secondo le regole definite nella tabella seguente
byte i = 100;i >> 1;
dal momento che la rappresentazione binaria del numero decimale 100 è 01100100, lo shift verso destra di una posizione dei bit, produrrà come risultato il numero binario 00110010 che corrisponde al valore 50 decimale.
Valori, tipi e operatoriOperatori di shift bit a bit
Valori, tipi e operatoriOperatori logici
Consentono di eseguire operazioni logiche su tipi primitivi operando sulla loro rappresentazione binaria.
Valori, tipi e operatori- Operatori -
Tipologia di operatori: Operatori unari:
es.: simbolo “!” per i booleani (NOT logico) !true si valuta in false !false is valuta in true
Operatori binari: es.: simbolo “&&” per i booleani (AND logico) true && false si valuta in false true && true si valuta in true
Operatori ternari es.: operatore condizionale “?:” true ? 3:6 il risultato sarà 3 false ? 3:6 il risultato sarà 6
Valori, tipi e operatori- Operatori -
Costrutti decisionali ed iterativi
Costrutto decisionale
Un costrutto decisionale permette al programmatore di vincolare l'esecuzione di un'istruzione (o di un blocco di istruzioni) ad una condizione booleana
“condizione booleana” è un'espressione della quale si può dire se sia vera o falsa
“blocco di istruzioni” è un insieme di istruzioni racchiuso tra parentesi graffe, che vengono trattate come se fossero un'istruzione unica
Costrutto decisionale
if-else verificano diverse espressioni e quando viene
incontrata l'espressione che restituisce true viene eseguito un determinato pezzo di codice.
switch-case viene esaminata UNA SOLA espressione, pero'
a seconda del suo risultato cambia il pezzo di codice che verrà eseguito.
Costrutto decisionaleIf-else
Il costrutto condizionale più usato è l'if-else, che può essere usato nelle due varianti con o senza else:
if ( condizioneBooleana ) istruzione;
La variante con l'else ha una forma del tipo:
if ( condizioneBooleana ) istruzione1;else istruzione2;
Costrutto decisionaleIf-else annidate
Si presenta nel caso in cui vengono ad annidarsi piu’ condizioni all’interno di un’istruzione condizionale.
E' buona norma di programmazione evitare di ricorrere pesantemente alla nidificazione di istruzioni if, data la confusione che spesso ne segue
Costrutto decisionaleIf-else combinate
Una combinazione condizionale si ha quando si fa seguire ad un else una if.
if( x <= 0 ) System.out.println("x <= 0");else if( x <= 10) System.out.println("x > 0 e <= 10");else if ( x <= 20) System.out.println("x > 10 <= 20");else System.out.println("x è maggiore di 20");
Si noti che in questo caso l'ultimo else comprende tutti i casi non considerati dalle precedenti istruzioni.
Costrutto decisionaleswitch
Il costrutto switch permette di gestire tutte quelle situazioni in cui dobbiamo prendere scelte diverse a seconda del valore di un'espressioneswitch (espressione) { case val1: istruzione_na; break; case val2: istruzione_nb;break; default: istruzione_ndefault;break;}
Costrutto decisionaleswitch
L'espressione contenuta tra le parentesi dello switch solitamente è di tipo intero
Ogni istruzione “case” lavora su di un particolare valore, e fornisce una sequenza di istruzioni da eseguire in quella circostanza
Tale sequenza termina usualmente con l'istruzione break, che forza il computer a uscire dallo switch, senza verificare i valori sucessivi.
blocco di default, ovvero una sequenza di istruzioni da eseguire se non si è verificato nessuno dei casi precedenti.
Costrutti Iterativi I costrutti iterativi (cicli) vengono
abitualmente utilizzati in tutti quei casi in cui bisogna eseguire delle attività ripetitive in modo automatico.
Abbiamo due tipi di cicli: I cicli con contatore o Cicli For
I cicli contatore servono per svolgere una data attività per un numero determinato di volte
i cicli condizionali o Cicli While, Do-While I cicli condizionali vengono usati per eseguire
un'attività fino a quando una data condizione viene soddisfatta
Costrutti Iterativi while
La struttura generale del while è
while(condizioneBooleana) { ISTRUZIONE1; ISTRUZIONE2; ....}
Se si desidera che un ciclo venga ripetuto all'infinito, è sufficiente specificare una condizione sempre vera, tipo
while(0 == 0) { ISTRUZIONE1;}
Se si desidera che il ciclo venga ripetuto un numero prefissato di volte
i = 0;while(i<=100) {
ISTRUZIONI DA RIPETEREi = i + 1;
}
Costrutti Iterativi while
Costrutti Iterativi for
il ciclo di 10 iterazioni utilizzando il ciclo while
i=0;while(i<10) { faiQualcosa(); i++;}
comporta maggior elaborazione da parte del programmatore pertanto è possibile usare l’istruzione for:
for(init_statement ; conditional_expr ; iteration_stmt) { istruzione}
Costrutti Iterativi for
init_statement: rappresenta l’inizializzazione della variabile per il
controllo del ciclo conditional_expr
è l’espressione condizionale iteration_stmt
è l’aggiornamento della variabile di controllo Il problema presentato precedentemente
puo essere risolto utilizzando il ciclo for in questo modo:for (int i=0 ; i<10 ; i++)
faiQualcosa();
Array
Array
Molto spesso nei programmi si ha l'esigenza di manipolare un gruppo di variabili dello stesso tipo che contengono valori tra loro correlati.
Un array è uno strumento concettualmente simile ad una tabella, che accomuna sotto un unico nome un insieme di variabili dello stesso tipo
Il valore di un array come unica variabile è quindi una n-pla di valori componenti: Esempio: ( 2, 9, 0, -1, 24, 0, 9, 6 )
Array
Occorre indicare il numero di valori (lunghezza della n-pla): tipo nome[lunghezza]; Esempio: int a[100]
I numeri associati ai componenti si dicono indici e solitamente partono dal numero zero.
Il popolamento è l'operazione che permette di assegnare un valore ad un elemento del vettore. a[0] = s[1] + x;
Un vettore può essere inizializzato con una serie di valori, in modo simile a come si può fare con le variabili. int[] vettore = {10,12};
oppure int[] vettore = new int[5]; vettore[0] = 10;
Array
Array
E' possibile creare array bi-dimensionali, concettualmente simili ad una tabella rettangolare, dotata di righe e colonne (detto matrice). int i[][] = new int[10][15];
Inoltre è possibile definire vettori n-dimensionali ossia con un numero qualunque di dimensioni: int v1[][][] = new int[10][15][5];
Ma tali strutture, in ogni caso, risultano decisamente poco utilizzate.
E' inoltre possibile la realizzazione di tabelle non rettangolari.
Un Array multidimensionale può essere inizializzato con una serie di valori in modo
simile a come si può fare con gli Array semplici.
Array
Struttura del programma
Proprietà e Metodi
Un programma è composto da 2 gruppi di elementi:
Proprietà Metodi
Le “proprietà” servono per definire le variabili e le constanti utilizzate durante l’esecuzione.
Hanno visibilità Generale: è visibile da qualunque porzione di
codice dell’applicazione Locale: è visibile solo all’interno di una ristretta
porzione di codice dell’applicazione
Proprietà e Metodi
Proprietà e Metodi
I metodi servono per definire il blocco di codice che si occuperà di eseguire una serie di istruzioni
I metodi sono di 2 tipi: Procedure: ossia eseguono delle istruzioni e
non ritornano nessun valore al chiamante. Funzioni: ossia eseguono delle istruzione e
ritornano un valore al chiamante in base al tipo di ritorno definito dalla funzione.
Procedure
Elaborano eventuali parametri e non restituiscono un valore.
Servono per evitare di ripetere un blocco di codice
Esempio:void nomeMetodo(int a, int b) { System.out.println(a+” - “+b ); }
void (vuoto) indica che la funzione non restituira nessun
valore ma eseguira solamente le istruzioni indicate
nomeMetodo è il nome della funzione;
int a: all'interno delle parentesi tonde troviamo i due
argomenti che forniamo alla funzione con i loro relativi tipi
System.out.println all'interno delle parentesi graffe troviamo il
blocco di istruzioni della funzione. L'istruzione System.out.println(...) è quella che
permette alla funzione di visualizzare in Dos i parametri passati
Procedure
Funzioni
Elaborano eventuali parametri e restituiscono un risultato
Esempio:int moltiplicavalori(int a, int b) { risultato= a * b; return(risultato);}
int è il tipo di valore che la funzione restituirà(quindi il
tipo della variabile risultato); moltiplicavalori
è il nome della funzione; int a
all'interno delle parentesi tonde troviamo i due argomenti che forniamo alla funzione con i loro relativi tipi
risultato= a * b all'interno delle parentesi graffe troviamo il blocco di
istruzioni della funzione return
l'istruzione return(...) è quella che permette alla funzione di restituire il valore risultato.
Le istruzioni che seguono l'istruzione return vengono ignorate
Funzioni
Passaggio di parametri I metodi consentono di ricevere argomenti, i
quali possono essere passati per valore o riferimento:
Passaggio per valore: Al momento del richiamo della funzione, il valore
dei parametri attuali sono ricopiati nello spazio di memoria allocato ai parametri formali del metodo chiamato
Pasaggio per riferimento: Al momento del richiamo della funzione, il
puntatore all’indirizzo di memoria dei parametri attuali sono resi disponibili al metodo chiamato che potrà disporne direttamente.
Gestione tipica dello specifico linguaggio di programmazione: Java: viene gestito direttamente dalla JVM
attraverso il riconoscimento del tipo di parametro
C: viene gestito direttamente dal programmatore tramite l’utilizzo o meno dei puntari
Passaggio di parametri
Programmazione modulare
Programmazione modulare
Un’applicazione è fatta di una serie di moduli programma principale (main) sottoprogrammi (procedure e funzioni)
Funzionamento si inizia con l’esecuzione del “main” i vari moduli si chiamano a vicenda comunicando attraverso i parametri
Programmazione modulare
Aspetti metodologici della programmazione modulare
albero delle chiamate regole di visibilità e utilizzo dei dati compilazione separata e “riuso” del codice metodologia di sviluppo per raffinamenti
successivi linee guida per la scrittura di codice di qualità
Diagramma delle Chiamate
In un programma modulare i moduli dipendono gli uni dagli altri e per ogni chiamata il chiamante “dipende” dal chiamato
Diagramma delle chiamate diagramma che rappresenta le relazioni di
dipendenza tra i moduli ogni modulo è un elemento gli archi descrivono le dipendenze
Diagramma delle Chiamate
Diagramma delle Chiamate
Il Diagramma delle Chiamate: è un ottimo strumento per studiare il
funzionamento di un programma scritto da altri
aiuta a ragionare sul “livello di accoppiamento” tra i moduli e sulla logica applicativa del programma
Livello di accoppiamento di un modulo corrisponde al numero di moduli del programma da cui il modulo dipende cioè che chiama direttamente o indirettamente
Attenzione al livello di accoppiamento tanto più è alto il livello di accoppiamento di un
modulo, tanto più il modulo dipende da altri moduli
se uno o più degli altri moduli è scorretto, il modulo si comporta scorrettamente
se uno o più degli altri moduli cambiano prototipo, bisogna cambiare anche il modulo
Diagramma delle Chiamate
Diagramma delle Chiamate
E' importante che il diagramma sia organizzato per livelli
i moduli a livello più alto dipendono da quelli a livello più basso (tipicamente il “main” dipende da tutti gli altri moduli)
ai livelli più bassi l’accoppiamento deve diminuire progressivamente
Diagramma delle Chiamate
Regole di Visibilità
Regole di Visibilità sono quell'insieme di regole che stabiliscono cosa può essere utilizzato in ciascun modulo:
quali dati possono essere utilizzati utilizzare una costante, una variabile o un
parametro in una istruzione ?
quali altri moduli possono essere utilizzati utilizzare una funzione o una procedura ?
Regola di visibilità n.1
“Prima dichiarare e poi usare” un dato o un sottoprogramma può essere
utilizzato solo se è stato precedentemente dichiarato
il compilatore deve verificare che la chiamata sia corretta
Per quanto riguarda i dati: Occorre verificarne il nome Occorre verificarne il tipo
Per quanto riguarda i sottoprogrammi: Occorre verificare il nome Occorre verificare il numero ed il tipo dei
parametri Occorre verificare la natura dei parametri (per
valore o per riferimento) Occorre verificare l’eventuale tipo del risultato
Regola di visibilità n.1
Dati Locali e Dati Globali
Dati locali sono quei dati dichiarati all’interno di un
modulo ogni modulo ha i suoi dati locali i dati sono “indipendenti”: i dati di un modulo
non sono visibili all’interno di un altro possono avere nomi uguali ma corrispondono
a spazi di memoria diversi
Dati globali costanti e variabili dichiarate al di fuori di tutti i
moduli sono comuni a tutti i moduli
Utilizzo tipico costanti utilizzate da molti moduli è utile poterle definire una volta per tutte
Dati Locali e Dati Globali
Regola di visibilità n. 2
In ciascun modulo sono sempre visibili tutti i dati locali
I dati globali sono visibili a meno che nel modulo non sia dichiarato un dato locale con lo stesso nome
Compilazione Separata
Idealmente un programmatore scrive un’applicazione sulla
libreria basandosi sull’interfaccia utilizza inizialmente una specifica
implementazione successivamente l’implementazione può
essere cambiata (migliorata, corretta) senza che sia necessario cambiare il codice dell’applicazione scritta (basta ricompilare)
Compilazione Separata
Idea alla base di questo meccanismo “riuso” del codice (un “mito” informatico) sviluppare il codice è costoso per quanto possibile, bisognerebbe evitare di
sviluppare di nuovo soluzioni già esistenti
Utilità delle librerie collezione di sottoprogrammi di utilizzo
sufficientemente generale di correttezza verificata
Tecnica per raffinamenti successivi
Individuare (preliminarmente) una strategia di dichiarazioni per la rappresentazione dei dati
Partire dalla specifica del problema complessivo e sviluppare il main()
Individuare una prima divisione sommaria del problema in passi (sottoproblemi) e supporre di disporre di un sottoprogramma per ciascun passo
Tecnica per raffinamenti successivi
Definire il prototipo del sottoprogramma (modalità di comunicazione con l’esterno)
Scrivere una prima versione del codice del main() usando sottoprogrammi che non esistono
Aggiungendo scheletri “vuoti” dei sottoprogrammi mancanti è già possibile compilare ed eseguire il codice per verificare
Per completare la soluzione, è necessario scrivere il corpo dei sottoprogrammi mancanti In alcuni casi il sottoprogramma è
sufficientemente semplice da procedere per scrittura diretta del codice
In altri casi il sottoprogramma viene visto come un sottoproblema da affrontare e si riapplica il metodo
Approccio dall’alto (“top-down”) l’approccio procede da problemi più generali a
problemi via via più specifici
Tecnica per raffinamenti successivi
Linee guida per la scrittura di codice
Linea guida n. 1 – Semplicità adottare sempre la soluzione più semplice tra
quelle che potrebbero funzionare non complicare mai inutilmente il codice
In generale la prima soluzione ad un problema non è mai
la migliore conviene migliorarla e renderla più generale
con il tempo, quando il problema è più chiaro
Linee guida per la scrittura di codice
Linea guida n. 2 – Leggibilità adottare regole di stile scegliere accuratamente gli identificatori per
variabili e sottoprogrammi - notazione cammello
indentare il codice adottare regole per la posizione delle
parentesi utilizzare sempre le parentesi
Linee guida per la scrittura di codice
Linea guida n. 3 – Semplicità: scrivere moduli brevi nel caso di problemi complessi, spezzarli in più
passi per frammentare la soluzione il codice di un sottoprogramma non dovrebbe
mai richiedere più di 30 secondi per essere interpretato da un altro programmatore
Linee guida per la scrittura di codice
Linea guida n. 4 – Modularità adottare la metodologia incrementale procedere per raffinamenti successivi
Linea guida n. 5 – Verificabilità compilare progressivamente e
frequentemente il codice verificare progressivamente il codice
eseguibile
Linea guida n. 6 – Parametrizzabilità ragionare accuratamente sui parametri scegliere con cura quali e quanti parametri
(evitare parametri inutili) scegliere con cura il tipo dei parametri (standard
o per riferimento)
Linee guida per la scrittura di codice
Linee guida per la scrittura di codice
Linea guida n. 7 – Modularità “minimizzare l’accoppiamento” tra i
sottoprogrammi analizzare il diagramma delle chiamate verificare che la logica applicativa del
programma sia chiara ed ordinata
Linea guida n. 8 – Modularità non utilizzare mai variabili globali è consentito di utilizzare costanti globali
Linee guida per la scrittura di codice
Linea guida n. 9 - Modularità “massimizzare la coesione” all’interno di un
sottoprogramma ogni sottoprogramma deve avere una funzione
precisa nell’applicazione deve risolvere un problema ben preciso e non
fare due o più cose diverse
Linea guida n. 10 - Modularità separare i sottoprogrammi “orientati
all’elaborazione” dai sottoprogrammi “orientati all’interazione con l’utente”
i secondi sono meno riutilizzabili, sia nella stessa applicazione che in applicazioni diverse
i primi dovrebbero essere pensati per essere per quanto possibile riutilizzabili
Linee guida per la scrittura di codice
Basi di Dati
Basi di DatiDefinizione
La base di dati (DB) è una collezione di dati logicamente correlati e rappresentati in modo omogeneo, utilizzati per rappresentare le informazioni di interesse per un sistema informativo
I dati costituiscono una risorsa per l’organizzazione che li gestisce, un patrimonio da sfruttare e proteggere
Il Data Base Management System (DBMS) è un sistema software in grado di: gestire collezioni di dati grandi, condivise e
persistenti assicurare la loro affidabilità e privatezza essere efficiente ed efficace disaccoppiare il modello dati dalla
rappresentazione fisica
Basi di DatiDBMS
Basi di DatiModello di Dati
Un modello di dati è un insieme di concetti utilizzati per organizzare i dati di interesse e descrivere la struttura in modo che risulti comprensibile ad un elaboratore
Deve consentire di rappresentare le entità, i suoi attributi e le relazioni tra le entità
I modelli di dati più conosciuti sono: Modello gerarchico Modello reticolare Modello ad oggetti Modello relazionale
Basi di DatiModello gerarchico
Nel modello gerarchico i dati sono organizzati in record connessi tra loro secondo strutture ad albero.
Un albero può essere definito come un insieme di elementi (detti nodi) collegati tra loro da una relazione di ordine parziale (ossia che sussiste solo per alcune coppie di nodi).
Basi di DatiModello gerarchico
Una struttura gerarchica può rappresentarsi graficamente come un albero rovesciato; da questa rappresentazione derivano molti termini del gergo: radice, ramo, nodo, foglia.
Strutture gerarchiche si trovano in molti campi; la più classica è l'albero genealogico dal quale derivano altri termini del gergo informatico: padre, figlio...
Le strutture ad albero sono molto usate in Informatica: molti sistemi operativi (p.es. DOS, Windows, Unix ...)
organizzano i file sul disco in un albero (file-system); Ci sono una serie di regole:
Ogni record può avere solo 1 padre (genera ridondanza)
Il livello più alto è il punto di accesso a tutto La cancellazione di un record elimina a cascata tutti i
record figli Comporta una forte dipendenza dei programmi
dalle strutture
Basi di DatiModello gerarchico
Basi di DatiModello reticolare
Una struttura reticolare, (o reticolo o grafo) è un insieme di nodi liberamente connessi tra di loro. I collegamenti tra due nodi si dicono archi
Gli archi possono essere semplici o orientati.
semplici: il collegamento è bilaterale
orientati: il collegamento è unilaterale
Basi di DatiModello reticolare
Nel modello reticolare i nodi sono legati tra di loro tramite strutture ad anello, che consentono l’accesso ai dati + facilmente.
Può essere visto come una estensione del modello gerarchico in cui i figli possono avere + padri.
Un grafo si dice: connesso: se da ogni nodo è possibile
raggiungere un qualsiasi altro nodo del grafo. non connesso: può essere visto come un
insieme di grafi connessi, isolati uno dall'altro.
Vantaggi: Ogni nodo può permettere di raggiungere un
determinato campo. Un record può avere + padri (evita ridondanza)
Basi di DatiModello reticolare
Basi di DatiModello ad Oggetti
Nel modello dei dati a oggetti le entità del dominio vengono modellate con oggetti e relazioni fra oggetti.
Un ODBMS (Object Data Base Management System) offre le funzioni necessarie a rendere persistenti collezioni di oggetti e le relazioni fra di loro.
Vantaggi: La naturalezza nel rappresentare dati
complessi e l'abilità ad accedervi in modo efficiente sono il principale punto a favore di un ODBMS rispetto a un RDBMS.
continua… A differenza che nel modello relazionale, nel
modello a oggetti gli attributi di un oggetto possono essere di qualunque tipo: in particolare, un oggetto può contenere altri oggetti.
Inoltre l'ODBMS può essere istruito per privilegiare gli accessi a gruppi di oggetti eterogenei, in modo che il caricamento di un oggetto con tutte le sue componenti si svolga in un'operazione unica di accesso al disco; questa stessa operazione nei RDBMS deve essere eseguita tramite una o più JOIN, che è una delle operazioni più costose di un RDBMS.
Basi di DatiModello ad Oggetti
Basi di DatiModello ad Oggetti
Svantaggi: la mancanza di validi
strumenti di amministrazione
una presunta difficoltà di apprendimento della tecnologia
una certa immaturità della tecnologia rispetto alle applicazioni critiche
una scarsa scalabilità
Ma… In molti casi questi problemi sono state superati
da soluzioni affidabili, nelle quali i motori dei database lavorano come quelli dei tradizionali RDBMS per assicurare una gestione semplice e la giusta scalabilità
Basi di DatiModello ad Oggetti
Basi di DatiModello Relazionale
Nel modello relazionale i dati sono organizzati in tabelle che rappresentano sia le entità che le relazioni tra di esse
Esso si basa sull'algebra relazionale e sulla teoria degli insiemi ed è strutturato attorno al concetto di relazione (detta anche tabella).
Basi di DatiModello Relazionale
Oggi è uno dei modelli logici più utilizzati, implementato su moltissimi DBMS sia commerciali che open source
Venne proposto da Edgar F. Codd nel 1970 per semplificare la scrittura di interrogazioni sui database e per favorire l’indipendenza dei dati; venne reso disponibile come modello logico in DBMS reali nel 1981.
Codd propose 12 regole per definire un “database relazionale”: Regola 1: l'informazione deve essere
rappresentata sotto forma di tabelle. Regola 2: Tutti i dati devono essere accessibili
senza ambiguità Regola 3: Il DBMS deve consentire all'utente di
lasciare un campo vuoto, o con valore NULL. Regola 4: la descrizione del database deve
avvenire ad un livello logico tramite i metadati (come DDL).
Basi di DatiModello Relazionale
Basi di DatiModello Relazionale
continua… Regola 5: deve esistere un linguaggio che
permetta la gestione dei dati (come SQL) Regola 6: si possono creare delle viste per
vedere una parte dei dati. queste viste devono essere aggiornabili
Regola 7: le operazioni che avvengono su database devono avvenire anche sulle tabelle
Regola 8: I dati memorizzati nel database devono essere indipendenti dalle strutture di memorizzazione fisiche
continua… Regola 9: i dati devono essere indipendenti
dalla struttura logica del database per garantire la crescita naturale e la manutenzione del database
Regola 10: le restrizioni sui dati devono essere memorizzate nel database
Regola 11: l'accesso ai dati è indipendente dal tipo di supporto per la lettura o memorizzazione degli stessi
Regola 12: l'accesso ai dati non deve annullare le restrizioni o i vincoli di integrità del linguaggio principale (SQL).
Basi di DatiModello Relazionale
Algebra Relazionale
Basi di DatiAlgebra Relazionale
L'algebra relazione è un linguaggio procedurale cioè una descrizione della procedura da attuare per ottenere il risultato.
Operatori fondamentali (di base): operatori unari di Selezione operatori unari di Proiezione operatori unari di Ridenominazione operatori binari di Prodotto Cartesiano operatori binari di Unione operatori binari di Differenza
Operatori derivati (da quelli di base): operatore binario di Intersezione operatore di join in varie forme (theta-join,
natural-join, etc.)
Basi di DatiAlgebra Relazionale
Basi di DatiAlgebra Relazionale
L’operazione di selezione estrae un sottoinsieme di righe da una tabella
in base a delle condizioni imposte ai valori contenuti n una o più colonne.
L’operazione di proiezione estrae un sottoinsieme di colonne da una
tabella
L'operatore di ridenominazione: modifica lo schema di una relazione, cambiando
i nomi di uno o più attributi.
L’operatore di prodotto cartesiano: l'insieme di tutte le possibili coppie di due
insiemi A e B che hanno per primo elemento un elemento di A e per secondo elemento un elemento di B.
Esempio: A{1,3} B{2,5} = {(1,2), (1,5), (3,2), (3,5)}
Basi di DatiAlgebra Relazionale
Basi di DatiAlgebra Relazionale
Operatore di unione relazione contenente i valori
che appartengono a A ed a B (A+B)
Operazione di differenza relazione contenente i valori
che appartengono ad A e non appartengono a B (A-B)
Operazione di intersezione relazione contenente i valori
che appartengono sia ad A che a B
Basi di DatiAlgebra Relazionale
L’operazione di congiunzione ( join ) combina le operazioni di prodotto e di
selezione tra due (o più tabelle); viene cioè effettuato prima il prodotto fra le
tabelle e poi estratte solo le righe che soddisfano una determinata condizione tra le colonne della prima e della seconda tabella.
Vincoli di integrità
Basi di DatiVincoli di integrità
I vincoli di integrità sono quei vincoli che devono essere rispettate affinché si possa considerare la bontà dell’informazione in essa contenuta.
Si disinguono in vincoli Intra-relazionali: quando interessano una tabella
Chiave primaria Chiave univoca Vincoli di tupla
Inter-relazionali: quando interessano + tabelle Chiave esterna
Vincoli intra-relazionali, interessano una sola tabella
Chiave primaria Definizione: un insieme K di attributi è
superchiave per una relazione r se r non contiene due ennuple distinte t1 e t2 tali che t1[K] = t2[K]
Traduzione della definizione: serve a identificare univocamente le righe della tabella, dichiarando uno o più attributi come chiave primaria.
Due righe distinte non possono avere lo stesso valore sui campi scelti come primary key.
Basi di DatiVincoli di integrità
Basi di DatiVincoli di integrità
Chiave univoca implementa una caratteristica simile alla chiave
primaria, con la particolarità che gli attributi coinvolti possono assumere il valore nullo.
Si può definire il vincolo su uno o più attributi della tabella.
Basi di DatiVincoli di integrità
Vincoli di tupla Definizione: vincolo di dominio di ciascuna
ennupla, indipendentemente dalle altre ennuple Traduzione della definizione: condizione su
una colonna della tabella Un esempio è il vincolo “not null”, usato per
dichiarare che un dato attributo non può assumere il valore nullo.
Basi di Dati Vincoli di integrità
Vincoli inter-relazionali definiscono legami tra due o più tabelle
Chiave esterna Definizione: Un vincolo di integrità
referenziale (detto anche vincolo di “foreign key”) fra un insieme di attributi X di una relazione R1 e un’altra relazione R2 impone ai valori su X di ciascuna ennupla dell’istanza di R1 di comparire come valori della chiave (primaria) dell’istanza di R2
Traduzione della definizione: I valori delle colonne di una data tabella possono assumere soltanto dei valori specificati nelle colonne di un'altra tabella.
SQL Structured Query
Language
Basi di Dati SQL
L'SQL nasce nel 1974 ad opera di Donald Chamberlin, nei laboratori dell'IBM. Nasce come strumento per lavorare con database che seguano il modello relazionale.
Nel 1981 IBM iniziò a vendere alcuni prodotti relazionali e nel 1983 rilasciò DB2, il suo DBMS relazionale diffuso ancor oggi insieme a SQL.
L'ANSI adottò SQL come standard fin dal 1986, senza apportare modifiche sostanziali alla versione inizialmente sviluppata da IBM.
Basi di Dati SQL
Possiamo distinguere 3 versioni di SQL SQL Base
SQL-86 - costrutti base SQL-89 integrità referenziale
SQL-2 SQL- 92: entry level, intermediate level, full
SQL-3 SQL-99 estensione ad oggetti, trigger, .. SL-2003 Estensione del modello a oggetti,
SQL/XML
I sistemi commerciali sono classificati in base all’aderenza allo standard 92 Entry Level (SQL-89) Intermediate Level Full SQL (SQL-92)
Basi di Dati SQL
Basi di Dati SQL
Il linguaggio SQL (Structured Query Language) è l’insieme dei comandi che possono essere usati per accedere ai database relazionali
Caratteristiche: Linguaggio di alto livello Elabora più elementi insieme Utilizzato a più livelli (utente, amministratore) Estremamente portatile tra piattaforme
Basi di Dati SQL
Data Definition Language (DDL) permette di creare e cancellare database o di
modificarne la struttura Data Manipulation Language (DML)
permette di inserire, cancellare, modificare e leggere i dati
Data Control Language (DCL) permette di gestire gli utenti e i permessi
Basi di Dati SQL
Data Definition Language (DDL) ALTER (INDEX, TABLE, VIEW) CREATE (INDEX, TABLE, VIEW) DROP (INDEX, TABLE, VIEW) RENAME (TABLE, VIEW, SEQUENCE) TRUNCATE (TABLE)
Data Manipulation Language (DML) SELECT DELETE INSERT UPDATE
Basi di Dati SQL
Basi di Dati SQL
Data Control Language (DCL) GRANT REVOKE COMMIT ROLLBACK SAVEPOINT LOCK TABLE
Basi di Dati SQL
A seconda del database che si utilizza, sono presenti diversi tipi di dati.
Nel seguito un elenco di tipi del database Oracle:
CHAR stringa di caratteri di lunghezza stabilita VARCHAR2 stringa di caratteri di lunghezza variabile
(max 2000 caratteri) LONG stringa di caratteri di lunghezza variabile
(max 2GB) NUMBER dato numerico intero DECIMAL dato numerico decimale INTEGER dato numerico intero
continua…
SMALLINT dato numerico intero DATE data ed orario ROWID indirizzo fisico del record RAW stringa binaria per contenere
immagini, programmi LONG RAW stringa binaria per contenere
immagini, programmi (max 2GB) CLOB stringa binaria per contenere
caratteri (max 2GB)
Basi di Dati SQL
Progettazione di architetture Web
Obiettivi
La definizione dell’architettura dell’applicazione deve assicurare il raggiungimento di un adeguato livello di servizio nei confronti delle seguenti dimensioni: Prestazioni: sostenere il carico Scalabilità: estendibile per mantenere prestazioni Disponibilità: funzionalità continuative Mantenimento dello stato: preservare stato utente Sicurezza: dati riservati ad accesso autenticato
Vincoli decisionali
La progettazione è condizionata da vincoli di carattere fisico, economico e organizzativo: Costi: budget progetto limita lescelte Complessità: la semplicità costa meno Infrastruttura azienda: condiziona le scelte
Scenari di installazione
Lo scenario di istallazione condiziona l’organizzazione aziendale perché definisce il servizio che si vuole raggiungere Interna: locata e gestita in azienda Housing: locata all’esterno ma gestita
dall’azienda Hosting: locata e gestita all’esterno
Architettura standard Nella realizzazione di una
architettura web a pagine dinamica possiamo distinguere diversi componenti: Utente Internet/Intranet Web Server Application Server DataBase
Server singolo
Tutti i componenti (Web Server, Application Server, Database) sono installati su un’unica macchina fisica accessibile: tramite la LAN aziendale tramite Internet.
Nel caso di accesso da Internet il router permette il collegamento con la rete internet il Firewall garantisce le regole di controllo degli
accessi
Server doppio
Il primo passo per migliorare l’architettura consiste nel dedicare una macchina al database, in modo da migliorare prestazioni, scalabilità, disponibilità e sicurezza attraverso la creazione di una DMZ (DeMilitarized Zone)
Replica verticale e orizzontale
Per consentire una maggiore garanzia in termini di scalabilità e tolleranza ai guasti, è prevista la configurazione che preveda: Replica verticale: upgrade del server Replica orizzontale: replica del server
Conservazione dello stato
Per garantire la conservazione dello stato dell’utente, occorre gestire: L’affinità di sessione: il bilanciatore di carico invia
l’utente al server che gestisce la sua sessione Base dati di sessioni: conservazioni delle sessioni in
una base dati utilizzabili in caso di fail-over.
Server triplo
Per consentire una maggiore efficienza in termini di risposta, possiamo separare il Web Server e l’Application Server in server distinti in modo da gestire meglio il loro funzionamento
Maggiori garanzie
La massima flessibilità di configurazione e scalablità può essere raggiunta garantendo anche la replica di tutti i server coinvolti.
Ottimizzare le prestazioni
Affinchè sia possibile migliorare le prestazioni della nostra applicazione, occorre seguire alcuni buoni consigli: Migliorare il codice applicativo Estendere la configurazione (repliche) Introdurre meccanismi di caching
Caching
Il caching consiste nel memorizzare temporaneamente le risorse in una locazione ad accesso veloce, da cui sia possibile recuperarle in seguito.
Ciò consente: Ridurre la latenza di rete: percorso del client è +
ridotto Riduzione dello sforzo di calcolo: uso di copie
salvate
Caching
Dove posizionare la cache: Caching su browser: browser del client Proxy caching: proxy aziendale della LAN del
client Content Delivery Network: infrastrutture di
caching gestite dal fornitore di servizi di contenuti
Accelleratori di server: buffer posizionato davanti ai cluster di server di contenuti
Popolamento della cache
Gestione delle copie dei contenuti: Approccio PUSH: trasferimento in massa dei
contenuti dalla loro sede alla cache (in linea o fuori linea)
Approccio PULL: su richiesta del client. Se l’oggetto è nella cache (cache hit) viene restituito, altrimenti (cache miss) viene richiesto al server e si aggiorna la cache.
Protocollo di invalidazione della cache: Insieme di regole che stabiliscono la durata di un
oggetto in cache ed i criteri per stabilire che un oggetto non è più conforme all’oggetto originale