<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wx="http://ilps.science.uva.nl/WikiXML/wx" xml:lang="it" lang="it">
<head>
<title>Programmazione strutturata</title>
<meta name="wx_namespace" content="0"/>
<meta name="wx_pagename" content="Programmazione_strutturata"/>
<meta name="wx_page_id" content="26306"/>
</head>
<body>
<div id="wx_article">
<wx:section level="1" title="Programmazione strutturata" id="wxsec1"><h1 class="pagetitle" id="wx1">Programmazione strutturata</h1>

<p id="wx2">La <b id="wx3">programmazione strutturata</b> è un <a href="/wit/Paradigma_di_programmazione" title="Paradigma di programmazione" wx:linktype="known" wx:pagename="Paradigma_di_programmazione" wx:page_id="97167" id="wx4">paradigma di programmazione</a> emerso fra gli <a href="/wit/Anni_1960" title="Anni 1960" wx:linktype="known" wx:pagename="Anni_1960" wx:page_id="38" id="wx5">anni '60</a> e gli <a href="/wit/Anni_1970" title="Anni 1970" wx:linktype="known" wx:pagename="Anni_1970" wx:page_id="39" id="wx6">anni '70</a> nel contesto della <a href="/wit/Programmazione_procedurale" title="Programmazione procedurale" wx:linktype="known" wx:pagename="Programmazione_procedurale" wx:page_id="730280" id="wx7">programmazione procedurale</a>. I concetti introdotti dalla programmazione strutturata sono alla base di numerosi altri paradigmi procedurali successivi, non ultimo quello <i id="wx8"><a href="/wit/Programmazione_orientata_agli_oggetti" title="Programmazione orientata agli oggetti" wx:linktype="known" wx:pagename="Programmazione_orientata_agli_oggetti" wx:page_id="23026" id="wx9">object-oriented</a></i>.</p>

<div id="wx_toc"/>

<a id="Origini_concettuali" name="Origini_concettuali"/>
<wx:section level="2" title="Origini concettuali" id="wxsec2"><h2 id="wx10">Origini concettuali</h2>

<p id="wx11">Le idee chiave della programmazione strutturata si possono ricondurre alla critica della <a href="/wit/Struttura_di_controllo" title="Struttura di controllo" wx:linktype="known" wx:pagename="Struttura_di_controllo" wx:page_id="98873" id="wx12">struttura di controllo</a> del <i id="wx13">salto incondizionato</i> (o <i id="wx14">goto</i>, "vai a"), che rappresentava, negli <a href="/wit/Anni_1960" title="Anni 1960" wx:linktype="known" wx:pagename="Anni_1960" wx:page_id="38" id="wx15">anni '60</a>, lo strumento fondamentale per la definizione di <a href="/wit/Algoritmo" title="Algoritmo" wx:linktype="known" wx:pagename="Algoritmo" wx:page_id="16" id="wx16">algoritmi</a> complessi nel software. In un celebre articolo del <a href="/wit/1968" title="1968" wx:linktype="known" wx:pagename="1968" wx:page_id="4715" id="wx17">1968</a>, <a href="http://www.acm.org/classics/oct95/" class="external text" wx:linktype="external" rel="nofollow" id="wx18"><i id="wx19">Goto statement considered harmful</i></a>, <a href="/wit/Edsger_Dijkstra" title="Edsger Dijkstra" wx:linktype="known" wx:pagename="Edsger_Dijkstra" wx:page_id="131740" id="wx20">Edsger Dijkstra</a> discusse approfonditamente gli effetti deleteri del <i id="wx21">goto</i> sulla qualità del software, e in particolare sulla sua <a href="/wit/Leggibilit%C3%A0_%28software%29" class="new" title="Leggibilità (software)" wx:linktype="unknown" wx:pagename="Leggibilità_(software)" id="wx22">leggibilità</a> e <a href="/wit/Modificabilit%C3%A0_%28software%29" class="new" title="Modificabilità (software)" wx:linktype="unknown" wx:pagename="Modificabilità_(software)" id="wx23">modificabilità</a> (il cosiddetto problema dello <i id="wx24"><a href="/wit/Spaghetti_code" title="Spaghetti code" wx:linktype="known" wx:pagename="Spaghetti_code" wx:page_id="81082" id="wx25">spaghetti code</a></i>).</p>

<p id="wx26">Un'altra celebre pubblicazione che risultò fondamentale all'affermarsi della programmazione strutturata fu <i id="wx27">Flow Diagrams, Turing Machines, and Languages with Only Two Formation Rules</i>, in cui <a href="/wit/Corrado_B%C3%B6hm" title="Corrado Böhm" wx:linktype="known" wx:pagename="Corrado_Böhm" wx:page_id="900655" id="wx28">Corrado Böhm</a> e <a href="/wit/Giuseppe_Jacopini" class="new" title="Giuseppe Jacopini" wx:linktype="unknown" wx:pagename="Giuseppe_Jacopini" id="wx29">Giuseppe Jacopini</a> dimostrarono il loro celebre <a href="/wit/Teorema_di_B%C3%B6hm-Jacopini" title="Teorema di Böhm-Jacopini" wx:linktype="known" wx:pagename="Teorema_di_Böhm-Jacopini" wx:page_id="83390" id="wx30">teorema</a>. Secondo tale teorema, qualsiasi programma scritto usando il <i id="wx31">goto</i> poteva essere riscritto senza, a patto di avere a disposizione altri tre tipi di strutture di controllo: <i id="wx32">sequenza</i>, <i id="wx33">ripetizione</i> e <i id="wx34">alternativa</i>. Il risultato di Boehm Jacopini può anche essere espresso dicendo che, dato un qualunque <a href="/wit/Diagramma_di_flusso" title="Diagramma di flusso" wx:linktype="known" wx:pagename="Diagramma_di_flusso" wx:page_id="22036" id="wx35">diagramma di flusso</a>, 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.</p>

<a id="La_strutturazione_del_controllo" name="La_strutturazione_del_controllo"/>
</wx:section><wx:section level="2" title="La strutturazione del controllo" id="wxsec3"><h2 id="wx36">La strutturazione del controllo</h2>

<wx:template id="wx_t1" pagename="Template:Vedi_anche" page_id="201597"/>
<table style="margin-bottom:.5em; border:1px solid #CCC; text-align:left; font-size:95%; background:#ffffff" id="wx37">
<tr id="wx38">
<td style="padding:0 .5em" id="wx39"><a href="/wit/Immagine:Exquisite-kfind.png" title="" wx:linktype="image" wx:pagename="Immagine:Exquisite-kfind.png" id="wx40"><img src="/wit/Immagine:Exquisite-kfind.png" alt="" width="20" id="wx41"/></a> </td>
<td style="width:100%" id="wx42"><i id="wx43">Per approfondire, vedi la voce <b id="wx44"><a href="/wit/Struttura_di_controllo" title="Struttura di controllo" wx:linktype="known" wx:pagename="Struttura_di_controllo" wx:page_id="98873" id="wx45">Struttura di controllo</a></b>.</i> </td>
</tr>
</table>

<wx:templateend start="wx_t1"/>
<p id="wx46">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:</p>

<ul id="wx47">
<li id="wx48"><b id="wx49">completezza</b>
<p id="wx50">. Un linguaggio strutturato deve fornire la <a href="/wit/Sequenza" title="Sequenza" wx:linktype="known" wx:pagename="Sequenza" wx:page_id="98901" id="wx51">sequenza</a>, almeno una struttura di tipo <i id="wx52">alternativa</i>, e almeno una struttura di tipo <i id="wx53">iterazione</i>;</p>
</li>

<li id="wx54"><b id="wx55">singolo punto di ingresso e di uscita</b>
<p id="wx56">. Idealmente, ogni struttura di controllo, completa delle istruzioni <i id="wx57">controllate</i>, deve poter essere considerata come una <i id="wx58">singola macro-istruzione</i> dal punto di vista del controllo complessivo, con un ben identificato punto di ingresso e un ben identificato punto di uscita.</p>
</li>

<li id="wx59"><b id="wx60">componibilità</b>
<p id="wx61">. Ogni struttura di controllo può avere fra le sue istruzioni controllate, <a href="/wit/Ricorsione" title="Ricorsione" wx:linktype="known" wx:pagename="Ricorsione" wx:page_id="26304" id="wx62">ricorsivamente</a>, altre strutture di controllo (senza limiti).</p>
</li>
</ul>

<p id="wx63">Gli ultimi due vincoli fanno sì che, per quanto concerne il <a href="/wit/Flusso_del_controllo" class="new" title="Flusso del controllo" wx:linktype="unknown" wx:pagename="Flusso_del_controllo" id="wx64">flusso del controllo</a>, 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 <a href="/wit/Progettazione_top-down" title="Progettazione top-down" wx:linktype="known" wx:pagename="Progettazione_top-down" wx:page_id="641370" id="wx65">progettazione top-down</a> e lo <a href="/wit/Sviluppo_per_raffinamenti_successivi" class="new" title="Sviluppo per raffinamenti successivi" wx:linktype="unknown" wx:pagename="Sviluppo_per_raffinamenti_successivi" id="wx66">sviluppo per raffinamenti successivi</a>.</p>

<a id="Sequenza" name="Sequenza"/>
<wx:section level="3" title="Sequenza" id="wxsec8"><h3 id="wx67">Sequenza</h3>

<p id="wx68">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.</p>

<div class="wx_image" wx:align="center" id="wx69"><a href="/wit/Immagine:Progr_strutt_sequenza.gif" title="Sequenza di istruzioni" wx:linktype="image" wx:pagename="Immagine:Progr_strutt_sequenza.gif" wx:page_id="303054" id="wx70"><img src="/wit/Immagine:Progr_strutt_sequenza.gif" alt="Sequenza di istruzioni" id="wx71"/></a></div>

<a id="Alternative" name="Alternative"/>
</wx:section><wx:section level="3" title="Alternative" id="wxsec9"><h3 id="wx72">Alternative</h3>

<p id="wx73">Il seguente diagramma mostra due esempi di alternative strutturate (a sinistra un <i id="wx74">if..then..else</i>, a destra un <i id="wx75">if..then</i>). In rosso viene mostrato l'unico punto d'ingresso, in verde l'unico punto d'uscita.</p>

<div class="wx_image" wx:align="center" id="wx76"><a href="/wit/Immagine:Progr_strutt_alternative.gif" title="Due tipi di alternative strutturate" wx:linktype="image" wx:pagename="Immagine:Progr_strutt_alternative.gif" wx:page_id="303051" id="wx77"><img src="/wit/Immagine:Progr_strutt_alternative.gif" alt="Due tipi di alternative strutturate" id="wx78"/></a></div>

<a id="Ripetizione" name="Ripetizione"/>
</wx:section><wx:section level="3" title="Ripetizione" id="wxsec10"><h3 id="wx79">Ripetizione</h3>

<p id="wx80">Il seguente diagramma mostra due esempi di iterazioni strutturate (a sinistra un <i id="wx81">while..do</i>, a destra un <i id="wx82">do..while</i>). In rosso viene mostrato l'unico punto d'ingresso, in verde l'unico punto d'uscita.</p>

<div class="wx_image" wx:align="center" id="wx83"><a href="/wit/Immagine:Progr_strutt_iterazioni.gif" title="Due tipi di iterazioni strutturate" wx:linktype="image" wx:pagename="Immagine:Progr_strutt_iterazioni.gif" wx:page_id="303053" id="wx84"><img src="/wit/Immagine:Progr_strutt_iterazioni.gif" alt="Due tipi di iterazioni strutturate" id="wx85"/></a></div>

<a id="Componibilit.C3.A0" name="Componibilit.C3.A0"/>
</wx:section><wx:section level="3" title="Componibilità" id="wxsec11"><h3 id="wx86">Componibilità</h3>

<p id="wx87">Il seguente diagramma mostra un esempio di composizione di due strutture di controllo; viene <i id="wx88">iterativamente</i> ripetuta una <i id="wx89">alternativa</i>. Si può osservare che l'intera composizione mantiene un unico punto d'ingresso e un unico punto d'uscita.</p>

<div class="wx_image" wx:align="center" id="wx90"><a href="/wit/Immagine:Progr_strutt_composizione.gif" title="Iterazione di alternative" wx:linktype="image" wx:pagename="Immagine:Progr_strutt_composizione.gif" wx:page_id="303052" id="wx91"><img src="/wit/Immagine:Progr_strutt_composizione.gif" alt="Iterazione di alternative" id="wx92"/></a></div>

<a id="I_linguaggi_di_programmazione_strutturati" name="I_linguaggi_di_programmazione_strutturati"/>
</wx:section></wx:section><wx:section level="2" title="I linguaggi di programmazione strutturati" id="wxsec4"><h2 id="wx93">I linguaggi di programmazione strutturati</h2>

<p id="wx94">I <b id="wx95">linguaggi di programmazione strutturati</b> iniziarono a emergere intorno all'inizio degli <a href="/wit/Anni_1970" title="Anni 1970" wx:linktype="known" wx:pagename="Anni_1970" wx:page_id="39" id="wx96">anni '70</a>. 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 <i id="wx97">goto</i> come possibile strumento per la strutturazione del controllo (spesso sconsigliandone l'uso).</p>

<p id="wx98">Nella maggior parte dei casi, questi linguaggi introducevano una nozione di <a href="/wit/Blocco_%28programmazione%29" class="new" title="Blocco (programmazione)" wx:linktype="unknown" wx:pagename="Blocco_(programmazione)" id="wx99">blocco</a>, su cui spesso erano basate caratteristiche correlate del linguaggio, come le <i id="wx100"><a href="/wit/Scope_rules" title="Scope rules" wx:linktype="known" wx:pagename="Scope_rules" wx:page_id="484479" id="wx101">scope rules</a></i> per gli identificatori (per esempio le <a href="/wit/Variabile" title="Variabile" wx:linktype="known" wx:pagename="Variabile" wx:page_id="78693" id="wx102">variabili</a>).</p>

<p id="wx103">Fra i linguaggi tipici del paradigma strutturato si possono citare:</p>

<ul id="wx104">
<li id="wx105"><a href="/wit/Pascal_%28linguaggio%29" title="Pascal (linguaggio)" wx:linktype="known" wx:pagename="Pascal_(linguaggio)" wx:page_id="3259" id="wx106">Pascal</a></li>

<li id="wx107"><a href="/wit/Ada_%28linguaggio%29" title="Ada (linguaggio)" wx:linktype="known" wx:pagename="Ada_(linguaggio)" wx:page_id="26777" id="wx108">Ada</a></li>

<li id="wx109"><a href="/wit/Algol_%28informatica%29" title="Algol (informatica)" wx:linktype="known" wx:pagename="Algol_(informatica)" wx:page_id="26310" id="wx110">Algol</a></li>

<li id="wx111"><a href="/wit/C_%28linguaggio%29" title="C (linguaggio)" wx:linktype="known" wx:pagename="C_(linguaggio)" wx:page_id="26840" id="wx112">C</a></li>
</ul>

<a id="La_programmazione_strutturata_nella_storia_della_programmazione" name="La_programmazione_strutturata_nella_storia_della_programmazione"/>
</wx:section><wx:section level="2" title="La programmazione strutturata nella storia della programmazione" id="wxsec5"><h2 id="wx113">La programmazione strutturata nella storia della programmazione</h2>

<p id="wx114">La programmazione strutturata rappresenta una tappa fondamentale dell'evoluzione della cosiddetta programmazione <i id="wx115">mainstream</i>, 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 <a href="/wit/Programmazione_modulare" title="Programmazione modulare" wx:linktype="known" wx:pagename="Programmazione_modulare" wx:page_id="1346948" id="wx116">programmazione modulare</a> che il paradigma della <a href="/wit/Programmazione_orientata_agli_oggetti" title="Programmazione orientata agli oggetti" wx:linktype="known" wx:pagename="Programmazione_orientata_agli_oggetti" wx:page_id="23026" id="wx117">programmazione orientata agli oggetti</a> 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 <a href="/wit/Gestione_delle_eccezioni" title="Gestione delle eccezioni" wx:linktype="known" wx:pagename="Gestione_delle_eccezioni" wx:page_id="133027" id="wx118">gestione delle eccezioni</a> e dello sviluppo di <a href="/wit/Programmazione_concorrente" title="Programmazione concorrente" wx:linktype="known" wx:pagename="Programmazione_concorrente" wx:page_id="665605" id="wx119">programmi concorrenti</a>.</p>

<a id="Voci_correlate" name="Voci_correlate"/>
</wx:section><wx:section level="2" title="Voci correlate" id="wxsec6"><h2 id="wx120">Voci correlate</h2>

<ul id="wx121">
<li id="wx122"><i id="wx123"><a href="/wit/Spaghetti_code" title="Spaghetti code" wx:linktype="known" wx:pagename="Spaghetti_code" wx:page_id="81082" id="wx124">Spaghetti code</a></i></li>

<li id="wx125"><a href="/wit/Struttura_di_controllo" title="Struttura di controllo" wx:linktype="known" wx:pagename="Struttura_di_controllo" wx:page_id="98873" id="wx126">Struttura di controllo</a></li>

<li id="wx127"><a href="/wit/Paradigma_di_programmazione" title="Paradigma di programmazione" wx:linktype="known" wx:pagename="Paradigma_di_programmazione" wx:page_id="97167" id="wx128">Paradigma di programmazione</a></li>

<li id="wx129"><a href="/wit/Diagramma_di_flusso" title="Diagramma di flusso" wx:linktype="known" wx:pagename="Diagramma_di_flusso" wx:page_id="22036" id="wx130">Diagramma di flusso</a></li>

<li id="wx131"><a href="/wit/Diagramma_di_flusso_strutturato" class="new" title="Diagramma di flusso strutturato" wx:linktype="unknown" wx:pagename="Diagramma_di_flusso_strutturato" id="wx132">Diagramma di flusso strutturato</a></li>

<li id="wx133"><i id="wx134"><a href="/wit/Scope_rules" title="Scope rules" wx:linktype="known" wx:pagename="Scope_rules" wx:page_id="484479" id="wx135">Scope rules</a></i></li>

<li id="wx136"><a href="/wit/Blocco_%28programmazione%29" class="new" title="Blocco (programmazione)" wx:linktype="unknown" wx:pagename="Blocco_(programmazione)" id="wx137">Blocco</a></li>

<li id="wx138"><a href="/wit/Programmazione_procedurale" title="Programmazione procedurale" wx:linktype="known" wx:pagename="Programmazione_procedurale" wx:page_id="730280" id="wx139">Programmazione procedurale</a></li>
</ul>

<a id="Collegamenti_esterni" name="Collegamenti_esterni"/>
</wx:section><wx:section level="2" title="Collegamenti esterni" id="wxsec7"><h2 id="wx140">Collegamenti esterni</h2>

<ul id="wx141">
<li id="wx142"><a href="http://www.acm.org/classics/oct95/" class="external text" wx:linktype="external" rel="nofollow" id="wx143"><i id="wx144">Go To Statement Considered Harmful</i></a>
<p id="wx145">l'articolo originale di <a href="/wit/Edsger_Dijkstra" title="Edsger Dijkstra" wx:linktype="known" wx:pagename="Edsger_Dijkstra" wx:page_id="131740" id="wx146">Edsger Dijkstra</a></p>
</li>

<li id="wx147"><a href="http://portal.acm.org/citation.cfm?id=365646&amp;jmp=cit&amp;dl=GUIDE&amp;dl=ACM&amp;CFID=10941068&amp;CFTOKEN=59269176#CIT" class="external text" wx:linktype="external" rel="nofollow" id="wx148">Formulazione originale del teorema di Boehm Jacopini</a></li>
</ul>
</wx:section></wx:section></div>
<div id="wx_categorylinks">
<a href="/wit/index.php?title=Speciale:Categories&amp;article=Programmazione_strutturata" title="Speciale:Categories" wx:linktype="known" wx:pagename="Speciale:Categories" id="wx149">Categoria</a>: <span dir="ltr" id="wx150"><a href="/wit/Categoria:Teorie_della_programmazione" title="Categoria:Teorie della programmazione" wx:linktype="known" wx:pagename="Categoria:Teorie_della_programmazione" wx:page_id="1009778" id="wx151">Teorie della programmazione</a></span></div>
<div id="wx_languagelinks">
</div>
</body>
<wx:templatearguments for="wx_t1"><wx:argument name="1">
<p id="wx152">Struttura di controllo</p>
</wx:argument></wx:templatearguments>
</html>
