[image]https://leganerd.com/wp-content/uploads/LEGANERD_040578.png[/image]
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 [tag]ProPa[/tag], [b]Programmazione: Parliamone[/b].
Quello che vi sto per raccontare sta alla [b]base[/b] della descrizione di un linguaggio di programmazione e ne rappresenta l’aspetto più [b]profondo[/b]. Ovviamente state calmi e non vi eccitate troppo mentre vi narro dell’oscuro [i]segreto[/i] racchiuso all’interno dei paradigmi.
Se andate in panico, prendete un [b]asciugamano[/b] (che vi ricordo dovreste già avere), mandate una mail a [i]voyager@rai.it[/i] e invocate il [b]Ramen[/b] per un numero di volte pari agli irrazionali contenuti tra 42 e 73 ( @pazqo non suggerire! ).
[title]Cos’è un paradigma[/title]
Questa è una bella [del]gatta glitterata da pelare[/del] patata bollente: la parola proviene semplicisticamente dal greco “παράδειγμα” (paradeigma) che significa [i]pattern, motivo, esempio[/i]; essa viene utilizzata per descrivere un [b]insieme di elementi aventi simili caratteristiche[/b] o appartenenti ad una stessa [b]classe[/b].
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 [b]sfumature differenti[/b] a seconda del contesto.
Uno di questi contesti è l’informatica dove ha trovato spazio nel descrivere e differenziare i diversi linguaggi di programmazione.
[title]Oh cavolo, non sono 42![/title]
Eh no, cascate male se sperate di trovare la [i]domanda[/i] tra queste righe poiché, purtroppo, in questo ambito si fatica a trovare anche la [i]risposta[/i]. Sin dagli albori della programmazione sono discussi, modificati e stravolti così tanto che [b]non è possibile standardizzarli[/b]. 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 [b]flame[/b] assicurato.
Visto che anche noi ci divertiamo tanto a scatenare le [b]fiamme dell’inferno[/b] sui benedetti server dell’ [url=https://leganerd.com/people/eagle1/]iPad addicted[/url], mi riprometto di scrivere un articolo con il mio personalissimo punto di vista sulla battaglia [b]C vs C++[/b] e di postarlo durante una [i]caldissimo pomeriggio di una Domenica d’Agosto[/i].
Visto però che non è Domenica e state tutti [del]fappando[/del] 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ù [del]rosa[/del] oscura di LN.
Ah, tenete pronte la colla vinilica e le forbici dalla punta arrotondata!
[title]Prog. Imperativa a.k.a. Guarda che ti combino con i Lego[/title]
In ordine temporale, la [b]programmazione imperativa[/b], [i]imperative programming[/i] ([i]Applausi a profusione[/i]), è stata la prima ad essere “[i]scoperta[/i]” ed utilizzata in modo efficiente. Essa, infatti, contiene alcuni dei [b]concetti più importanti[/b] ad oggi usati in ogni ambito ed è uno dei quattro paradigmi che ogni programmatore degno di questo nome deve sapere [b]applicare[/b] e [b]manipolare[/b]. E’ supportata da quasi [b]tutti[/b] i principali linguaggi di programmazione e quindi utilizzabile in diversi ecosistemi.
In sostanza, questo tipo di programmazione si basa su [b]dichiarazioni[/b] ([i]statements[/i]), che cambiano il valore assunto dal programma, e sulla [b]sequenza[/b] nel quale il programma viene eseguito. Il programma assume quindi la forma di un [i]”FAI QUESTO, POI FA QUEST’ALTRO, POI…”[/i].
Vengono usati [b]cicli[/b], [b]condizioni[/b] e [b]chiamate[/b] [b]di funzioni[/b] per formare [i]algoritmi[/i] che eseguono e memorizzano i [b]cambi di stato[/b]. I più frequenti utilizzatori di questo tipo di programmazione sono i vecchi[b] linguaggi macchina[/b], i vari [b]assembly[/b], il [b]Fortran[/b], il [b]BASIC[/b] ed il [b]C[/b] ed i suoi [b]derivati[/b].
Da notare che un sinonimo spesso utilizzato per questo tipo di programmazione è quello della [b]programmazione procedurale[/b].
[title]Programmazione Orientata ad Oggetti a.k.a. Classi e razze per tutti quanti!
[/title]
[i]Buttiamola questa bomba![/i]
Questo è forse il più parlato, bistrattato, [i]noobsfilled[/i] paradigma tra quelli principali. [i]Costola[/i] della programmazione imperativa/procedurale, ha rivoluzionato il modo di concepire i singoli [b]blocchi[/b] 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 [b]classi[/b] ed i [b]metodi[/b], questo tipo di programmazione implementa tre tecniche:
– L'[b]incapsulamento[/b], 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'[b]ereditarietà[/b], 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
[i]classe{studenti{femmine,maschi{nerd,truzzi,…}}, professori{maschi,femmine}}[/i].
– Il [b]polimorfismo[/b], tecnica con il quale si può sfruttare per una [b]classe[/b] tutti i valori delle proprie [b]sottoclassi[/b] senza dover per forza specificarne il tipo. Tutti i linguaggi non tipizzati, come il [b]Python[/b], 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 [b]C++[/b], [b]Java[/b], [b]C#[/b], [b]Obj-C[/b], [b]Python[/b], [b]Smalltalk[/b], [b]Scala[/b], [b]Ruby[/b] e molti altri.
[title]Prog. Dichiarativa a.k.a. NOT Imperativa[/title]
No, non stavo mangiando le porte [b]NAND[/b] del mio processore mentre scrivevo il titoletto: la [b]programmazione dichiarativa[/b], [i]declarative programming[/i], può essere definita perfettamente anche solo come programmazione [b]non imperativa[/b] e non c’è definizione migliore di questa, proprio per la [i]natura[/i] di questo paradigma.
La programmazione dichiarativa è un tipo di programmazione che si [b]oppone[/b] all’ usanza dei programmatori di ricercare la via perfetta del [b]COME[/b] fare a trovare una soluzione inseguendo la domanda del [b]COSA[/b] dovrebbe essere computato e con [b]quali elementi[/b]. E’ caratterizzata da una [i]trasparenza referenziale [/i]( assenza di elementi che possono modificare elementi di input come “x = x + 1” ) ed è molto spesso abbinata alla logica matematica che è [i]auto-descrittiva[/i] dal punto di vista delle proprie caratteristiche.
E’ estremamente [b]difficile[/b] dare un esempio corretto di pura programmazione dichiarativa, ma possono essere collegati a questa dichiarazione [b]SQL[/b], [b]lex[/b], [b]XSLT[/b] e tutti i [b]linguaggi di[/b] [b]markup[/b] come [b]HTML[/b] e [b]CSS[/b].
[title]Prog. Logica e Prog. Funzionale a.k.a. Le ultime due sfigate che tali non sono[/title]
Entrambe [i]femori[/i] della programmazione dichiarativa, sono utilizzati in ambiti ristretti e molto specifici, sebbene molti concetti siano [b]entrati a far parte degli altri paradigmi[/b] e quindi si siano diffusi a 360°.
La[b] programmazione logica [/b]ha come rappresentante il fantasmagorico [b]PROLOG[/b] e viene utilizzata soprattutto in ambiti quali le [i]intelligenze artificiali[/i], la [i]bioinformatica[/i] e la [i]matematica[/i]. Come dice il nome, esso sfrutta delle “[i]semplici[/i]” equazioni logiche per arrivare a [b]risolvere[/b] dei [b]problemi[/b] 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 [i]dichiarativamente[/i] che [i]imperativamente[/i], lasciando grandissima libertà al programmatore.
Possono essere citati altri linguaggi come [b]LISP[/b], [b]Datalog[/b], [b]Oz[/b] e [b]Gödel[/b] che rispecchiano e sfruttano questo tipo di paradigma.
L’ultimo ma non meno famoso paradigma è quello composto dalla [b]programmazione funzionale[/b]. In questo caso, è la [i]matematica[/i] a far da padrone e sono le [b]funzioni matematiche[/b] i blocchi che formano il programma. Questo paradigma è infatti molto usato in [i]ambito accademico[/i] per quanto riguarda soprattutto la statistica ([b]R[/b]), l’analisi ([b]J[/b], [b]K[/b]) e la stessa matematica simbolica ([b]Mathematica[/b]) ma è riuscito anche ad intrufolarsi in ambito commerciale ed industriale con [b]Haskell[/b], [b]Scheme[/b], [b]Erlang[/b] e[b] F#[/b].
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:
– [url=http://en.wikipedia.org/wiki/Programming_paradigm]Programming paradigm[/url]
– [url=http://see.stanford.edu/see/lecturelist.aspx?coll=2d712634-2bf1-4b55-9a3a-ca9d470755ee]Corso CS107 di Stanford[/url]
– [url=http://en.wikipedia.org/wiki/Comparison_of_programming_paradigms]Comparazione di paradigmi di programmazione[/url]
– [url=https://leganerd.com/tag/propa/]Precedenti articoli di Propa[/url]
[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]