corso progettazione

Post on 20-Jan-2015

3.202 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

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

top related