Concetti Chiave
- I principi di sviluppo del software includono l'uso di nomi significativi, costanti e commenti ben strutturati per garantire leggibilità e manutenzione.
- Il modello a cascata del ciclo di vita del software segue fasi specifiche: analisi, progettazione, programmazione, integrazione e manutenzione.
- Il processo di sviluppo prevede la composizione modulare del programma, l'uso di librerie e la distribuzione di programmi in formato oggetto per protezione della proprietà intellettuale.
- La preparazione del testo origine coinvolge l'uso di editor per file .c/.cpp e la suddivisione del codice in moduli o unità di traduzione.
- La fase di collegamento combina i moduli oggetto in un programma eseguibile, segnalando errori se mancano simboli o implementazioni necessarie.
Principi da seguire per costruire programmi leggibili e facilmente mantenibili
- Utilizzare nomi significativi (per costanti, tipi, variabili, funzioni/procedure,…)
- Utilizzare le costanti
- Uso dei commenti:
- Sintetici
- Significativi
- Aggiornati con la variazione del codice
- Indentare con cura
- Ogni funzione/procedura deve fare una ed una sola cosa
Ciclo di vita del software
Modello a cascata:
- Analisi e specifica dei requisiti (si risponde alla domanda: che cosa?)
- Progettazione (si risponde alla domanda: come?)
- Programmazione e test di unità
- Integrazione e test di sistema
- Manutenzione (correttiva, adattativa, evolutiva)
(Fasi trasversali: Documentazione, Piano di test, Gestione e controllo del progetto)
- Il ciclo di sviluppo di un programma prevede una serie di fasi atte a conferire alcune significative flessibilità:
- la composizione di un programma di grosse dimensioni attraverso più moduli;
- l’uso di librerie di funzioni già compilate;
- il collegamento di moduli eventualmente scritti con differente linguaggio origine;
- la possibilità di porre in commercio programmi o moduli nella forma oggetto e non in forma origine; è questa una scelta di molti produttori di software per motivi di tutela della proprietà.
1.
Preparazione del testo origine- Il testo origine viene preparato mediante un editor e viene memorizzato in file con estensione .c/.cpp.
- Il codice sorgente di una applicazione viene, in generale, strutturato in più moduli (detti anche unità di traduzione), redatti da più programmatori.
- Ciascuna unità di traduzione viene sottoposta separatamente alle successive fasi di precompilazione e compilazione.
- La struttura di un generico modulo è schematicamente la seguente:
- Direttive di precompilazione
- Dichiarazioni di nomi di tipo
- Dichiarazioni di costanti e di variabili
- Dichiarazioni di funzioni (prototipi)
- Definizioni di costanti e di variabili
- Definizioni di funzioni
2. Precompilazione
- il testo origine (sorgente) contenuto nel file .c/.cpp viene
elaborato da un programma detto preprocessore (o
precompilatore) che modifica il codice secondo alcune
direttive fornitegli dal programmatore;
- le direttive al preprocessore sono contenute nelle righe di
testo che cominciano col carattere ‘# ‘;
- l’output del precompilatore è codice sorgente che va al
compilatore vero e proprio.
3. Compilazione delle unità
- le unità del programma vengono compilate separatamente mediante
l’attivazione del compilatore;
- per ciascuna unità di traduzione, il testo origine viene trasformato in testo
oggetto e memorizzato in un file con estensione .obj (oppure .o)
I file oggetto
- Il formato dei file oggetto è indipendente dal linguaggio ad alto livello
- Un file oggetto contiene, oltre al codice macchina:
- una tabella dei simboli (funzioni e variabili esterne o globali) definiti nel
corrispondente file sorgente
- una tabella dei simboli utilizzati ma non definiti nel modulo (quindi
definiti in altri moduli)
4. Collegamento (linkage)
- I diversi moduli oggetto costituenti il programma (p1.obj,…, pn.obj) vengono
combinati fra loro ed assieme al supporto al tempo di esecuzione, mediante
un programma collegatore (linker).
- Il collegatore produce il testo eseguibile del programma in unico file (per
esempio prog.exe)
- Anche se il programma consta di un solo file sorgente, alcune librerie sono
necessarie (ad es. per l’ingresso-uscita dei dati)
- Il linker può segnalare errori, tipicamente perché non è possibile associare
ad un simbolo richiesto da un modulo alcun simbolo tra quelli esportati da
tutti gli altri moduli.
- Ciò può avvenire, per esempio, in uno dei seguenti casi:
- ci si è dimenticati di indicare qualche file .obj al linker
- manca l’implementazione di qualche funzione
- esistono più definizioni di uno stesso nome di funzione o variabile globale.
Domande da interrogazione
- Quali sono i principi fondamentali per scrivere programmi leggibili e mantenibili?
- Quali sono le fasi del modello a cascata nel ciclo di vita del software?
- Come viene preparato il testo origine di un programma?
- Qual è il ruolo del preprocessore nella precompilazione?
- Cosa avviene durante la fase di collegamento (linkage)?
I principi includono l'uso di nomi significativi, l'utilizzo di costanti, commenti sintetici e aggiornati, una corretta indentazione e la progettazione di funzioni che svolgono un'unica operazione.
Le fasi includono l'analisi e specifica dei requisiti, progettazione, programmazione e test di unità, integrazione e test di sistema, e manutenzione.
Il testo origine viene preparato con un editor e memorizzato in file con estensione .c/.cpp, strutturato in moduli redatti da più programmatori e sottoposto a precompilazione e compilazione.
Il preprocessore elabora il testo sorgente modificandolo secondo direttive specifiche, producendo un codice sorgente che viene poi passato al compilatore.
I moduli oggetto vengono combinati con il supporto al tempo di esecuzione tramite un linker, che produce il testo eseguibile del programma e può segnalare errori se ci sono simboli non associati correttamente.