Panoramica del runtime del linguaggio dinamico
Il runtime del linguaggio dinamico (DLR) è un ambiente di runtime che aggiunge un set di servizi per i linguaggi dinamici al Common Language Runtime (CLR). DLR semplifica lo sviluppo di linguaggi dinamici da eseguire in .NET e l'aggiunta di funzionalità dinamiche ai linguaggi tipizzato in modo statico.
I linguaggi dinamici possono identificare il tipo di un oggetto in fase di esecuzione, mentre in linguaggi tipizzato in modo statico, ad esempio C# e Visual Basic (quando si usa Option Explicit On
), è necessario specificare i tipi di oggetto in fase di progettazione. Esempi di linguaggi dinamici sono Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra e Groovy.
La maggior parte dei linguaggi dinamici offre i vantaggi seguenti per gli sviluppatori:
- Possibilità di usare un ciclo di feedback rapido (REPL o ciclo read-evaluate-print). In questo modo è possibile immettere diverse istruzioni ed eseguirle immediatamente per visualizzare i risultati.
- Supporto per lo sviluppo dall'alto verso il basso e per lo sviluppo più tradizionale dal basso verso l'alto. Ad esempio, quando si usa un approccio dall'alto verso il basso, è possibile chiamare funzioni che non sono ancora implementate e quindi aggiungere implementazioni sottostanti quando sono necessarie.
- È più semplice eseguire il refactoring e le modifiche al codice, perché non è necessario modificare le dichiarazioni di tipo statico in tutto il codice.
I linguaggi dinamici rendono eccellenti i linguaggi di scripting. I clienti possono estendere facilmente le applicazioni create usando linguaggi dinamici con nuovi comandi e funzionalità. I linguaggi dinamici vengono usati spesso anche per la creazione di siti Web e test harness, la gestione di server farm, lo sviluppo di varie utilità e l'esecuzione di trasformazioni dei dati.
Lo scopo di DLR è consentire l'esecuzione di un sistema di linguaggi dinamici in .NET e offrire loro l'interoperabilità .NET. DLR aggiunge oggetti dinamici a C# e Visual Basic per supportare il comportamento dinamico in questi linguaggi e abilitare l'interoperabilità con i linguaggi dinamici.
DLR consente anche di creare librerie che supportano operazioni dinamiche. Ad esempio, se si dispone di una libreria che usa oggetti JSON (XML o JavaScript Object Notation), gli oggetti possono essere visualizzati come oggetti dinamici ai linguaggi che usano DLR. In questo modo gli utenti della libreria scrivono codice sintatticamente più semplice e più naturale per l'uso con oggetti e l'accesso ai membri dell'oggetto.
Ad esempio, è possibile usare il codice seguente per incrementare un contatore in XML in C#.
Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);
Usando DLR, è possibile usare invece il codice seguente per la stessa operazione.
scriptobj.Count += 1;
Analogamente a CLR, DLR fa parte di .NET. È disponibile per il download nel repository IronLanguages/dlr su GitHub.
IronPython è un esempio di linguaggio sviluppato usando DLR.
Vantaggi principali di DLR
DLR offre i vantaggi seguenti.
Semplifica la conversione di linguaggi dinamici in .NET
Il DLR consente agli implementatori del linguaggio di evitare di creare analizzatori lessicali, parser, analizzatori semantici, generatori di codice e altri strumenti che tradizionalmente dovevano creare da soli. Per usare DLR, un linguaggio deve produrre alberi delle espressioni, che rappresentano il codice a livello di linguaggio in una struttura a forma di albero, routine helper di runtime e oggetti dinamici facoltativi che implementano l'interfaccia IDynamicMetaObjectProvider. DLR e .NET automatizzano molte attività di analisi del codice e generazione del codice. Ciò consente agli implementatori del linguaggio di concentrarsi su funzionalità specifiche del linguaggio.
Abilita le funzionalità dinamiche nei linguaggi tipizzati in modo statico
I linguaggi .NET esistenti, ad esempio C# e Visual Basic, possono creare oggetti dinamici e usarli insieme a oggetti tipizzati in modo statico. Ad esempio, C# e Visual Basic possono usare oggetti dinamici per HTML, Document Object Model (DOM) e reflection.
Offre i vantaggi futuri del DLR e .NET
I linguaggi implementati tramite DLR possono trarre vantaggio dai futuri miglioramenti di DLR e .NET. Ad esempio, se .NET rilascia una nuova versione con un Garbage Collector migliorato o un tempo di caricamento più rapido degli assembly, i linguaggi implementati usando DLR ottengono immediatamente lo stesso vantaggio. Se DLR aggiunge ottimizzazioni come una compilazione migliore, le prestazioni migliorano anche per tutti i linguaggi implementati tramite DLR.
Consente la condivisione di librerie e oggetti
Gli oggetti e le librerie implementati in un linguaggio possono essere usati da altri linguaggi. Il DLR consente anche l'interoperabilità tra linguaggi fortemente tipizzati e linguaggi dinamici. Ad esempio, C# può dichiarare un oggetto dinamico che usa una libreria scritta in un linguaggio dinamico. Allo stesso tempo, i linguaggi dinamici possono usare librerie di .NET Framework.
Fornisce una rapida invocazione ed esecuzione dinamica
Il DLR offre un'esecuzione rapida di operazioni dinamiche supportando la memorizzazione nella cache polimorfica avanzata. DLR crea regole per le operazioni di associazione che usano oggetti per le implementazioni di runtime necessarie e quindi memorizza nella cache queste regole per evitare calcoli di binding che esauriscono le risorse durante le esecuzioni successive dello stesso codice sugli stessi tipi di oggetti.
Architettura DLR
DLR aggiunge un set di servizi a CLR per supportare meglio i linguaggi dinamici. Questi servizi includono quanto segue:
Alberi delle espressioni. DLR usa alberi delle espressioni per rappresentare la semantica del linguaggio. A questo scopo, DLR ha esteso alberi delle espressioni LINQ per includere il flusso di controllo, l'assegnazione e altri nodi di modellazione del linguaggio. Per altre informazioni, vedere Alberi delle Espressioni (C#) o Alberi delle Espressioni (Visual Basic).
Caching del sito di chiamata. Un sito di chiamata dinamico è una posizione nel codice in cui si esegue un'operazione come
a + b
oa.b()
su oggetti dinamici. DLR memorizza nella cache le caratteristiche dia
eb
(in genere i tipi di questi oggetti) e le informazioni sull'operazione. Se tale operazione è stata eseguita in precedenza, DLR recupera tutte le informazioni necessarie dalla cache per l'invio rapido.Interoperabilità degli oggetti dinamici. DLR fornisce un set di classi e interfacce che rappresentano oggetti e operazioni dinamici e possono essere usati dagli implementatori del linguaggio e dagli autori di librerie dinamiche. Queste classi e interfacce includono IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObjecte ExpandoObject.
DLR usa i binder nei siti di chiamata per comunicare non solo con .NET, ma con altre infrastrutture e servizi, ad esempio COM. I binder incapsulano la semantica di un linguaggio e specificano come eseguire operazioni in un sito di chiamata usando alberi delle espressioni. In questo modo, i linguaggi tipizzati dinamicamente e staticamente, che usano il DLR, possono condividere le librerie e ottenere l'accesso a tutte le tecnologie supportate dal DLR.
Documentazione di DLR
Per altre informazioni su come usare la versione open source di DLR per aggiungere un comportamento dinamico a un linguaggio o su come abilitare l'uso di un linguaggio dinamico con .NET, vedere la documentazione sul repository IronLanguages/dlr su GitHub.