Che si tratti di sviluppo di app, pro­gram­ma­zio­ne di macchine o sviluppo di software aziendali, prima di scrivere la prima riga di codice lo svi­lup­pa­to­re deve decidere quale lin­guag­gio di pro­gram­ma­zio­ne uti­liz­za­re. Esiste una vasta scelta di possibili linguaggi di pro­gram­ma­zio­ne. Tuttavia, ognuno di essi può essere assegnato a due paradigmi di pro­gram­ma­zio­ne fon­da­men­tal­men­te diversi: la pro­gram­ma­zio­ne im­pe­ra­ti­va e la pro­gram­ma­zio­ne di­chia­ra­ti­va. Entrambi gli approcci pre­sen­ta­no vantaggi e svantaggi.

Quali sono le ca­rat­te­ri­sti­che dei linguaggi di pro­gram­ma­zio­ne im­pe­ra­ti­va? Di quali punti deboli devono tenere conto gli svi­lup­pa­to­ri? In questo articolo ri­spon­dia­mo alle domande più im­por­tan­ti sul paradigma im­pe­ra­ti­vo.

Che cos'è la pro­gram­ma­zio­ne im­pe­ra­ti­va?

La pro­gram­ma­zio­ne im­pe­ra­ti­va (dal latino imperare = comandare) è il più antico paradigma di pro­gram­ma­zio­ne. Secondo questo paradigma, un programma consiste in una sequenza chia­ra­men­te definita di istru­zio­ni date a un computer.

Il codice sorgente dei linguaggi im­pe­ra­ti­vi mette insieme i comandi che de­ter­mi­na­no cosa deve essere fatto dal computer, e quando, per rag­giun­ge­re il risultato de­si­de­ra­to. I valori uti­liz­za­ti nelle variabili vengono mo­di­fi­ca­ti durante il runtime del programma. Per con­trol­la­re i comandi, vengono integrate nel codice strutture di controllo come loop o rami.

I linguaggi di pro­gram­ma­zio­ne im­pe­ra­ti­vi sono molto concreti e lavorano vicino al sistema. Da un lato, quindi, il codice è di facile com­pren­sio­ne, dal­l'al­tro sono ne­ces­sa­rie molte righe di codice sorgente per de­scri­ve­re quello che, nei linguaggi di pro­gram­ma­zio­ne di­chia­ra­ti­vi, si può ottenere con una frazione di questi comandi.

I linguaggi di pro­gram­ma­zio­ne im­pe­ra­ti­vi più co­no­sciu­ti:

  • Fortran
  • Java
  • Pascal
  • ALGOL
  • C
  • C#
  • C++
  • Assembler
  • BASIC
  • COBOL
  • Python
  • Ruby

I vari linguaggi di pro­gram­ma­zio­ne im­pe­ra­ti­vi possono a loro volta essere assegnati a tre ulteriori stili di pro­gram­ma­zio­ne su­bor­di­na­ti: lo stile di pro­gram­ma­zio­ne strut­tu­ra­to, pro­ce­du­ra­le e modulare.

Lo stile di pro­gram­ma­zio­ne strut­tu­ra­to estende il principio di base im­pe­ra­ti­vo mediante strutture di controllo spe­ci­fi­che, sequenze, selezione (selezione) e ite­ra­zio­ne (ri­pe­ti­zio­ne). Alla base c'è il con­te­ni­men­to o la completa eli­mi­na­zio­ne delle istru­zio­ni di salto, che com­pli­ca­no inu­til­men­te il codice pro­get­ta­to in modo im­pe­ra­ti­vo.

L'approccio pro­ce­du­ra­le divide l'at­ti­vi­tà che deve essere svolta da un programma in attività se­con­da­rie più piccole, che sono descritte sin­go­lar­men­te nel codice. Si creano così moduli di pro­gram­ma­zio­ne che possono essere uti­liz­za­ti anche in altri programmi. Il modello di pro­gram­ma­zio­ne modulare fa un ulteriore passo avanti: qui i singoli com­po­nen­ti del programma sono pro­get­ta­ti, svi­lup­pa­ti e testati in modo com­ple­ta­men­te in­di­pen­den­te l'uno dal­l'al­tro. Infine, i singoli moduli combinati formano il software effettivo.

Pro­gram­ma­zio­ne im­pe­ra­ti­va vs di­chia­ra­ti­va

I linguaggi di pro­gram­ma­zio­ne im­pe­ra­ti­vi dif­fe­ri­sco­no dai linguaggi di­chia­ra­ti­vi per un aspetto fon­da­men­ta­le. Rias­su­men­do in una frase: la pro­gram­ma­zio­ne im­pe­ra­ti­va si concentra sul COME, la pro­gram­ma­zio­ne di­chia­ra­ti­va sul COSA.

Cosa vuol dire questo? I linguaggi di pro­gram­ma­zio­ne im­pe­ra­ti­vi sono scritti come una guida passo passo (come) per il computer. De­scri­vo­no espli­ci­ta­men­te quali passaggi devono essere eseguiti e in quale ordine per rag­giun­ge­re la soluzione de­si­de­ra­ta. Nella pro­gram­ma­zio­ne di­chia­ra­ti­va, invece, viene descritto di­ret­ta­men­te il risultato finale de­si­de­ra­to (cosa). Facendo un parallelo espli­ca­ti­vo con la cucina, i linguaggi im­pe­ra­ti­vi danno ricette, i linguaggi di­chia­ra­ti­vi danno foto del piatto finito.

Nei linguaggi di­chia­ra­ti­vi, il codice sorgente rimane molto astratto riguardo alla procedura concreta. Per arrivare alla soluzione, viene uti­liz­za­to un algoritmo che trova e utilizza au­to­ma­ti­ca­men­te i metodi adeguati. Questo approccio presenta molti vantaggi: non solo i programmi possono essere scritti molto più ve­lo­ce­men­te, ma le ap­pli­ca­zio­ni sono anche molto facili da ot­ti­miz­za­re. Infatti, se in futuro viene svi­lup­pa­to un nuovo metodo, l'al­go­rit­mo può sem­pli­ce­men­te accedere al metodo più recente grazie alle istru­zio­ni astratte contenute nel codice sorgente.

Pro­gram­ma­zio­ne im­pe­ra­ti­va: un esempio

I linguaggi di pro­gram­ma­zio­ne im­pe­ra­ti­va sono ca­rat­te­riz­za­ti dal loro carattere istrut­ti­vo e pertanto di solito ri­chie­do­no molte più righe di codice per esprimere ciò che può essere descritto con poche istru­zio­ni nello stile di­chia­ra­ti­vo. Nel seguente esempio, si vuole generare un elenco di nomi:

Pro­gram­ma­zio­ne im­pe­ra­ti­va (PHP)

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

Pro­gram­ma­zio­ne di­chia­ra­ti­va (PHP)

$nomi = array_values($listaPartecipanti);

Vantaggi e svantaggi del lin­guag­gio di pro­gram­ma­zio­ne im­pe­ra­ti­va

Oggi si uti­liz­za­no molti linguaggi di pro­gram­ma­zio­ne basati sul paradigma della pro­gram­ma­zio­ne im­pe­ra­ti­va.

Da un lato, ciò è dovuto al fatto che questo approccio è la forma ori­gi­na­ria di pro­gram­ma­zio­ne. D'altra parte, no­no­stan­te i modelli al­ter­na­ti­vi, il paradigma im­pe­ra­ti­vo presenta ancora vantaggi pratici.

I linguaggi sono re­la­ti­va­men­te facili da imparare perché il codice viene letto come una guida passo passo. Nella loro for­ma­zio­ne, quindi, i pro­gram­ma­to­ri di solito imparano prima un lin­guag­gio im­pe­ra­ti­vo.

La facile leg­gi­bi­li­tà è un fattore decisivo nella quo­ti­dia­ni­tà aziendale: dopo tutto, la ma­nu­ten­zio­ne e l'ot­ti­miz­za­zio­ne delle ap­pli­ca­zio­ni non do­vreb­be­ro dipendere dalla persona, ma devono poter essere svolte fa­cil­men­te da diversi di­pen­den­ti, anche se non hanno scritto il codice da zero.

Svan­tag­gio della pro­gram­ma­zio­ne pro­ce­du­ra­le: se si devono risolvere problemi più complessi, il codice cresce molto ra­pi­da­men­te. Sebbene rimanga molto leggibile, le sue di­men­sio­ni lo rendono confuso.

Poiché l'e­se­cu­zio­ne non è chia­ra­men­te separata dalla pro­gram­ma­zio­ne come nello stile di­chia­ra­ti­vo, quando si in­ter­vie­ne suc­ces­si­va­men­te è facile incappare in effetti secondari o errori in­de­si­de­ra­ti. Anche le esten­sio­ni sono più difficili da im­ple­men­ta­re nel codice puramente im­pe­ra­ti­vo, a dif­fe­ren­za del paradigma di­chia­ra­ti­vo, in cui vengono aggiunte se­pa­ra­ta­men­te usando dei metodi.

Vantaggi Svantaggi
Facile leg­gi­bi­li­tà Il codice diventa ra­pi­da­men­te molto esteso e quindi confuso
Re­la­ti­va­men­te facile da imparare Il rischio di errori durante l'e­la­bo­ra­zio­ne è maggiore
Modello di pensiero di facile com­pren­sio­ne per i prin­ci­pian­ti (strada verso la soluzione) La ma­nu­ten­zio­ne blocca lo sviluppo del­l'ap­pli­ca­zio­ne poiché la pro­gram­ma­zio­ne avviene in pros­si­mi­tà del sistema
Possono essere prese in con­si­de­ra­zio­ne le ca­rat­te­ri­sti­che di ap­pli­ca­zio­ni speciali L'ot­ti­miz­za­zio­ne e l'e­span­sio­ne sono più difficili

Nella pratica, oggi vengono ge­ne­ral­men­te uti­liz­za­te forme miste di paradigmi, in quanto sia gli stili di pro­gram­ma­zio­ne im­pe­ra­ti­va che di­chia­ra­ti­va com­por­ta­no vantaggi e svantaggi. Tuttavia, prevale sempre più lo stile di pro­gram­ma­zio­ne di­chia­ra­ti­vo, integrato da metodi im­pe­ra­ti­vi.

Vai al menu prin­ci­pa­le