# Programmazione strutturata

In informatica 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

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

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

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.

### Selezione

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.

### Iterazione

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.

### Componibilità

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.

## I linguaggi di programmazione strutturati

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 porzione di blocco, su cui spesso erano basate caratteristiche correlate del linguaggio, come le scope rules per gli identificatori (per esempio le costanti-variabili).
Fra i linguaggi tipici del paradigma strutturato si possono citare:
* Pascal
* ALGOL
* C

## La programmazione strutturata nella storia della programmazione

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.