Ogni tanto mi capita di trovarmi immischiato nella discussione che da anni tormenta programmatori e informatici di ogni nazione ed etnia: meglio usare un linguaggio tipizzato dinamicamente o staticamente?
Senza pretese di scientificità o di dogma o di starvi a rivelare chissà quale verità arcana nascosta, vi dirò la mia sull’argomento. Innanzitutto sappiate che sulla faida statico/dinamico ci sono tonnellate di discussioni filosofiche, euristiche, epistemologiche e tecniche capaci di far impallidire chiunque provi ad avvicinarsi alla questione.
Celeberrimo è il duck test di Whitcomb Riley: “Quando io vedo un uccello che cammina come un’anatra, nuota come un’anatra e starnazza come un’anatra, io chiamo quell’uccello “anatra””. Concetto che i sostenitori della tipizzazione dinamica sintetizzano in: guardate la vignetta precedente, se la scritta vi è stata di aiuto allora la tipizzazione statica fa per voi.
In pratica la questione è prettamente filosofica: l’identità di un oggetto-barra-valore deve derivare dalle sue caratteristiche o da una specifica esterna? Ovvero: un’anatra è un anatra perché vola, nuota, ha le piume, etc… oppure è un anatra perché dico che è un anatra?
Dal punto di vista della rappresentazione della conoscenza possiamo essere d’accordo che un oggetto sia identificato dalle sue proprietà, dal punto di vista informatico invece la questione è più spinosa. In informatica tutto è un numero e i numeri non hanno proprietà per natura bensì caratteristiche che nascono dall’interpretazione che io ne do (tramite l’assegnazione di un tipo).
Ma chiudendo la parentesi filosofica torniamo all’atto pratico: perché dovrei scegliere un linguaggio statico rispetto ad un linguaggio dinamico? Non c’è risposta, serve solo l’esperienza e il gusto personale. Tuttavia negli ultimi dieci anni ci hanno distrutto l’anima raccontandoci che i linguaggi statici (C, Java e compari) erano obsoleti e che il futuro era dinamico. Il risultato di questa campagna è che attualmente abbiamo decine di linguaggi dinamici liberi e di ottimo livello (Python, Ruby, PHP e molti altri) e solo un paio di linguaggi statici decenti. Io, da estimatore dei linguaggi statici, vengo qui per raccontarvi le mie personali considerazioni sull’argomento.
1. Ordine nel caos
Quando mi sono messo ad usare il Python per progetti di media complessità (vedi CobraDraughts) ho sempre avuto l’impressione che tutto era avvolto dal disordine. Il fatto che non bisognava dichiarare da nessuna parte gli attributi di una classe mi inquietava.
Oltre ai miei problemi psicologici però c’era un comportamento oggettivamente fastidioso: presa la classe A non c’era verso dalla classe B di sapere durante la digitazione del codice quali attributi avesse e, soprattutto, di che tipo fossero. Questo perché non esiste nessun tipo associato alle variabili di un linguaggio dinamico!
Questo comporta due grossi problemi:
- Il compilatore è quasi inutile come strumento di correzione degli errori. Se passo una stringa ad una variabile che nell’intero arco della sua vita deve contenere solamente interi non lo vengo a scoprire fino a quando non eseguo quella porzione di codice e il programma muore. Insomma, l’analisi statica del codice è praticamente nulla. Bisogna armarsi di pazienza e code-coverage ed eseguire il codice.
- L’overloading di funzioni con lo stesso numero di parametri è un parto greco. Probabilmente non si usano ma il mio cuore ne ha sofferto.
A me personalmente tutta questa cosa fa sembrare che il programma si regga su un sottobosco di magia che non apprezzo. Inoltre la stretta maglia dei tipi mi costringe anche a strutturare meglio il codice e ad essere più rigoroso nello sviluppo.
2. Prestazioni
Qui c’è poco da fare. I linguaggi statici stracciano spesso e volentieri un linguaggio dinamico sul campo prestazionale, sia per il tempo che per la memoria. Ciò è causato semplicemente da tutto l’overhead necessario a gestire la “naturalissima” dinamicità delle variabili. Per alcune applicazioni ciò non è un problema (anche grazie all’uso di librerie che wrappano codice C) ma per molte altre invece si!
Molti dicono che questo non è un gran problema perché abbiamo macchine sempre più efficienti. Io credo che questo sia come dire che posso ingrassare venti chili perché tanto ho i pantaloni con l’elastico.
3. Didattica
Un aspetto da non trascurare. Quando mi trovo davanti la solita domanda su quale linguaggio sia meglio per cominciare a programmare, sento che molti consigliano linguaggi come il Python perché sono più semplici. Questo è sicuramente vero, la tipizzazione dinamica permette di trascurare una gran parte di aspetti della programmazione, ma mentre ciò può essere buono per chi già programma, a mio avviso, è un problema per chi comincia. Sarebbe come se un maestro di scacchi mi insegnasse a giocare senza cavalli, alfieri e 4 pedoni perché così è “più facile”.
Il risultato di certe politiche è l’inondazione di brutto codice e la prolificazione di programmi orrendamente progettati. Senza contare i bimbominkia del development che vanno in giro a raccontare che “il C è inutilmente complesso e fa schifo” mentre “il PHP ruleggia”.
È quindi importante per chi tiene corsi o si vuole avvicinare alla programmazione senza tutta la vicinanza alla macchina del C, di mantenersi almeno all’inizio sui linguaggi statici (come il Java o il C#) che aiutano a creare quella forma mentis necessaria anche per i linguaggi dinamici.
Inoltre, se ciò non bastasse, è più facile passare dallo statico al dinamico che viceversa. Quindi sul lungo periodo si risparmia anche fatica.
In conclusione: questi sono i motivi per cui trovo molto molto più divertente lavorare con linguaggi staticamente tipizzati rispetto ai linguaggi dinamicamente tipizzati. Non sono leggi assolute e potete benissimo rispondermi che “io col Python ho programmato un AI senziente ed è stato facilissimo”. Ci credo, anche io uso il Python spesso.
Chiudo con una speranza. La speranza che i linguaggi statici vengano riscoperti e portati avanti in modo da avere la stessa scelta che abbiamo oggi con quelli dinamici. Lasciare questo mondo solo al C/C++, allo sgangherato Java e al controverso C# secondo me è una grandissima occasione sprecata.
bimbominkia del development: “il C è inutilmente complesso e fa schifo” mentre “il PHP ruleggia”. Niente di più vero.
Si potrebbe dire anche che l’ “abuso” di linguaggi dinamicamente tipizzati ha contribuito alla produzione di tonnellate di codice, chiamiamolo “osceno”, disorganizzato, …
Personalmente, io che con i linguaggi staticamente e fortemente tipizzati ho costruito le mie basi, inorridisco all’idea di non dichiarare un attributo in una classe.
Chi mi conosce sa che la mia opinione di Java è di amore-odio. Magari parlerò di Ceylon (un estensione di Java di Red Hat) e li darò sfogo della mia frustrazione. XD
Ciao
credo ci sia un errore nella spiegazione delle variabili intere al punto #1.
Grazie. Corretto. 🙂