Concetti Chiave
- Programmi leggibili richiedono nomi significativi per variabili, costanti e funzioni, facilitando la comprensione del codice.
- Il ciclo di vita del software include fasi come analisi, progettazione, programmazione, test e manutenzione, garantendo un approccio strutturato allo sviluppo.
- Il testo origine è preparato tramite editor e suddiviso in moduli, permettendo la collaborazione tra programmatori e una gestione più efficace del codice.
- La precompilazione modifica il codice sorgente secondo direttive specifiche, generando un output che viene poi inviato al compilatore per la compilazione finale.
- Durante il collegamento, i moduli oggetto vengono combinati per creare un file eseguibile, con possibilità di errori se ci sono simboli non definiti correttamente.
Principi per programmi leggibili
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
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
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 e compilazione
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 e file oggetto
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 costruire programmi leggibili?
- Quali sono le fasi del ciclo di vita del software secondo il modello a cascata?
- Come viene preparato il testo sorgente di un'applicazione?
- Qual è il ruolo del preprocessore nella fase di precompilazione?
- Cosa avviene durante il collegamento dei file oggetto?
I principi includono l'uso di nomi significativi per variabili e funzioni, l'uso di costanti, commenti sintetici e significativi, un'accurata indentazione e la regola che ogni funzione deve svolgere una sola operazione.
Le fasi comprendono analisi e specifica dei requisiti, progettazione, programmazione e test di unità, integrazione e test di sistema, e manutenzione, con fasi trasversali come documentazione e gestione del progetto.
Il testo sorgente è preparato tramite un editor e memorizzato in file con estensione .c/.cpp, strutturato in moduli che vengono sottoposti a precompilazione e compilazione separatamente.
Il preprocessore elabora il testo sorgente secondo le direttive fornite dal programmatore, producendo un codice sorgente che viene poi inviato al compilatore.
I moduli oggetto vengono combinati insieme tramite un programma collegatore, producendo un file eseguibile. Il linker può segnalare errori se ci sono simboli non associati o definizioni duplicate.