Panoramica di Dynamic Language Runtime

Dynamic Language Runtime (DLR) è un ambiente di runtime che estende Common Language Runtime (CLR) con un set di servizi per linguaggi dinamici. 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 agli sviluppatori i vantaggi seguenti:

  • Possibilità di usare un ciclo di commenti rapido (REPL o ciclo Read–Eval–Print). Ciò consente di immettere diverse istruzioni e di eseguirle immediatamente per vedere i risultati.
  • Supporto per lo sviluppo dall'alto verso il basso e per quello 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 sono eccellenti linguaggi di scripting. Grazie ai linguaggi dinamici, i clienti possono estendere facilmente le applicazioni create 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 introduce gli oggetti dinamici in C# e Visual Basic per supportare il comportamento dinamico in questi linguaggi e consentirne l'interoperabilità con i linguaggi dinamici.

DLR consente inoltre di creare librerie che supportano le operazioni dinamiche. Se ad esempio si dispone di una libreria che usa oggetti XML o JavaScript Object Notation (JSON), questi si presenteranno come oggetti dinamici ai linguaggi che usano DLR. Ciò consente agli utenti della libreria di scrivere codice più naturale e più semplice dal punto di vista della sintassi per operare con gli oggetti e accedere ai relativi membri.

Ad esempio, in XML in C# è possibile usare il codice seguente per incrementare un contatore.

Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);

Con DLR è invece possibile usare 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

Grazie a DLR, i responsabili dell'implementazione del linguaggio possono evitare la creazione di analizzatori lessicali, parser, analizzatori semantici, generatori di codice e di altri strumenti che di norma sono tenuti a creare. Per usare DLR, un linguaggio deve produrre alberi delle espressioni che rappresentano il codice a livello di linguaggio in una struttura ad albero, routine di supporto del 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 ai responsabili dell'implementazione del linguaggio di concentrarsi sulle funzionalità peculiari del linguaggio.

Abilita le funzionalità dinamiche nei linguaggi tipizzato 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 vantaggi futuri di 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 viene ottimizzato, ad esempio con una migliore funzionalità di compilazione, le prestazioni miglioreranno 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. DLR consente inoltre l'interoperabilità tra linguaggi tipizzati in modo statico e 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 le librerie di .NET Framework.

Fornisce un invio dinamico rapido e una chiamata

DLR consente l'esecuzione veloce di operazioni dinamiche tramite il supporto di un'avanzata funzionalità polimorfica di memorizzazione nella cache. DLR crea regole per associare le operazioni che usano oggetti alle necessarie implementazioni in fase di esecuzione e quindi le memorizza nella cache per evitare che durante le esecuzioni successive dello stesso codice sugli stessi tipi di oggetti vengano eseguiti calcoli di associazione onerosi in termini di uso delle risorse.

Architettura di DLR

DLR estende CLR con un set di servizi in grado di supportare in modo più efficiente i linguaggi dinamici. Di seguito sono indicati alcuni servizi disponibili:

  • Alberi delle espressioni. DLR usa gli alberi delle espressioni per rappresentare la semantica del linguaggio. A questo scopo, DLR ha esteso gli alberi dell'espressione LINQ affinché includano 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).

  • Memorizzazione nella cache del sito di chiamata. Un sito di chiamata dinamica è un punto nel codice in cui si esegue un'operazione come a + b o a.b() su oggetti dinamici. DLR memorizza nella cache le caratteristiche di a e b (in genere i tipi di questi oggetti) e le informazioni sull'operazione. Se questa operazione è stata eseguita in precedenza, DLR recupera tutte le informazioni necessarie dalla cache per l'invio rapido.

  • Interoperabilità con gli oggetti dinamici. DLR offre un set di classi e interfacce che rappresentano operazioni e oggetti dinamici e che possono essere usate dai responsabili dell'implementazione del linguaggio e dagli autori di librerie dinamiche. Queste classi e interfacce includono IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject e 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 la modalità di esecuzione delle operazioni in un sito di chiamata usando gli alberi delle espressioni. Ciò consente ai linguaggi dinamici e a quelli tipizzati in modo statico che usano DLR di condividere le librerie e di accedere a tutte le tecnologie supportate da 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 in GitHub.

Vedi anche