Linguaggio D

Introduzione               
 

Un altro linguaggio di programmazione appartenente alla categoria dei C-like si chiama D. Banale? Può darsi ma almeno indica chiaramente e "sinceramente" il desiderio di proporsi come alternativa o meglio addirittura successore rispetto alla fortunata coppia C/C++.
Il linguaggio D nasce dall'intento di proporre un mix delle migliori caratteristiche del C/C++ con quelle di linguaggi maggiormente produttivi come Ruby o Python. Potenza e produttività coniugati in un unico prodotto. Impresa non facile da portare a termine. Il padre di questo linguaggio è Walter Bright di Digital Mars (già produttore di ottimi strumenti e compilatori a supporto proprio di C++) e il suo sforzo ha fatto nascere un prodotto che, pur non raggiungendo una popolarità simile a quella ad esempio di Java o di C#, ha una buona base di appassionati e un "ecosistema" abbastanza vivace. Come spesso accade meriterebbe maggior gloria di quella che ha ma il marketing è il marketing e Digital Mars non ha di sicuro la forza in questo senso di Oracle o tantomeno Microsoft o Apple. Un certo boost ha dato al linguaggio l'ingresso della figura di Andrei Alexandrescu autore tra l'altro di un ottimo testo e diventato forse il maggior esperto mondiale di questo strumento, oltre ad essere un "guru" anche sul C++..

D è un linguaggio compilato direttamente per la piattaforma sottostante, quindi non ci sono macchine virtuali di mezzo. E'  caratterizzato da una tipizzazione statica (quindi ogni variabile ha un suo tipo ben definito) e forte (quindi non sono ammesse operazioni non compatibili col tipo stesso). E' multiparadigma abbracciando gli approcci  imperativo (perchè no?), object oriented, funzionale e la metaprogrammazione (in pratica il linguaggio è in grado di manipolare a runtime i propri costrutti trattandoli come dati). L'approccio del linguaggio però è di tipo pratico, non c'è spazio per i fondamentalismi. Ai puristi potrà non piacere ma il target è quello delle applicazioni real-life. Ad esempio l'approccio a oggetti è marcato ma in D non tutto è un oggetto a prescindere. Usare gli oggetti insomma è visto come una opportunità, non come un obbligo.
Fin qui nulla di particolare. Il punto vero è che il linguaggio è stato visto, lo ripetiamo ancora, come una evoluzione di C++ andando a ricercare le debolezze di quest'ultimo e cercando di colmarle senza perdere nulla della potenza originale arricchendolo con nuove potenzialità, ad esempio da subito D ha suppoprtato pienamente UNICODE, laddove C++ ci è arrivato solo dalla versione 11 e in maniera un po' controversa.  Parliamo di contract programming? Ebbene in D questa metodologia è pienamente supportata e, secondo me, è una gran cosa. L'effettiva utilità del "design by contract", come si dice nella versione originale, è dibattuta ma, sarà un caso, molti linguaggi se ne stanno dotando, direttamente o attraverso librerie apposite di terze parti. Penso tra l'altro che l'implementazione che abbiamo in questo linguaggio sia la migliore insieme ovviamente a quella che si trova in Eiffel. Anche la tecnica della unit-testing potrà essere usata senza problemi.
Vi sono poi alcune differenze sostanziali: l'ereditarietà è multipla in C++ mentre è singola (con l'uso delle interfacce) in D, diversa è la gestione del parallelismo che è stato completamente rivisto e, a mio modo di vedere, trattato in maniera più efficiente. Detto che le performance sono sempre in  primo piano, la capacità potremmo definirla "autoespressiva" del codice D dovrebbe costituire un altro elemento a favore. Da Python è stata presa la gestione dei moduli in luogo dei complessi file header. Sono ovviamente supportate le chiusure, e cosi pure i le cosiddette funzioni lambda, per restare nel campo della programmazione funzionale.

Questo rapido excursus su alcune caratteristiche del linguaggio non può essere ovviamente esaustivo rispetto tutto quanto vedremo relativamente a D. Diciamo che serve ad incuriosire. E' importante che resti chiaro il concetto che lo sforzo è stato quello di sviluppare uno strumento di lavoro efficace, potente che, senza rinnegare le nobili basi (C++), si è saputo astrarre da esse per abbracciare quegli aspetti che gli studi più recenti hanno introdotto nel campo della programmazione. Nella sua descrizione di partenza viene definito di livello più alto rispetto al C++ riuscendo tuttavia a mantenere la capacità di interfacciarsi con le API di sistema e con l'hardware.

Tutto bene? Si però ci deve pur essere qualche controindicazione. Ebbene si, ce ne sono.
Prima di tutto la curva di apprendimento non è, a mio avviso, così dolce come gli autori speravano e, a volte, dicono. Programmare in D non è complicato come in C++ ma non è così nemmeno così immediato come in Ruby o Python (ammesso che anche con quei linguaggi sia poi così facile... diffidare sempre da chi vi dice che programmare in questo o quel linguaggio è facile). Ci sono inoltre alcuni comportamenti del linguaggio secondo me poco "onesti" e non mancherò di rimarcarlo., pur se si tratta di mie opinioni.
C'è poi la questione dello sviluppo, molto lento rispetto a quanto sanno fare altri operatori sul campo. La versione 2.0 di D è stata in gestazione per anni, poi alla fine ci si è arrivati ma quanta attesa..... A proposito, anche se in fase di installazione vi troverete disponibili la versione 1.x e la 2.y fate sempre riferimento alla seconda per quanto riguarda lo sviluppo di nuove applicazioni in quanto è quella ormai ritenuta ufficiale. Il punto è che Digital Mars è una compagnia di piccole dimensioni rispetto ad altri attori nel settore (Microsoft, Sun/Oracle, ora ci si sono buttati dentro anche Google e RedHat) le cui risorse, anche finanziariamente parlando, sono limitate e quindi i mezzi non sono gli stessi di cui usufruiscono i maggiori competitors.
Gli strumenti e la documentazione a disposizione non sono nemmeno lontanamente paragonabili a quello a cui possiamo essere abituati in altri linguaggi, per cui bisogna fare ricorso spesso al buon cuore della community, per quanto ho visto molto dinamica e prodiga di suggerimenti e consigli. Tra l'altro la documentazione che si trova sul web non sempre è aggiornata spesso si trovano articoli anche interessanti ma vecchi e non si sa quanto attuali. Dire che D è general purpose è vero ma certo la finalità del linguaggio non aiuta quando si ha bisogno soprattutto di validi strumenti per usare lo stesso e allora ecco che usare ad esempio Visual Studio è più comodo di quanto possiamo usare per sviluppare in linguaggio di mr. Bright (anche se è stato sviluppato un plugin proprio per Visual Studio) e solo questo ci può portare magari a preferire C# al D . Lato Web siamo ancora indietro per quanto riguarda il supporto, anche se quel mondo è uno dei target seguiti da Digital Mars con molta attenzione. E' stato possibile realizzare qualche applicazione del genere ma di sicuro non esiste una via maestra prederminata, un modus operandi sicuro. Insomma D sembra indicato, attualmente, soprattutto per la programmazione di sistema ma qui il territorio è dominato dalla solita accoppiata C/C++. Va comunque sottolineato che la situazione sta migliorando sotto tutti i punti di vista e la diffusione del linguaggio sembra in esapnsione.
Certamente siamo di fronte ad un eccellente strumento con alcune finezze di alto livello, di questo potete esserne certi e lo dico con convizione assoluta, avente però un supporto per forza di cose più debole rispetto ai colossi del settore. Se riuscirà ad uscire dalla sua nicchia è cosa dubbia, inutile nasconderselo, tenendo presente comunque che a settembre 2011 risultava al 20esimo posto tra i linguaggi di programmazione più usati, un risultato da non disprezzare.

D è disponibile per Windows, Linux e Mac. Come detto compila direttamente in linguaggio macchina ma esiste ancora su Codeplex un progetto per il porting su .Net, progetto che peraltro mi pare in stato di completo abbandono ormai da anni. D su .Net possiamo dire che al momento attuale è pura utopia. 

Come detto la versione 2.x è quella ormai da prendere in considerazione per la creazione di nuovi progetti. Questa versione è moderna, potente ed aggiornata e dovrebbe avere risolto anche le criticità dovute al fork generatosi per la presenza di due diverse librerie quella ufficiale, Phobos, adattata e migliorata anche per D2 e quella nata dallo sforzo di parte della community e chiamata Tango, il link è più avanti. Quest'ultima è supportata solo da D1, per quanto ne so e, pur avendo indubbi aspetti interessanti, non ha raggiunto i suoi scopi ed è stata lentamente abbandonata, non essendo riuscito lo sforzo di far nascere un ulteriore nuovo linguaggio che si appoggiasse su di essa.

Da parte mia cercherò di spiegare i concetti nel modo più semplice possibile, tenendo presente come linea guida quella tracciata da Andrei Alexandrescu nel suo ottimo testo su questo linguaggio, testo che consiglio a tutti come un must assoluto, il vero K&R per il D.

Prima di chiudere questa breve introduzione alcuni links utili:

--Home del progetto relativo al linguaggio
--Sito di risorse (non aggiornato, direi)
--Sito reference
--Sito di Andrei Alexandrescu, "guru" del linguaggio, autore di un ottimo testo.
--La "solita" entry su Wikipedia
--Sito della libreria alternativa Tango
--Interessante articolo on-line
--D-IDE un IDE sperimentale per il D.