Cenni preliminari su Dynamic Language RuntimeDynamic Language Runtime Overview

Dynamic Language Runtime (DLR) è un ambiente di runtime che estende Common Language Runtime (CLR) con un set di servizi per linguaggi dinamici.The dynamic language runtime (DLR) is a runtime environment that adds a set of services for dynamic languages to the common language runtime (CLR). DLR semplifica lo sviluppo di linguaggi dinamici da eseguire in .NET Framework e l'aggiunta di funzionalità dinamiche ai linguaggi tipizzati in modo statico.The DLR makes it easier to develop dynamic languages to run on the .NET Framework and to add dynamic features to statically typed languages.

I linguaggi dinamici sono in grado di identificare il tipo di un oggetto in fase di esecuzione, mentre nei linguaggi tipizzati in modo statico quali C# e Visual Basic (quando si usa Option Explicit On) i tipi di oggetto devono essere specificati in fase di progettazione.Dynamic languages can identify the type of an object at run time, whereas in statically typed languages such as C# and Visual Basic (when you use Option Explicit On) you must specify object types at design time. Esempi di linguaggi dinamici sono Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra e Groovy.Examples of dynamic languages are Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra, and Groovy.

La maggior parte dei linguaggi dinamici offre agli sviluppatori i vantaggi seguenti:Most dynamic languages provide the following advantages for developers:

  • Possibilità di usare un ciclo di commenti rapido (REPL o ciclo Read–Eval–Print).The ability to use a rapid feedback loop (REPL, or read-evaluate-print loop). Ciò consente di immettere diverse istruzioni e di eseguirle immediatamente per vedere i risultati.This lets you enter several statements and immediately execute them to see the results.

  • Supporto per lo sviluppo dall'alto verso il basso e per quello più tradizionale dal basso verso l'alto.Support for both top-down development and more traditional bottom-up development. Ad esempio, quando si usa un approccio dall'alto verso il basso è possibile chiamare le funzioni non ancora implementate e quindi aggiungere le implementazioni sottostanti quando necessario.For example, when you use a top-down approach, you can call functions that are not yet implemented and then add underlying implementations when you need them.

  • Semplificazione del refactoring e delle modifiche del codice poiché non è necessario modificare le dichiarazioni di tipo statico in tutto il codice.Easier refactoring and code modifications, because you do not have to change static type declarations throughout the code.

I linguaggi dinamici sono eccellenti linguaggi di scripting.Dynamic languages make excellent scripting languages. Grazie ai linguaggi dinamici, i clienti possono estendere facilmente le applicazioni create con nuovi comandi e funzionalità.Customers can easily extend applications created by using dynamic languages with new commands and functionality. I linguaggi dinamici sono spesso usati anche per creare siti Web e test harness, gestire server farm, sviluppare varie utilità ed eseguire trasformazioni di dati.Dynamic languages are also frequently used for creating Web sites and test harnesses, maintaining server farms, developing various utilities, and performing data transformations.

Lo scopo di DLR è consentire l'esecuzione di un sistema di linguaggi dinamici in .NET Framework e garantire a tali linguaggi l'interoperabilità .NET.The purpose of the DLR is to enable a system of dynamic languages to run on the .NET Framework and give them .NET interoperability. In Visual Studio 2010 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.The DLR introduces dynamic objects to C# and Visual Basic in Visual Studio 2010 to support dynamic behavior in these languages and enable their interoperation with dynamic languages.

DLR consente inoltre di creare librerie che supportano le operazioni dinamiche.The DLR also helps you create libraries that support dynamic operations. 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.For example, if you have a library that uses XML or JavaScript Object Notation (JSON) objects, your objects can appear as dynamic objects to languages that use the 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.This lets library users write syntactically simpler and more natural code for operating with objects and accessing object members.

Ad esempio, in XML in C# è possibile usare il codice seguente per incrementare un contatore.For example, you might use the following code to increment a counter in XML in C#.

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

Con DLR è invece possibile usare il codice seguente per la stessa operazione.By using the DLR, you could use the following code instead for the same operation.

scriptobj.Count += 1;

Come CLR, DLR è incluso in .NET Framework e viene fornito con i pacchetti di installazione di .NET Framework e Visual Studio.Like the CLR, the DLR is a part of the .NET Framework and is provided with the .NET Framework and Visual Studio installation packages. La versione open source di DLR è anche disponibile per il download nel repository IronLanguages/dlr in GitHub.The open-source version of the DLR is also available for download on the IronLanguages/dlr repo on GitHub.

Nota

La versione open source di DLR offre tutte le funzionalità della versione inclusa in Visual Studio e .NET Framework.The open-source version of the DLR has all the features of the DLR that is included in Visual Studio and the .NET Framework. Fornisce inoltre supporto aggiuntivo ai responsabili dell'implementazione del linguaggio.It also provides additional support for language implementers. Per altre informazioni, vedere la documentazione nel repository IronLanguages/dlr in GitHub.For more information, see the documentation on the IronLanguages/dlr repo on GitHub.

Gli esempi di linguaggi sviluppati mediante l'uso di DLR includono i seguenti:Examples of languages developed by using the DLR include the following:

  • IronPython.IronPython. Disponibile come software open source nel sito Web GitHub.Available as open-source software from the GitHub Web site.

  • IronRuby.IronRuby. Disponibile come software open source nel sito Web RubyForge.Available as open-source software from the RubyForge Web site.

Vantaggi principali di DLRPrimary DLR Advantages

DLR offre i vantaggi seguenti.The DLR provides the following advantages.

Semplifica la portabilità dei linguaggi dinamici in .NET FrameworkSimplifies Porting Dynamic Languages to the .NET Framework

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.The DLR allows language implementers to avoid creating lexical analyzers, parsers, semantic analyzers, code generators, and other tools that they traditionally had to create themselves. 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.To use the DLR, a language needs to produce expression trees, which represent language-level code in a tree-shaped structure, runtime helper routines, and optional dynamic objects that implement the IDynamicMetaObjectProvider interface. DLR e .NET Framework automatizzano molte attività di analisi e generazione del codice.The DLR and the .NET Framework automate a lot of code analysis and code generation tasks. Ciò consente ai responsabili dell'implementazione del linguaggio di concentrarsi sulle funzionalità peculiari del linguaggio.This enables language implementers to concentrate on unique language features.

Abilita le funzionalità dinamiche nei linguaggi tipizzati in modo staticoEnables Dynamic Features in Statically Typed Languages

I linguaggi .NET Framework esistenti, ad esempio C# e Visual Basic, sono in grado di creare oggetti dinamici e di usarli insieme a oggetti tipizzati in modo statico.Existing .NET Framework languages such as C# and Visual Basic can create dynamic objects and use them together with statically typed objects. Ad esempio, C# e Visual Basic usano oggetti dinamici per HTML, Document Object Model (DOM) e la reflection .NET.For example, C# and Visual Basic can use dynamic objects for HTML, Document Object Model (DOM), and .NET reflection.

Offre i vantaggi futuri di DLR e .NET FrameworkProvides Future Benefits of the DLR and .NET Framework

I linguaggi implementati tramite DLR trarranno vantaggio dai miglioramenti che in futuro saranno apportati a DLR e .NET Framework.Languages implemented by using the DLR can benefit from future DLR and .NET Framework improvements. Se ad esempio viene rilasciata una nuova versione di .NET Framework che include un Garbage Collector migliorato o tempi di caricamento delle assembly più rapidi, i linguaggi implementati tramite DLR beneficeranno immediatamente dello stesso vantaggio.For example, if the .NET Framework releases a new version that has an improved garbage collector or faster assembly loading time, languages implemented by using the DLR immediately get the same benefit. Se DLR viene ottimizzato, ad esempio con una migliore funzionalità di compilazione, le prestazioni miglioreranno anche per tutti i linguaggi implementati tramite DLR.If the DLR adds optimizations such as better compilation, the performance also improves for all languages implemented by using the DLR.

Abilita la condivisione di librerie e oggettiEnables Sharing of Libraries and Objects

Gli oggetti e le librerie implementati in un linguaggio possono essere usati da altri linguaggi.The objects and libraries implemented in one language can be used by other languages. DLR consente inoltre l'interoperabilità tra linguaggi tipizzati in modo statico e dinamici.The DLR also enables interoperation between statically typed and dynamic languages. Ad esempio, C# può dichiarare un oggetto dinamico che usa una libreria scritta in un linguaggio dinamico.For example, C# can declare a dynamic object that uses a library that is written in a dynamic language. Allo stesso tempo, i linguaggi dinamici possono usare le librerie di .NET Framework.At the same time, dynamic languages can use libraries from the .NET Framework.

Offre funzionalità di invio e chiamata veloci e dinamicheProvides Fast Dynamic Dispatch and Invocation

DLR consente l'esecuzione veloce di operazioni dinamiche tramite il supporto di un'avanzata funzionalità polimorfica di memorizzazione nella cache.The DLR provides fast execution of dynamic operations by supporting advanced polymorphic caching. 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.The DLR creates rules for binding operations that use objects to the necessary runtime implementations and then caches these rules to avoid resource-exhausting binding computations during successive executions of the same code on the same types of objects.

Architettura di DLRDLR Architecture

Nella figura seguente viene illustrata l'architettura di Dynamic Language Runtime.The following illustration shows the architecture of the dynamic language runtime.

![Dynamic Language Runtime Architecture Overview] (Panoramica sull'architettura di Dynamic Language Runtime) (../../../docs/framework/reflection-and-codedom/media/dlr-archoverview.png "DLR_ArchOverview")Dynamic Language Runtime Architecture Overview
Architettura di DLRDLR architecture

DLR estende CLR con un set di servizi in grado di supportare in modo più efficiente i linguaggi dinamici.The DLR adds a set of services to the CLR for better supporting dynamic languages. Questi servizi includono:These services include the following:

  • Alberi delle espressioni.Expression trees. DLR usa gli alberi delle espressioni per rappresentare la semantica del linguaggio.The DLR uses expression trees to represent language semantics. 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.For this purpose, the DLR has extended LINQ expression trees to include control flow, assignment, and other language-modeling nodes. Per altre informazioni, vedere Alberi delle espressioni.For more information, see Expression Trees.

  • Memorizzazione nella cache del sito di chiamata.Call site caching. Un sito di chiamata dinamica è un punto nel codice in cui si esegue un'operazione come a + b o a.b() su oggetti dinamici.A dynamic call site is a place in the code where you perform an operation like a + b or a.b() on dynamic objects. DLR memorizza nella cache le caratteristiche di a e b (in genere i tipi di questi oggetti) e le informazioni sull'operazione.The DLR caches the characteristics of a and b (usually the types of these objects) and information about the operation. Se questa operazione è stata eseguita in precedenza, DLR recupera tutte le informazioni necessarie dalla cache per l'invio rapido.If such an operation has been performed previously, the DLR retrieves all the necessary information from the cache for fast dispatch.

  • Interoperabilità con gli oggetti dinamici.Dynamic object interoperability. 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.The DLR provides a set of classes and interfaces that represent dynamic objects and operations and can be used by language implementers and authors of dynamic libraries. Queste classi e interfacce includono IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject e ExpandoObject.These classes and interfaces include IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject, and ExpandoObject.

DLR usa i binder nei siti di chiamata per comunicare non solo con .NET Framework, ma anche con altri servizi e infrastrutture, tra cui Silverlight e COM.The DLR uses binders in call sites to communicate not only with the .NET Framework, but with other infrastructures and services, including Silverlight and 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.Binders encapsulate a language's semantics and specify how to perform operations in a call site by using expression trees. 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.This enables dynamic and statically typed languages that use the DLR to share libraries and gain access to all the technologies that the DLR supports.

Documentazione di DLRDLR Documentation

Per altre informazioni su come usare la versione open source di DLR per aggiungere il comportamento dinamico a un linguaggio o su come abilitare l'uso di un linguaggio dinamico con .NET Framework, vedere la documentazione nel repository IronLanguages/dlr in GitHub.For more information about how to use the open source version of the DLR to add dynamic behavior to a language, or about how to enable the use of a dynamic language with the .NET Framework, see the documentation on the IronLanguages/dlr repo on GitHub.

Vedere ancheSee Also

ExpandoObject
DynamicObject
Common Language RuntimeCommon Language Runtime
Alberi delle espressioniExpression Trees
Procedura dettagliata: Creazione e utilizzo di oggetti dinamiciWalkthrough: Creating and Using Dynamic Objects