GUIDE

Uber-paradigmi di programmazione

LEGANERD 040578

People look at this and they go, “Wow, I’m gonna be able to legitimately put all of these languages on my resume,” and it’s from a separate list at the bottom and it feels really good. It isn’t so much about that. Certainly we want to give you some mileage in some very relevant languages that are very good for both research and for industry, but the real intellectual value in learning all of these languages is to really study the paradigms that they represent.

Jerry Cain, professore di informatica all’Università di Stanford, ha perfettamente ragione quando dice che non è il linguaggio ad essere importante ma il paradigma che si porta dietro.
Eccoci arrivati all’ n-esimo articolo della lo-sappiamo-già rubrica ProPa, Programmazione: Parliamone.
Quello che vi sto per raccontare sta alla base della descrizione di un linguaggio di programmazione e ne rappresenta l’aspetto più profondo. Ovviamente state calmi e non vi eccitate troppo mentre vi narro dell’oscuro segreto racchiuso all’interno dei paradigmi.

Se andate in panico, prendete un asciugamano (che vi ricordo dovreste già avere), mandate una mail a voyager@rai.it e invocate il Ramen per un numero di volte pari agli irrazionali contenuti tra 42 e 73 ( @pazqo non suggerire! ).

Cos’è un paradigma

Questa è una bella gatta glitterata da pelare patata bollente: la parola proviene semplicisticamente dal greco “παράδειγμα” (paradeigma) che significa pattern, motivo, esempio; essa viene utilizzata per descrivere un insieme di elementi aventi simili caratteristiche o appartenenti ad una stessa classe.

Può essere trovata all’interno di documenti scientifici e filosofici sin dall’ età dell’oro (per intenderci, quando i velociraptor erano ancora solo una storiella raccontata ai bambini cattivi) ma possiede significati e sfumature differenti a seconda del contesto.
Uno di questi contesti è l’informatica dove ha trovato spazio nel descrivere e differenziare i diversi linguaggi di programmazione.

Oh cavolo, non sono 42!

Eh no, cascate male se sperate di trovare la domanda tra queste righe poiché, purtroppo, in questo ambito si fatica a trovare anche la risposta. Sin dagli albori della programmazione sono discussi, modificati e stravolti così tanto che non è possibile standardizzarli. Tuttora sono oggetto di profonde spaccature anche all’interno dei singoli cervelli degli studiosi. Diciamo che sono come l’argomento Apple all’interno della Lega: un flame assicurato.

Visto che anche noi ci divertiamo tanto a scatenare le fiamme dell’inferno sui benedetti server dell’ iPad addicted, mi riprometto di scrivere un articolo con il mio personalissimo punto di vista sulla battaglia C vs C++ e di postarlo durante una caldissimo pomeriggio di una Domenica d’Agosto.

Visto però che non è Domenica e state tutti fappando lavorando, cercherò di descrivere i paradigmi più conosciuti e chiacchierati senza dilungarmi troppo nel maestoso caos che si portano dietro. Se non capite qualcosa, insomma, prendetevela col primo Milhouse che passa od indirizzatevi sulla parte più rosa oscura di LN.
Ah, tenete pronte la colla vinilica e le forbici dalla punta arrotondata!

Prog. Imperativa a.k.a. Guarda che ti combino con i Lego

In ordine temporale, la programmazione imperativa, imperative programming (Applausi a profusione), è stata la prima ad essere “scoperta” ed utilizzata in modo efficiente. Essa, infatti, contiene alcuni dei concetti più importanti ad oggi usati in ogni ambito ed è uno dei quattro paradigmi che ogni programmatore degno di questo nome deve sapere applicare e manipolare. E’ supportata da quasi tutti i principali linguaggi di programmazione e quindi utilizzabile in diversi ecosistemi.

In sostanza, questo tipo di programmazione si basa su dichiarazioni (statements), che cambiano il valore assunto dal programma, e sulla sequenza nel quale il programma viene eseguito. Il programma assume quindi la forma di un ”FAI QUESTO, POI FA QUEST’ALTRO, POI…”.

Vengono usati cicli, condizioni e chiamate di funzioni per formare algoritmi che eseguono e memorizzano i cambi di stato. I più frequenti utilizzatori di questo tipo di programmazione sono i vecchi linguaggi macchina, i vari assembly, il Fortran, il BASIC ed il C ed i suoi derivati.
Da notare che un sinonimo spesso utilizzato per questo tipo di programmazione è quello della programmazione procedurale.

Programmazione Orientata ad Oggetti a.k.a. Classi e razze per tutti quanti!

Buttiamola questa bomba!
Questo è forse il più parlato, bistrattato, noobsfilled paradigma tra quelli principali. Costola della programmazione imperativa/procedurale, ha rivoluzionato il modo di concepire i singoli blocchi che compongono i nostri programmi ed ha semplificato di moltissimo il lavoro ai magGgici creatori delle altrettanto magGgiche interfacce grafiche che state ora utilizzando. Oltre ad aver introdotto concetti nuovi come le classi ed i metodi, questo tipo di programmazione implementa tre tecniche:

– L'incapsulamento, tecnica con la quale parte del programma può cambiare senza determinare deformazioni nel flusso spazio-temporale all’interno del resto del codice e quindi offre una sorta di protezione alla stabilità dell’esecuzione.

– L'ereditarietà, concetto con il quale si stabiliscono delle classi che possono contenere sottoinsiemi che sono direttamente connesse alla classe madre. Un buon esempio è quello degli insiemi matematici come il classico insieme
classe{studenti{femmine,maschi{nerd,truzzi,…}}, professori{maschi,femmine}}.

– Il polimorfismo, tecnica con il quale si può sfruttare per una classe tutti i valori delle proprie sottoclassi senza dover per forza specificarne il tipo. Tutti i linguaggi non tipizzati, come il Python, sono polimorfici. Il polimorfismo è utilissimo per esempio quando volete utilizzare due bottoni aventi la stessa interfaccia per fare due diverse operazioni.

I principali linguaggi che utilizzano questo paradigma sono C++, Java, C#, Obj-C, Python, Smalltalk, Scala, Ruby e molti altri.

Prog. Dichiarativa a.k.a. NOT Imperativa

No, non stavo mangiando le porte NAND del mio processore mentre scrivevo il titoletto: la programmazione dichiarativa, declarative programming, può essere definita perfettamente anche solo come programmazione non imperativa e non c’è definizione migliore di questa, proprio per la natura di questo paradigma.

La programmazione dichiarativa è un tipo di programmazione che si oppone all’ usanza dei programmatori di ricercare la via perfetta del COME fare a trovare una soluzione inseguendo la domanda del COSA dovrebbe essere computato e con quali elementi. E’ caratterizzata da una trasparenza referenziale ( assenza di elementi che possono modificare elementi di input come “x = x + 1” ) ed è molto spesso abbinata alla logica matematica che è auto-descrittiva dal punto di vista delle proprie caratteristiche.

E’ estremamente difficile dare un esempio corretto di pura programmazione dichiarativa, ma possono essere collegati a questa dichiarazione SQL, lex, XSLT e tutti i linguaggi di markup come HTML e CSS.

Prog. Logica e Prog. Funzionale a.k.a. Le ultime due sfigate che tali non sono

Entrambe femori della programmazione dichiarativa, sono utilizzati in ambiti ristretti e molto specifici, sebbene molti concetti siano entrati a far parte degli altri paradigmi e quindi si siano diffusi a 360°.

La programmazione logica ha come rappresentante il fantasmagorico PROLOG e viene utilizzata soprattutto in ambiti quali le intelligenze artificiali, la bioinformatica e la matematica. Come dice il nome, esso sfrutta delle “semplici” equazioni logiche per arrivare a risolvere dei problemi più o meno complessi, molto spesso sfruttando la relazione tra causa ed effetto. La caratteristica di questo paradigma è che può essere pensato e manipolato sia dichiarativamente che imperativamente, lasciando grandissima libertà al programmatore.

Possono essere citati altri linguaggi come LISP, Datalog, Oz e Gödel che rispecchiano e sfruttano questo tipo di paradigma.

L’ultimo ma non meno famoso paradigma è quello composto dalla programmazione funzionale. In questo caso, è la matematica a far da padrone e sono le funzioni matematiche i blocchi che formano il programma. Questo paradigma è infatti molto usato in ambito accademico per quanto riguarda soprattutto la statistica (R), l’analisi (J, K) e la stessa matematica simbolica (Mathematica) ma è riuscito anche ad intrufolarsi in ambito commerciale ed industriale con Haskell, Scheme, Erlang e F#.
E’ comunque dimostrato che questo tipo di paradigma è applicabile a moltissimi linguaggi di programmazione che sfruttano anche paradigmi opposti come quello procedurale.

Link di approfondimento:
Programming paradigm
Corso CS107 di Stanford
Comparazione di paradigmi di programmazione
Precedenti articoli di Propa

[more]Uff, questo è stato in assoluto l’articolo più difficile da scrivere. L’argomento è forse il più ambiguo e caotico di tutte le scienze informatiche. Se trovate qualche errore, non esitate a dirlo (ma non scrivete tecnoblabla, perchè il mio obiettivo non è scrivere per i laureati!).
Prossima settimana, cercherò di scrivere riguardo agli editor ed inizierò la serie di articoli sulla Robocup, perchè tra 20 giorni ci sarà il grande evento in Turchia dove il sottoscritto porterà trionfante LegaNerd in uno dei campionati mondiali più nerd che ci siano.
Stay tuned! [/more]

Reti Neurali per organizzare la serata perfetta
Reti Neurali per organizzare la serata perfetta
Ma è illogico!
Debugging: la maledizione del programmatore
Alla ricerca del compilatore perduto
Basi ed acidi dei linguaggi di programmazione
Storia dei Linguaggi di Programmazione
Python e Ruby