Programmazione strutturata

Da Wikipedia, l'enciclopedia libera.

La programmazione strutturata è un paradigma di programmazione emerso fra gli anni sessanta e gli anni settanta nel contesto della programmazione procedurale. I concetti introdotti dalla programmazione strutturata sono alla base di numerosi altri paradigmi procedurali successivi, non ultimo quello orientato agli oggetti.

Origini concettuali[modifica | modifica sorgente]

Le idee chiave della programmazione strutturata si possono ricondurre alla critica della struttura di controllo del salto incondizionato (o goto, "vai a"), che rappresentava, negli anni sessanta, lo strumento fondamentale per la definizione di algoritmi complessi nel software. In un celebre articolo del 1968, Goto statement considered harmful, Edsger Dijkstra discusse approfonditamente gli effetti deleteri del goto sulla qualità del software, e in particolare sulla sua leggibilità e modificabilità (il cosiddetto problema dello spaghetti code).

Un'altra celebre pubblicazione che risultò fondamentale all'affermarsi della programmazione strutturata fu Flow Diagrams, Turing Machines, and Languages with Only Two Formation Rules, in cui Corrado Böhm e Giuseppe Jacopini dimostrarono il loro celebre teorema. Secondo tale teorema, qualsiasi programma scritto usando il goto poteva essere riscritto senza, a patto di avere a disposizione altri tre tipi di strutture di controllo: sequenza, selezione e ciclo. Il risultato di Böhm-Jacopini può anche essere espresso dicendo che, dato un qualunque diagramma di flusso, ne esiste almeno un altro che a parità di input produce sempre gli stessi output del primo e in cui i nodi del diagramma di flusso rispettano un certo insieme di vincoli.

La strutturazione del controllo[modifica | modifica sorgente]

Exquisite-kfind.png Per approfondire, vedi Struttura di controllo.

Le strutture di controllo ammesse dai linguaggi strutturati, e le regole sintattiche e semantiche del loro uso, possono variare nei dettagli specifici; tuttavia, devono essere rispettati un insieme di requisiti fondamentali:

  • completezza. Un linguaggio strutturato deve fornire la sequenza, almeno una struttura di tipo alternativa, e almeno una struttura di tipo iterativa;
  • singolo punto di ingresso e di uscita. Idealmente, ogni struttura di controllo, completa delle istruzioni controllate, deve poter essere considerata come una singola macro-istruzione dal punto di vista del controllo complessivo, con un ben identificato punto di ingresso e un ben identificato punto di uscita.
  • componibilità. Ogni struttura di controllo può avere fra le sue istruzioni controllate, ricorsivamente, altre strutture di controllo (senza limiti).

Gli ultimi due vincoli fanno sì che, per quanto concerne il flusso del controllo, ciascuna struttura di controllo definisca un ambito completamente isolato dalle altre, e incapace di interferire o subire interferenze. Questo rappresenta un requisito indispensabile per l'applicazione di metodologie di progetto e sviluppo tradizionalmente legate alla programmazione strutturata, come la progettazione top-down e lo sviluppo per raffinamenti successivi.

Sequenza[modifica | modifica sorgente]

Il seguente diagramma mostra la struttura generale della sequenza. In rosso viene mostrato l'unico punto d'ingresso, in verde l'unico punto d'uscita.

Sequenza di istruzioni

Selezione[modifica | modifica sorgente]

Il seguente diagramma mostra due esempi di alternative strutturate (a sinistra un if..then..else, a destra un if..then). In rosso viene mostrato l'unico punto d'ingresso, in verde l'unico punto d'uscita.

Due tipi di iterazioni strutturate

Iterazione[modifica | modifica sorgente]

Il seguente diagramma mostra due esempi di iterazioni strutturate (a sinistra un while..do.., a destra un repeat..until..). In rosso viene mostrato l'unico punto d'ingresso, in verde l'unico punto d'uscita.

Due tipi di alternative strutturate

Nuove rappresentazioni grafiche.[modifica | modifica sorgente]

In azzurro i diagrammi scatuli, inventati per la nuova teoria. In verde vedete i loro equivalenti.

Componibilità[modifica | modifica sorgente]

Il seguente diagramma mostra un esempio di composizione di due strutture di controllo: una struttura di selezione viene inserita in una iterativa. Si può osservare che l'intera composizione mantiene un unico punto d'ingresso e un unico punto d'uscita.

Iterazione di alternative

I linguaggi di programmazione strutturati[modifica | modifica sorgente]

I linguaggi di programmazione strutturati iniziarono a emergere intorno all'inizio degli anni settanta. Incorporando le idee di Böhm e Jacopini, essi offrivano un insieme di strutture di controllo completo, ovvero almeno una forma di sequenza, una di alternativa e una di iterazione. In effetti, nella maggior parte dei casi, venivano fornite alcune varianti per ciascuna famiglia di strutture di controllo. Quasi tutti i progettisti di questi linguaggi, comunque, mantennero il goto come possibile strumento per la strutturazione del controllo (spesso sconsigliandone l'uso).

Nella maggior parte dei casi, questi linguaggi introducevano una nozione di blocco, su cui spesso erano basate caratteristiche correlate del linguaggio, come le scope rules per gli identificatori (per esempio le variabili).

Fra i linguaggi tipici del paradigma strutturato si possono citare:

La programmazione strutturata nella storia della programmazione[modifica | modifica sorgente]

La programmazione strutturata rappresenta una tappa fondamentale dell'evoluzione della cosiddetta programmazione mainstream, ovvero di quella sequenza di paradigmi che, nel corso degli anni, l'uno succedendo all'altro, hanno dominato il mondo dell'industria del software. In particolare, sia il successivo paradigma della programmazione modulare che il paradigma della programmazione orientata agli oggetti hanno mantenuto gli stessi princìpi della programmazione strutturata per quanto concerne la strutturazione del controllo "ordinario" e "sequenziale", introducendo nuovi meccanismi solo per affrontare le tematiche (nate successivamente) della gestione delle eccezioni e dello sviluppo di programmi concorrenti.

Voci correlate[modifica | modifica sorgente]

Collegamenti esterni[modifica | modifica sorgente]