Concetti Chiave
- Collegare file per eseguibili semplifica lo sviluppo di programmi complessi, consentendo a gruppi di lavoro di gestire moduli separati.
- Il linguaggio C++ offre meccanismi, come la compilazione separata e l'inclusione testuale, per una corretta strutturazione modulare del codice.
- È importante separare la specifica di un modulo dalla sua implementazione tramite file di intestazione e file di implementazione distinti.
- La programmazione modulare migliora la chiarezza del programma e consente a più programmatori di lavorare simultaneamente su file diversi.
- L'uso di librerie di moduli software protegge la proprietà intellettuale e riduce la necessità di ricompilare i moduli di libreria.
Collegamento di file per eseguibili
La possibilità di collegare tra loro più file per produrre un unico eseguibile può essere sfruttata anche per rendere
più semplice la fase di sviluppo di un pgm molto articolato (applicazione).
Infatti, facendo riferimento ad un ipotetico gruppo di lavoro chiamato a produrre un pgm di una certa complessità, è possibile prevedere che:
- L’intero gruppo analizzi nel suo insieme il problema ed individui le funzioni e le caratteristiche dei moduli in cui può essere suddiviso il pgm.
- Ciascun componente si prenda carico di un modulo e lo sviluppi fino a costruire autonomamente il codice oggetto su un proprio file.
- I moduli prodotti vengono collegati tra loro tramite il linker per produrre il codice eseguibile, da sottoporre ad una verifica finale.
Sviluppo modulare in C++
L'uso disciplinato di alcuni meccanismi del linguaggio C++ consente una corretta strutturazione di un programma in moduli.
Tra i principali meccanismi vi sono:
- la compilazione separata,
- l'inclusione testuale,
- le dichiarazioni extern,
- l'uso dei prototipi di funzioni.
SÈ buona norma tenere separata la specifica di un modulo dalla sua implementazione.
Un programma utente di un modulo A deve conoscerne la specifica, ma disinteressarsi dei dettagli della sua implementazione.
Ciò può essere realizzato scrivendo un file di intestazione o header fileile (con l’estensione .h) contenente le dichiarazioni che costituiscono l’interfaccia di A, ed un file separato per l’implementazione di A.
L'header file deve essere incluso (mediante la direttiva al preprocessore #include) nella implementazione, ed in ogni modulo
utente, affinché il compilatore possa eseguire i necessari controlli.
Queste tecniche di sviluppo modulare consentono lo sviluppo su base professionale di librerie di moduli
software.
Il produttore di una libreria distribuisce:
- i file di intestazione (che devono essere inclusi dell’utilizzatore nel codice sorgente) dei moduli che
fanno parte della libreria;
- i moduli di libreria in formato oggetto (già compilati), che l’utilizzatore deve collegare assieme ai propri moduli
oggetto.
Tale scelta è tipicamente motivata da esigenze di tutela della proprietà, ed inoltre evita di dover ricompilare i moduli di libreria.
Vantaggi della modularità
Ricapitolando, quali sono i vantaggi del dividere un programma in più moduli sorgente?
La struttura di un programma medio-grande è più chiara se il programma è suddiviso in più file sorgenti.
Più programmatori possono lavorare allo stesso tempo su file diversi. Non occorre ricompilare l’intero programma ogni volta
che si effettua una piccola modifica.
Si possono usare librerie senza dovere includere fisicamente il codice sorgente nel programma (in effetti, spesso il sorgente non è disponibile).
Domande da interrogazione
- Qual è il vantaggio principale di collegare più file per creare un unico eseguibile?
- Quali meccanismi del C++ favoriscono lo sviluppo modulare?
- Come si separano specifica e implementazione in un modulo?
- Quali sono i vantaggi della modularità in un programma?
Collegare più file semplifica lo sviluppo di programmi complessi, permettendo a diversi membri di un gruppo di lavoro di sviluppare autonomamente moduli e poi unirli tramite un linker per ottenere un codice eseguibile.
I principali meccanismi includono la compilazione separata, l'inclusione testuale, le dichiarazioni extern e l'uso dei prototipi di funzioni, che consentono una corretta strutturazione del programma in moduli.
La specifica di un modulo deve essere contenuta in un file di intestazione (.h), mentre l'implementazione deve essere in un file separato. L'header file deve essere incluso nei moduli utente per garantire i necessari controlli da parte del compilatore.
La modularità rende la struttura del programma più chiara, consente a più programmatori di lavorare simultaneamente su file diversi e evita la necessità di ricompilare l'intero programma per piccole modifiche.