Programmazione dichiarativa: quando il Cosa conta più del Come

Che si tratti di programmare un'app, un software IoT o un gioco per computer, prima di scrivere le righe di codice gli sviluppatori devono prendere una decisione di base: quale linguaggio di programmazione utilizzare? Se ne possono scegliere diversi. In generale, tuttavia, tutti i linguaggi possono essere assegnati a due fondamentali paradigmi di programmazione: la programmazione dichiarativa e la programmazione imperativa.

Che cos'è la programmazione dichiarativa?

Il paradigma non ha descrizioni assolutamente precise, ma tutte le definizioni concordano su una cosa: la caratteristica dei linguaggi di programmazione dichiarativi è che descrivono sempre il risultato finale desiderato invece di mostrare tutte le fasi di lavoro. Per raggiungere l'obiettivo, nella programmazione dichiarativa la strada per arrivare alla soluzione viene determinata automaticamente. Un approccio che funziona bene fintanto che le specifiche dello stato finale sono chiaramente definite ed esiste un processo di esecuzione appropriato. Se si verificano entrambe queste condizioni, la programmazione dichiarativa è molto efficace.

Poiché la programmazione dichiarativa non definisce il "come" ma funziona a un livello molto elevato di astrazione, il paradigma di programmazione lascia spazio anche all'ottimizzazione. Se viene sviluppato un metodo di esecuzione migliore, questo può essere trovato e utilizzato tramite l'algoritmo integrato. In questo modo, il paradigma si rivela decisamente a prova di futuro: quando si scrive il codice, non è necessario che la procedura per ottenere il risultato sia stabilita con certezza.

I linguaggi di programmazione dichiarativi più conosciuti:

  • Prolog
  • Lisp
  • Haskell
  • Miranda
  • Erlang
  • SQL (nel senso più esteso)

I vari linguaggi di programmazione dichiarativa possono a loro volta essere divisi in due paradigmi: i linguaggi di programmazione funzionale e quelli di programmazione logica.

Nella pratica, tuttavia, i confini spesso si confondono e, per risolvere i problemi, vengono utilizzati tanto gli elementi della programmazione imperativa con i suoi sottotipi di programmazione procedurale, modulare e strutturata, quanto la programmazione dichiarativa.

Programmazione dichiarativa vs imperativa

Il paradigma di programmazione imperativa (paradigma orientato al comando) è il più vecchio dei due paradigmi di base. Contrariamente alla programmazione dichiarativa, qui lo sviluppatore specifica esattamente nel codice sorgente cosa deve fare il computer passo dopo passo per ottenere il risultato. In primo piano c'è "come" arrivare alla soluzione. Questo approccio può essere trovato, ad esempio, in Java, Pascal o in C. Al contrario, la programmazione dichiarativa descrive direttamente il "cosa" della soluzione.

Come esempio, facciamo un parallelo con il montaggio di un mobile: mentre la programmazione imperativa fornisce istruzioni su come montarlo, la programmazione dichiarativa fornisce un'immagine del mobile finito come modello.

Invece di lasciare aperto il Come dell'esecuzione con funzioni, nella programmazione imperativa ci sono variabili che vengono modificate in fase di esecuzione. Ciò rende il codice più lungo, ma anche più facile da comprendere rispetto alla forma abbreviata e molto astratta dello stile dichiarativo.

Programmazione dichiarativa: un esempio

Un punto di forza della programmazione dichiarativa è la sua capacità di descrivere i problemi in modo più breve e più conciso rispetto ai linguaggi imperativi.

Se deve essere creato un elenco di nomi, lo si può descrivere in PHP con la programmazione dichiarativa, come mostra l'esempio, con una sola riga di codice, mentre la procedura imperativa richiede cinque righe.

Programmazione imperativa

$listaPartecipanti = [1 => 'Pietro', 2 => 'Anna', 3 => 'Sara'];
$nomi = [];
foreach ($listaPartecipanti as $id => $name) {
    $nomi[] = $name;
}

Programmazione dichiarativa

$nomi = array_values($listaPartecipanti);

Vantaggi e svantaggi del linguaggio di programmazione dichiarativa

Lo stile di programmazione dichiarativo è oggi utilizzato in svariati casi, sebbene non nella sua forma più pura. Tuttavia, questo approccio non è adatto a tutte le applicazioni.

Il codice dichiarativo è caratterizzato da un alto livello di astrazione. Ciò consente agli sviluppatori di visualizzare programmi complessi in forma compressa. Ma più grande è l'applicazione, maggiore è il rischio che il codice venga nidificato in modo tale da poter essere letto solo dallo sviluppatore che lo ha originariamente scritto. Questa situazione è pericolosa per le aziende che vogliono effettuare la manutenzione e sviluppare applicazioni indipendentemente da singole persone. In questo caso, gli sviluppatori esterni si ritrovano a dover faticosamente decifrare il codice dichiarativo prima di poterne comprendere la struttura e risolvere i problemi.

Tuttavia, il livello di astrazione della programmazione dichiarativa offre anche dei vantaggi. Poiché l'esecuzione è chiaramente separata dal sistema tramite un algoritmo, la manutenzione può essere eseguita indipendentemente dallo sviluppo dell'applicazione. Le interruzioni nelle operazioni quotidiane sono ridotte al minimo. Al contempo, l'ottimizzazione è più semplice perché l'algoritmo utilizzato è abbastanza aperto per accedere a nuovi metodi. Lo svantaggio dell'utilizzo di un algoritmo: tale soluzione basata su formule spesso può trattare solo in modo insufficiente le caratteristiche specifiche delle singole applicazioni.

Sebbene non sia uno svantaggio, il modello concettuale della programmazione dichiarativa pone una sfida. Pensare in termini di stati risolutivi va contro i meccanismi naturali di pensiero. Nei processi, si ragiona in vista di un obiettivo e non si fa invece il ragionamento inverso partendo da tale obiettivo. Ciò richiede agli sviluppatori di cambiare prospettiva e fare pratica, cosa che inizialmente può rallentare la risoluzione dei problemi. Tuttavia, una volta che la nuova mentalità è stata allenata, l'approccio dichiarativo può mostrare i suoi punti di forza.

Lo sviluppo basato sulla descrizione del problema ha anche il vantaggio che i team possono abbozzare modelli di soluzioni con una certa rapidità. Dopodiché, la programmazione effettiva dell'esecuzione può essere eseguita in un passaggio successivo. Ciò rende lo stile dichiarativo molto indicato per la prototipazione nello sviluppo agile di software.

Vantaggi Svantaggi
Codice corto ed efficace In parte difficile da comprendere per gli esterni
Eseguibile con metodi non ancora noti al momento della programmazione Basato su un modello di pensiero insolito per l'uomo (stato di soluzione)
Ottimizzazione semplice, poiché l'esecuzione è controllata dall'algoritmo Le caratteristiche delle singole applicazioni possono essere difficili da prendere in considerazione nella programmazione
Manutenzione possibile indipendentemente dallo sviluppo dell'applicazione  

Nella pratica, oggi si utilizzano principalmente forme miste di paradigmi e i linguaggi di programmazione dichiarativa sono integrati da metodi imperativi. Tuttavia, ciò aumenta la suscettibilità agli errori e può influire sulla leggibilità del codice.

Hai trovato questo articolo utile?
Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.
Page top