Visão geral do Dynamic Language Runtime

O dynamic language runtime (DLR) é um ambiente de tempo de execução que adiciona um conjunto de serviços para linguagens dinâmicas ao Common Language Runtime (CLR). O DLR facilita o desenvolvimento de linguagens dinâmicas para execução no .NET e a adição de recursos dinâmicos a linguagens tipadas estaticamente.

As linguagens dinâmicas podem identificar o tipo de um objeto em tempo de execução, enquanto em linguagens tipadas estaticamente, como C# e Visual Basic (quando você usa Option Explicit On), você deve especificar tipos de objeto em tempo de design. Exemplos de linguagens dinâmicas são Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra e Groovy.

A maioria das linguagens dinâmicas oferece as seguintes vantagens para os desenvolvedores:

  • A capacidade de usar um loop de feedback rápido (REPL, ou loop de leitura-avaliação-impressão). Isso permite inserir várias instruções e executá-las imediatamente para ver os resultados.
  • Apoio tanto ao desenvolvimento descendente como ao desenvolvimento ascendente mais tradicional. Por exemplo, quando você usa uma abordagem de cima para baixo, pode chamar funções que ainda não foram implementadas e, em seguida, adicionar implementações subjacentes quando precisar delas.
  • Refatoração mais fácil e modificações de código, porque você não precisa alterar declarações de tipo estático em todo o código.

As linguagens dinâmicas criam excelentes linguagens de script. Os clientes podem facilmente estender aplicativos criados usando linguagens dinâmicas com novos comandos e funcionalidades. As linguagens dinâmicas também são frequentemente usadas para criar sites e conjuntos de teste, manter farms de servidores, desenvolver vários utilitários e executar transformações de dados.

O objetivo do DLR é permitir que um sistema de linguagens dinâmicas seja executado no .NET e dar-lhes interoperabilidade .NET. O DLR adiciona objetos dinâmicos ao C# e ao Visual Basic para oferecer suporte ao comportamento dinâmico nessas linguagens e permitir sua interoperação com linguagens dinâmicas.

O DLR também ajuda a criar bibliotecas que suportam operações dinâmicas. Por exemplo, se você tiver uma biblioteca que usa objetos XML ou JavaScript Object Notation (JSON), seus objetos podem aparecer como objetos dinâmicos para linguagens que usam a DLR. Isso permite que os usuários da biblioteca escrevam código sintaticamente mais simples e natural para operar com objetos e acessar membros de objetos.

Por exemplo, você pode usar o código a seguir para incrementar um contador em XML em C#.

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

Usando o DLR, você pode usar o código a seguir para a mesma operação.

scriptobj.Count += 1;

Como o CLR, o DLR faz parte do .NET. Está disponível para download no repositório IronLanguages/dlr no GitHub.

IronPython é um exemplo de uma linguagem que foi desenvolvida usando o DLR.

Principais vantagens do DLR

O DLR oferece as seguintes vantagens.

Simplifica a portabilidade de linguagens dinâmicas para .NET

O DLR permite que os implementadores de linguagem evitem a criação de analisadores lexicais, analisadores, analisadores semânticos, geradores de código e outras ferramentas que eles tradicionalmente tinham que criar por conta própria. Para usar o DLR, uma linguagem precisa produzir árvores de expressão, que representam o código no nível da linguagem em uma estrutura em forma de árvore, rotinas auxiliares de tempo de execução e objetos dinâmicos opcionais que implementam a IDynamicMetaObjectProvider interface. O DLR e o .NET automatizam muitas tarefas de análise de código e geração de código. Isso permite que os implementadores de linguagem se concentrem em recursos de linguagem exclusivos.

Permite recursos dinâmicos em idiomas tipados estaticamente

Linguagens .NET existentes, como C# e Visual Basic, podem criar objetos dinâmicos e usá-los junto com objetos tipados estaticamente. Por exemplo, C# e Visual Basic podem usar objetos dinâmicos para HTML, DOM (Document Object Model) e reflexão.

Fornece benefícios futuros do DLR e .NET

As linguagens implementadas usando o DLR podem se beneficiar de futuras melhorias no DLR e no .NET. Por exemplo, se o .NET lançar uma nova versão que tenha um coletor de lixo aprimorado ou um tempo de carregamento de montagem mais rápido, os idiomas implementados usando o DLR obterão imediatamente o mesmo benefício. Se a DLR adicionar otimizações, como melhor compilação, o desempenho também melhora para todas as linguagens implementadas usando a DLR.

Permite o compartilhamento de bibliotecas e objetos

Os objetos e bibliotecas implementados em um idioma podem ser usados por outros idiomas. O DLR também permite a interoperação entre linguagens estáticas e dinâmicas. Por exemplo, C# pode declarar um objeto dinâmico que usa uma biblioteca escrita em uma linguagem dinâmica. Ao mesmo tempo, as linguagens dinâmicas podem usar bibliotecas do .NET Framework.

Fornece despacho e invocação dinâmicos rápidos

O DLR fornece execução rápida de operações dinâmicas, suportando cache polimórfico avançado. O DLR cria regras para operações de vinculação que usam objetos para as implementações de tempo de execução necessárias e, em seguida, armazena em cache essas regras para evitar cálculos de vinculação que esgotam recursos durante execuções sucessivas do mesmo código nos mesmos tipos de objetos.

Arquitetura DLR

O DLR adiciona um conjunto de serviços ao CLR para melhor suportar linguagens dinâmicas. Estes serviços incluem o seguinte:

  • Árvores de expressão. O DLR usa árvores de expressão para representar a semântica da linguagem. Para isso, o DLR estendeu as árvores de expressão do LINQ para incluir fluxo de controle, atribuição e outros nós de modelagem de linguagem. Para obter mais informações, consulte Árvores de expressão (C#) ou Árvores de expressão (Visual Basic).

  • Cache de site de chamadas. Um site de chamada dinâmica é um local no código onde você executa uma operação como a + b ou a.b() em objetos dinâmicos. O DLR armazena em cache as características de a e b (geralmente os tipos desses objetos) e informações sobre a operação. Se tal operação tiver sido executada anteriormente, o DLR recuperará todas as informações necessárias do cache para despacho rápido.

  • Interoperabilidade dinâmica de objetos. O DLR fornece um conjunto de classes e interfaces que representam objetos e operações dinâmicas e podem ser usados por implementadores de linguagem e autores de bibliotecas dinâmicas. Essas classes e interfaces incluem IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject, e ExpandoObject.

O DLR usa fichários em sites de chamada para se comunicar não apenas com o .NET, mas com outras infraestruturas e serviços, como COM. Os fichários encapsulam a semântica de uma linguagem e especificam como executar operações em um site de chamada usando árvores de expressão. Isso permite linguagens dinâmicas e estaticamente tipadas que usam o DLR para compartilhar bibliotecas e obter acesso a todas as tecnologias suportadas pelo DLR.

Documentação DLR

Para obter mais informações sobre como usar a versão de código aberto do DLR para adicionar comportamento dinâmico a uma linguagem, ou sobre como habilitar o uso de uma linguagem dinâmica com .NET, consulte a documentação sobre o repositório IronLanguages/dlr no GitHub.

Consulte também