Insegnare tecniche moderne per la costruzione di sistemi software
$\Rightarrow$ utilizzando i concetti dei sistemi ad oggetti, che sono “mainstream”
Programma vs sistema software
Programma: un set di istruzioni che automatizzano la soluzione di una classe di problemi, spesso associato ad una visione algoritmica della computazione (Input $\rightarrow$ Output). Sistema software: un’aggregazione di componenti di varia natura (programmi, librerie, parti del sistema operativo, basi di dati, interfacce grafiche, servizi Web, rete, dispositivi hardware) che cooperano per fornire una funzionalità computazionale.
Casi di sistemi software
Esempi
Calcolatrice matematica
Applicazione per gestire esami universitari
Simulatore di circuiti elettronici, movimento di folle, movimento pianeti
Monitor e elaborazione di dati biometrici (pressione, dati cardiaci,..)
App per smartphone che mostra dove si trovano i miei contatti social
Video-game in cui personaggi virtuali vivono in un ambiente 3D
Controllore per dispositivi domotici (luce, termosifoni, acqua)
Caratteristiche comuni
Non meri programmi, ma sistemi “pilotati” da software
Includono componenti algoritmiche, ma anche interazioni complesse
Alcuni realizzabili già alla fine di questo corso, altri richiedono maggiore expertise
Fasi del processo di sviluppo
Analisi
Si definisce in modo preciso il problema da risolvere (non la soluzione!)
Design
Si definisce la struttura del sistema da sviluppare
progetto architetturale + progetto di dettaglio
si descrive la soluzione, ad uno specifico livello di dettaglio
Implementazione/codifica
Si realizza il sistema sulla base del progetto, scegliendo le tecnologie adeguate (efficienti, efficaci)
ad esempio, il linguaggio di programmazione
Attività di manutenzione: Collaudo, Deployment
Fasi necessarie, che spesso impiegano più del 70% delle risorse complessive
Quali cause possono comportare il fallimento di un progetto SW?
Inadeguata analisi (requisiti non compresi appieno)
Inadeguata (o assente) progettazione
Cattive pratiche di programmazione
Aspetti organizzativi nel team di sviluppo
Problem space vs solution space: il “buon progetto”
Problem space (fase di analisi)
L’insieme delle entità e relazioni nel mondo “reale” sulla base delle quali si formula il problema che il sistema software deve risolvere
per il gestionale per esami universitari: studente, corso, corso di laurea, appello, voto
Solution space (fase di progetto e implementazione)
Il corrispondente insieme di entità e relazioni nel mondo “artificiale” che devono risolvere
il problema (realizzate mediante i linguaggi e le tecnologie scelte e a fronte del progetto).
funzione per il calcolo della media
struttura dati per rappresentare i dati di uno studente
form per visualizzare gli esami di uno studente
Un buon progetto mappa al meglio il problem space nel solution space
Concetti del solution/problem space: “livello di astrazione”
Definizione di astrazione (nell’informatica)
È un metodo per descrivere un sistema informatico complesso mettendone da parte alcune caratteristiche specifiche, per facilitarne la progettazione, implementazione e manutenzione.
Un livello di astrazione è un insieme di concetti e relazioni che definiscono una astrazione, usabili quindi per definire in modo conveniente un sistema informatico
Il livello d’astrazione dei linguaggi di programmazione
Astrazione e programmazione
Ogni linguaggio di programmazione introduce un livello di astrazione
I concetti del sistema da realizzare (nel gestionale esami: corsi, voti, studenti, calcolo media voti) devono essere tradotti nei “costrutti” forniti dal linguaggio
È facile? È conveniente? È flessibile? Dipende dal linguaggio…
Il livello di astrazione del C (e della progr. procedurale/imperativa)
Stato del sistema $\Rightarrow$ È costituito da strutture dati (costruite con tipi primitivi, array, puntatori e struct) tenute in stack e/o heap
Dinamica $\Rightarrow$ Esecuzione di procedure imperative, innestate ricorsivamente appoggiandosi allo stack
Organizzazione $\Rightarrow$ Librerie come set di funzioni, ricongiunte in un unico programma all’atto della compilazione/linking
I limiti del linguaggio C
C porta ad una visione piuttosto machine-oriented
È un livello di astrazione fortemente influenzato dall’HW sul quale si eseguono i programmi (CPU, memoria)
uso criptico di direttive di compilazione
allocazione/deallocazione dinamica manuale della memoria via librerie
difficile controllo degli errori di esecuzione
difficoltà a controllare gli aspetti HW-dependent
difficoltà a modificare codice già “acquisito”
Nota: il C nasce negli anni ‘70 per rimpiazzare l’Assembly nell’implementazione del sistema operativo UNIX
La direzione dei linguaggi moderni – o di “alto livello” (d’astrazione)
Introdurre un livello di astrazione vicino al problema da risolvere, ignorando il più possibile i dettagli dell’HW per risolverlo
L’ecosistema dei linguaggi di programmazione
Linguaggi e livelli di astrazione / paradigma
C, Pascal: Computing function/procedure over data structures
Lisp, ML: Everything is a function
Java, C++, C#: Everything is an object (OO Programming)
$\Rightarrow$ L’OOP si è dimostrata efficace per sistemi complessi general-purpose
L’evoluzione del “mainstream”
Machine Lang $\xrightarrow{1950-1960}$ Assembly $\xrightarrow{1970-‘190}$ C $\xrightarrow{‘90-2000}$ OOP (Java,..) $\xrightarrow{?}$ ?
Il futuro dei linguaggi (e anche la direzione dei linguaggi OOP)