D: Ho spesso sentito l'affermazione secondo cui le lingue tipizzate dinamicamente sono più produttive delle lingue tipizzate staticamente. Quali sono i motivi di questa affermazione? "
Questo ha ragioni storiche. Se torni indietro di qualche decennio, i linguaggi dinamici erano indiscutibilmente molto più produttivi dei linguaggi statici (anche se significativamente più lenti). Perl è chiaramente molto più produttivo di C se conosci entrambi e il compito a portata di mano lo consente. Ma nel tempo le lingue si sono indebitate molto l'una dall'altra e le lingue più recenti stanno riducendo il divario (sia in termini di produttività che di prestazioni).
Ecco alcuni punti da considerare:
Raccolta dei rifiuti : la raccolta dei rifiuti è un enorme aumento della produttività. Credo che Java sia stato il primo linguaggio statico tradizionale con GC. Prima di questo, statico significava essenzialmente la gestione manuale della memoria. (Nota: qui e nel seguito sto solo prendendo in considerazione i linguaggi mainstream. Esistono molte lingue sperimentali e di nicchia che forniranno controesempi a qualsiasi punto che faccio.)
Sicurezza della memoria : è un miglioramento della produttività che non devi preoccuparti di spararti al piede. Prima di linguaggi statici "gestiti" come Java, statico significava in genere l'accesso diretto alla memoria. Anche il debug fa parte della produttività e l'accesso alla memoria non sicuro può portare a bug davvero oscuri.
Sistemi di tipo ingombranti. Prima dell'introduzione di tipi parametrici (come modelli o generici) nei linguaggi statici, le limitazioni dei sistemi di tipi statici erano spesso un peso. Ad esempio, in Java è stato necessario eseguire il downcast esplicito ogni volta che si è scelto un elemento da una raccolta. Quindi hai il sovraccarico sintattico di un cast e nessuna sicurezza di tipo. Considerando come le collezioni onnipresenti sono in programmazione, questo è stato un grosso svantaggio.
Dover dichiarare il tipo di tutto è un sacco di tipizzazione ridondante, ma con l'inferenza del tipo moderno, questo può essere ridotto in modo significativo.
Grande libreria standard. Python è stato pubblicizzato come "batterie incluse" a causa della grande libreria standard. Questo rispetto a C che ha una libreria standard molto minimalista. Ma con piattaforme come Java e .net, una vasta libreria standard sta diventando standard e linguaggi più recenti come Scala e F # ereditano questo "gratuitamente".
Strutture di dati di prima classe. Linguaggi dinamici come Perl e Python hanno strutture dati di prima classe integrate come elenchi e mappe con comode scorciatoie sintattiche per operazioni comuni. Rispetto a questo, C non ha raccolte incorporate tranne le matrici di dimensioni fisse.
Chiusure e sintassi lambda : in genere i linguaggi dinamici hanno avuto questo dall'inizio, ma i linguaggi statici hanno adottato questo, più recentemente Java.
REPL la capacità di testare rapidamente frammenti di codice in modo interattivo è un grande vantaggio. Ma sebbene gli strumenti IDE, come la finestra "immediata" in Visual Studio, i linguaggi statici possano emularlo in una certa misura.
Strumenti avanzati : oltre ai punti precedenti in cui i linguaggi statici si stanno avvicinando alla praticità dei linguaggi dinamici, i moderni editor stanno sfruttando l'analisi statica in modo che i linguaggi dinamici abbiano difficoltà a corrispondere. Ad esempio, i redattori possono fornire rifatturazioni automatiche sicure, cosa che a rigore è impossibile in un linguaggio dinamico.
In conclusione: storicamente era vero, ma oggi la risposta è meno chiara.
D: Quindi: cosa c'è da dire sulla produttività con la tipizzazione dinamica che è davvero un vantaggio del modello di tipo stesso?
È in qualche modo difficile separare il modello di tipizzazione dinamica dai linguaggi dinamici, ma ad esempio C # ha adottato più funzioni più dinamiche nel tempo, anche se il suo nucleo è un linguaggio statico. Questa è davvero una prova del vantaggio del modello di tipo dinamico. Esempi:
Reflection
Reflection è fondamentalmente una funzione di digitazione dinamica. Ispeziona i tipi di oggetto in fase di runtime rispetto al tempo di compilazione. Quando è stato introdotto, era un po 'malvisto, ma in C # l'uso della riflessione diventa sempre più onnipresente, ad esempio ASP.Net MVC usa pesantemente la riflessione.
Attributi Gli
attributi sono un esempio di digitazione dinamica. È possibile aggiungere attributi arbitrari a una classe in fase di compilazione, quindi ispezionare in fase di esecuzione (tramite la riflessione) e manipolare oggetti basati su di essa. Qualcosa come MEP è fondamentalmente un framework di estensione basato su un modello di tipo dinamico.
Linq a SQL, EF mv.
I vari trasformatori Linq ispezionano le query come oggetti runtime e generano sql al volo. Non diventa più dinamico dell'ispezione del codice in fase di esecuzione. CodeDom è l'altro lato della medaglia, in cui il codice può essere generato in fase di esecuzione
Roslyn
Roslyn fondamentalmente implementa eval
, che una volta era considerata la caratteristica distintiva di un linguaggio veramente dinamico.
Dinamico
Il dynamic
tipo è la caratteristica più esplicitamente dinamica in C # ed è pubblicizzata nel rendere più semplice e produttiva l'interazione con oggetti e linguaggi esterni. Ma è anche usato in Asp.net MVC per comodità.
Il vantaggio di tutte le funzionalità sopra riportate mostra che il modello dinamico presenta vantaggi evidenti anche in un linguaggio statico con tipi parametrizzati, tipi strutturali e inferenza di tipo.