Visão geral do Dynamic Language RuntimeDynamic Language Runtime Overview

O DLR (Dynamic Language Runtime) é um ambiente de tempo de execução que adiciona um conjunto de serviços para as linguagens dinâmicas do CLR (Common Language Runtime).The dynamic language runtime (DLR) is a runtime environment that adds a set of services for dynamic languages to the common language runtime (CLR). O DLR torna mais fácil desenvolver linguagens dinâmicas para execução no .NET Framework e adicionar recursos dinâmicos a linguagens de tipo estático.The DLR makes it easier to develop dynamic languages to run on the .NET Framework and to add dynamic features to statically typed languages.

Linguagens dinâmicas podem identificar o tipo de um objeto no tempo de execução, enquanto em linguagens de tipo estático como C# e Visual Basic (em que se usa Option Explicit On) você deve especificar os tipos de objeto no tempo de design.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. Exemplos de linguagens dinâmicas são 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.

A maioria das linguagens dinâmicas fornece as seguintes vantagens para os desenvolvedores:Most dynamic languages provide the following advantages for developers:

  • A capacidade de usar um loop de comentários rápidos (REPL ou loop de leitura-avaliação-impressão).The ability to use a rapid feedback loop (REPL, or read-evaluate-print loop). Isso permite que você insira várias instruções e execute-as para ver os resultados imediatamente.This lets you enter several statements and immediately execute them to see the results.

  • Suporte para desenvolvimento descendente ou ascendente, que é o mais tradicional.Support for both top-down development and more traditional bottom-up development. Por exemplo, quando você usa uma abordagem descendente, é possível chamar funções que ainda não foram implementadas e adicionar implementações subjacentes quando precisar deles.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.

  • É mais fácil realizar refatoração e modificações no código, pois não é necessário alterar as declarações de tipo estático por todo o código.Easier refactoring and code modifications, because you do not have to change static type declarations throughout the code.

Linguagens dinâmicas podem ser excelentes linguagens de script.Dynamic languages make excellent scripting languages. Os clientes podem estender facilmente os aplicativos criados usando linguagens dinâmicas com novos comandos e funcionalidades.Customers can easily extend applications created by using dynamic languages with new commands and functionality. As linguagens dinâmicas também são usadas com frequência para criar sites da Web e agentes de teste, manter os farms de servidores, desenvolver vários utilitários e executar transformações de dados.Dynamic languages are also frequently used for creating Web sites and test harnesses, maintaining server farms, developing various utilities, and performing data transformations.

A finalidade do DLR é permitir que um sistema das linguagens dinâmicas seja executado no .NET Framework e proporcionar interoperabilidade com o .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. O DLR adiciona objetos dinâmicos para C# e Visual Basic para dar suporte ao comportamento dinâmico nesses idiomas e habilitar sua interoperação com linguagens dinâmicas.The DLR adds dynamic objects to C# and Visual Basic to support dynamic behavior in these languages and enable their interoperation with dynamic languages.

O DLR também ajuda você a criar bibliotecas que dão suporte a operações dinâmicas.The DLR also helps you create libraries that support dynamic operations. Por exemplo, se você tiver uma biblioteca que usa objetos XML ou JSON (JavaScript Object Notation), os objetos poderão aparecer como objetos dinâmicos para as linguagens que usam o 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. Isso permite que os usuários da biblioteca escrevam código sintaticamente mais simples e mais natural para operar com objetos e acessar membros do objeto.This lets library users write syntactically simpler and more natural code for operating with objects and accessing object members.

Por exemplo, você pode usar o seguinte código para incrementar um contador em XML em C#.For example, you might use the following code to increment a counter in XML in C#.

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

Usando o DLR, você poderia usar o código a seguir em vez disso para a mesma operação.By using the DLR, you could use the following code instead for the same operation.

scriptobj.Count += 1;

Como o CLR, o DLR faz parte do .NET Framework e é fornecido com os pacotes de instalação do .NET Framework e do 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. A versão de software livre do DLR também está disponível para download no repositório IronLanguages/dlr no GitHub.The open-source version of the DLR is also available for download on the IronLanguages/dlr repo on GitHub.

Observação

A versão de software livre do DLR tem todos os recursos do DLR incluídos no Visual Studio e no .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. Ela também dá suporte adicional aos implementadores de linguagem.It also provides additional support for language implementers. Para obter mais informações, consulte a documentação no repositório IronLanguages/dlr no GitHub.For more information, see the documentation on the IronLanguages/dlr repo on GitHub.

Exemplos de linguagens desenvolvidos usando o DLR incluem:Examples of languages developed by using the DLR include the following:

  • IronPython.IronPython. Disponível como um software livre no site GitHub.Available as open-source software from the GitHub Web site.

  • IronRuby.IronRuby. Disponível como software livre no site do IronRuby .Available as open-source software from the IronRuby website.

Principais vantagens do DLRPrimary DLR Advantages

O DLR fornece as vantagens a seguir.The DLR provides the following advantages.

Simplifica a portabilidade de linguagens dinâmicas para o .NET FrameworkSimplifies Porting Dynamic Languages to the .NET Framework

O DLR permite que os implementadores de linguagem evitem criar analisadores tradicionais, lexicais ou semânticos, geradores de código e outras ferramentas que eles tradicionalmente precisavam criar eles mesmos.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. Para usar o DLR, uma linguagem precisa produzir árvores de expressão, que representam o código no nível de linguagem em uma estrutura em forma de árvore, rotinas auxiliares de runtime e objetos dinâmicos opcionais que implementam a interface 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. O DLR e o .NET Framework automatizam muitas tarefas de geração de código e de análise de código.The DLR and the .NET Framework automate a lot of code analysis and code generation tasks. Isso permite que os implementadores de linguagem se concentrem em recursos de linguagem exclusivos.This enables language implementers to concentrate on unique language features.

Habilitar recursos dinâmicos em linguagens de tipo estáticoEnables Dynamic Features in Statically Typed Languages

Linguagens do .NET Framework existentes como C# e Visual Basic podem criar objetos dinâmicos e usá-los junto com objetos de tipo estático.Existing .NET Framework languages such as C# and Visual Basic can create dynamic objects and use them together with statically typed objects. Por exemplo, C# e Visual Basic podem usar objetos dinâmicos para reflexão de HTML, DOM (Modelo de Objeto do Documento) e .NET.For example, C# and Visual Basic can use dynamic objects for HTML, Document Object Model (DOM), and .NET reflection.

Fornece benefícios futuros do DLR e do .NET FrameworkProvides Future Benefits of the DLR and .NET Framework

Linguagens implementadas usando o DLR podem aproveitar melhorias futuras do DLR e do .NET Framework.Languages implemented by using the DLR can benefit from future DLR and .NET Framework improvements. Por exemplo, se o .NET Framework lançar uma nova versão que tenha um coletor de lixo aprimorado ou tempo de carregamento de assembly mais rápido, linguagens implementadas usando o DLR imediatamente obterão os mesmos benefícios.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 o DLR agregar otimizações como melhor compilação, o desempenho também melhorará para todas as linguagens implementadas usando o DLR.If the DLR adds optimizations such as better compilation, the performance also improves for all languages implemented by using the DLR.

Permite o compartilhamento de bibliotecas e objetosEnables Sharing of Libraries and Objects

Os objetos e bibliotecas implementados em uma linguagem podem ser usadas por outras.The objects and libraries implemented in one language can be used by other languages. O DLR também proporciona interoperabilidade entre linguagens dinâmicas e com tipo estático.The DLR also enables interoperation between statically typed and dynamic languages. Por exemplo, C# pode declarar um objeto dinâmico que usa uma biblioteca que é escrita em uma linguagem dinâmica.For example, C# can declare a dynamic object that uses a library that is written in a dynamic language. Ao mesmo tempo, linguagens dinâmicas podem usar bibliotecas do .NET Framework.At the same time, dynamic languages can use libraries from the .NET Framework.

Fornece invocação e expedição dinâmica rápidasProvides Fast Dynamic Dispatch and Invocation

O DLR fornece a rápida execução das operações dinâmicas dando suporte a cache polimórfico avançado.The DLR provides fast execution of dynamic operations by supporting advanced polymorphic caching. O DLR cria regras para associar operações que usam objetos para as implementações de runtime necessárias e, em seguida, armazena essas regras para evitar o esgotamento de recursos de computações de associação durante execuções sucessivas do mesmo código nos mesmos tipos de objetos.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.

Arquitetura do DLRDLR Architecture

A ilustração a seguir mostra a arquitetura do dynamic language runtime.The following illustration shows the architecture of the dynamic language runtime.

Visão geral da arquitetura de tempo de execução de linguagem dinâmica Arquitetura do DLRDynamic Language Runtime Architecture Overview DLR architecture

O DLR agrega um conjunto de serviços ao CLR para melhorar o suporte a linguagens dinâmicas.The DLR adds a set of services to the CLR for better supporting dynamic languages. Tais serviços incluem os seguintes:These services include the following:

  • Árvores de expressão.Expression trees. O DLR usa árvores de expressão para representar a semântica da linguagem.The DLR uses expression trees to represent language semantics. Para tal, o DLR tem árvores de expressão LINQ estendidos para incluir o fluxo de controle, a atribuição e outros nós de modelagem de linguagem.For this purpose, the DLR has extended LINQ expression trees to include control flow, assignment, and other language-modeling nodes. Para obter mais informações, consulte Árvores de expressão (C#) ou Árvores de expressão (Visual Basic).For more information, see Expression Trees (C#) or Expression Trees (Visual Basic).

  • Cache de site de chamada.Call site caching. Um site de chamada dinâmico é um local no código em que você executa uma operação como a + b ou a.b() em objetos dinâmicos.A dynamic call site is a place in the code where you perform an operation like a + b or a.b() on dynamic objects. O DLR armazena em cache as características de a e b (geralmente os tipos desses objetos) e informações sobre a operação.The DLR caches the characteristics of a and b (usually the types of these objects) and information about the operation. Se uma operação tiver sido executada anteriormente, o DLR recupera todas as informações necessárias do cache para expedição rápida.If such an operation has been performed previously, the DLR retrieves all the necessary information from the cache for fast dispatch.

  • Interoperabilidade de objeto dinâmico.Dynamic object interoperability. O DLR fornece um conjunto de interfaces e classes que representam as operações e objetos dinâmicos e podem ser usados por implementadores de linguagem e autores de bibliotecas dinâmicas.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. Essas classes e interfaces incluem IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject e ExpandoObject.These classes and interfaces include IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject, and ExpandoObject.

O DLR usa associadores em sites de chamada para se comunicar não apenas com o .NET Framework, mas com outras infraestruturas e serviços, incluindo 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. Associadores encapsulam a semântica da linguagem e especificam como executar operações em um site de chamada usando árvores de expressão.Binders encapsulate a language's semantics and specify how to perform operations in a call site by using expression trees. Isso permite que linguagens dinâmicas e de tipo estático que utilizam o DLR compartilhem bibliotecas e obtenham acesso a todas as tecnologias às quais o DLR dá suporte.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.

Documentação do DLRDLR Documentation

Para obter mais informações sobre como usar a versão de software livre do DLR para adicionar comportamento dinâmico a uma linguagem ou sobre como habilitar o uso de uma linguagem dinâmica com o .NET Framework, consulte a documentação no repositório IronLanguages/dlr no 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.

Consulte tambémSee also