`

Linguaggio D versione 2(转)

阅读更多

Linguaggio D versione 2

转自http://leonardo-m.livejournal.com/93664.html

Non si puo' spiegare tutto un linguaggio in un post, ma una spiegazione di cosa sia puo' velocizzare assai un suo possibile successivo apprendimento. Per cui eccovi lo Zen del D (qui parlo solo della sua versione 2).

Inevitabilmente questo post e' piuttosto sintetico, per cui do' per scontate varie conoscenze informatiche e sui linguaggi di programmazione.

D assomiglia ad una ripulitura del C++0x, a cui siano state aggiunte parti di Java (GC, OOP), e qualche briciola di Python (slice, array associativi, operatori stringa, docstrings) ed Eiffel (Contract Programming).

D vorrebbe essere un system language, ma alcune sue caratteristiche, in particolare il GC, lo rendono inadatto a sostituire il C ad esempio se vuoi scrivere il kernel di un OS, o se vuoi programmare CPU molto piccole con pochissima RAM. Per cui D puoi vederlo come un linguaggio applicativo che pero' ti permette se lo desideri di avere spesso un controllo piu' minuzioso della macchina di quanto si possa fare in Java/C#.

Il D possiede un GC che in teoria e' disattivabile, ma in pratica i programmi un po' piu' ampi non possono farne a meno. La presenza del GC cambia molte cose.

Il D e' tipizzato staticamente, e il compilatore produce un binario che gira sulla CPU reale. Nelle implementazioni attuali non c'e' virtual machine o JIT, al massimo a runtime c'e' il GC, che e' di solito linkato staticamente nell'eseguibile. Gli eseguibili sono al minimo pesanti circa 170 KB.

Il D non e' compatibile con la sintassi del C++, ma in genere quanto una sintassi del C funziona in D, allora fa la stessa cosa che fa in C, con pochissime eccezioni. Per cui se traduci codice da C a D o non compila, o se compila allora da' gli stessi risultati del codice C, questo e' molto utile dato che il mondo e' pieno di codice C (questa scelta di design ha anche effetti negativi, rendendo difficile la correzione di alcuni difetti del C, per cui sfortunatamente anche in D uint+int fa uint, e gli switch hanno fallthrough).

Una delle filosofie del C++ e' "zero overhead", cioe' non aggiungere overhead nel codice per feature che il programmatore non sta usando. D invece accetta un piccolo overhead se questo puo' ad esempio ridurre il numero di bug nel codice. Infatti il D e' progettato per aiutare spesso il progammatore ad evitare i piu' comuni bug. Spesso nel D esiste il modo per ridurre a zero un qualche overhead, ma per default il linguaggio usa la cosa sicura. E usa la cosa insicura e con zero overhead solo dove chi programma la richieda esplicitamente. Ad esempio gli array controllano i loro bounds, anche se puoi compilare un eseguibile finale che omette tali test. Per default la memoria e' sempre thread-local.

D possiede sia una versione ripulita e piuttosto potenziata dei template del C++0x, che l'OOP quasi copiato da Java e poi lievemente esteso. Quindi D e' un linguaggio con tante feature e di complessita' paragonabile a quella del C++0x. Ma moltissime cose sono state ripulite rispetto al C++0x, molti casi particolari sono stati eliminati, per cui di fatto la complessita' del linguaggio e' comunque un bel po' minore di quella del C++0x.

In D non c'e' eredita' delle struct, e gli oggetti possono venire usati solo per riferimento (anche se in certi casi si possono allocare sullo stack). Non possiede le macro del C, e cerca di fare le cose in modo piu' sicuro e pulito. L'inlining e' automatico. E' fatto a moduli, che devono venire importati e non possiede file header.

Come il C, il D cerca di fare il meno possibile a run-time e piu' possibile a tempo di compilazione. Infatti una caratteristica peculiare del D e' poter eseguire tante cose a tempo di compilazione, in particolare e' possibile eseguire le funzioni a tempo di compilazione. Questo, unito ai template, permette di fare molta metaprogrammazione. In D c'e' meno riflessivita' a runtime rispetto a Java, in compenso c'e' molta piu' riflessivita' a tempo di compilazione, per cui ad esempio a tempo di compilazione si possono fare giochi complicati sui tipi.

In D array dinamici, array associativi e array a lunghezza fissa allocati sullo stack sono built-in. Le stringhe sono array dinamici spesso immutabili. L'unicode e' built-in. Gli array hanno una sintassi per lo slicing e concatenation tipo quella di Python, comoda anche grazie al GC che supporta il tutto.

In D esiste un potente sistema per definire costanti, ed e' perfino transitivo, cioe' se qualcosa viene marcato come costante, allora tutto l'"albero" di cio' che contiene e' costante. Questo si spera possa aiutare nella futura programmazione parallela.

D possiede attributi (che il compilatore verifica) per funzioni pure, nothrow. E possiede anche vere closure. Possiede anche lambda con una sintassi non ottimale ma decente.

Il D e' fatto per non richiedere un compilatore dotato di back-end molto moderno (per cui non si pretende che sappia fare inlining di metodi virtuali e di delegate), tipo quelli di Java, per cui anche un back-end di dieci anni fa va bene. Comunque al momento il miglior back-end e' l'assai moderno LLVM.

D e' un linguaggio complesso e giovane, scritto e progettato in gran parte da una singola persona, Walter, che ha grande esperienza nello scrivere compilatori. Al momento contiene parecchi bug, la biblioteca standard e' un po' disastrata, non possiede ottime IDE e ha un GC molto inefficiente. D e' stato progettato per essere compilabile in modo molto pulito, semplice e veloce, e' compilabile anche 20-40 volte piu' in fretta del C++. Il fatto che sia compilabile in modo pulito (e quindi gli stadi della compilazione sono semanticamente separati tra loro in modo molto marcato) e' una forte esigenza del D, forse la principale secondo Walter (questo ha effetti ad esempio sulla sintassi del foreach che e' ottimizzata per il compilatore e non per chi programma).

D e' stato creato da una persona con ampia esperienza di C. Questo significa che molti dei difetti/trappole del C sono stati tappati esplicitamente. Questo pero' significa anche che Walter e' vecchio stile, e quindi D non e' progettato per essere usato con una IDE, e ignora parecchie novita' introdotte in linguaggi come C#3, Scala e Clojure.

Built-in in D ci sono "docstrings" analoghe a quelle di Python, dei sovrasemplificati unit test, e anche una sufficientemente buona implementazione della Contract Programming dell'Eiffel. Cio', ammesso che venga usato da chi programma, aiuta ad evitare bug.

In mezzo al codice D si puo' inserire codice assembly, ma una funzione che contiene assembly non subisce inlining.

Puo' stupire vedere che molti buoni idiomi del C/C++ sono presenti in D sotto forma di sintassi specifiche, esplicite e comode. D contiene quasi tutte le nuove feature del C++0x, alcune semplificate o ripulite.

La versione 2 del D non non e' compatibile con la passata versione 1. In D V.1 ci sono due biblioteche standard doverse e non usabili contemporaneamente. Si spera che lo stesso problema non accada in futuro in D2.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics