Visão geral do Dynamic Language Runtime

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). O DLR facilita o desenvolvimento de linguagens dinâmicas para serem executadas no .NET e para adicionar recursos dinâmicos a linguagens tipadas estaticamente.

As linguagens dinâmicas podem identificar o tipo de um objeto no momento da execução, ao passo que nas linguagens estaticamente tipadas, como C# e Visual Basic (quando você usa Option Explicit On), é necessário especificar os tipos de objetos no momento do 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 fornece as seguintes vantagens para os desenvolvedores:

  • A capacidade de usar um loop de comentários rápidos (REPL ou loop de leitura-avaliação-impressão). Isso permite que você insira várias instruções e execute-as para ver os resultados imediatamente.
  • Suporte para desenvolvimento descendente ou ascendente, que é o mais tradicional. Por exemplo, quando você usa uma abordagem de cima para baixo, pode chamar funções que ainda não foram implementadas e adicionar implementações subjacentes quando precisar delas.
  • Refatoração e modificações de código mais fáceis, porque você não precisa alterar as declarações de tipos estáticos em todo o código.

Linguagens dinâmicas podem ser excelentes linguagens de script. Os clientes podem estender facilmente os aplicativos criados usando linguagens dinâmicas com novos comandos e funcionalidades. As linguagens dinâmicas também são usadas com frequência para a criação de sites e agentes de teste, manutenção de farms de servidores, desenvolvimento de vários utilitários e realização de transformações de dados.

O objetivo do DLR é permitir que um sistema de linguagens dinâmicas seja executado no .NET e dar a elas interoperabilidade com o .NET. 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.

O DLR também ajuda você a criar bibliotecas que dão suporte a operações dinâmicas. 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. 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.

Por exemplo, você pode usar o seguinte código para incrementar um contador em XML em 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.

scriptobj.Count += 1;

Assim como o CLR, o DLR faz parte do .NET. Ele está disponível para download no repositório IronLanguages/dlr no GitHub.

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

Principais vantagens do DLR

O DLR fornece as vantagens a seguir.

Simplifica a portabilidade de linguagens dinâmicas para o .NET

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. 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. O DLR e o .NET automatizam muitas tarefas de análise 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 linguagens tipadas estaticamente

As linguagens .NET existentes, como C# e Visual Basic, podem criar objetos dinâmicos e usá-los junto com objetos tipados estaticamente. Por exemplo, o C# e o Visual Basic podem usar objetos dinâmicos para HTML, Modelo de Objeto de Documento (DOM) e reflexão.

Oferece benefícios futuros do DLR e do .NET

As linguagens implementadas usando o DLR podem se beneficiar de futuros aprimoramentos do DLR e do .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 assembly mais rápido, as linguagens implementadas com o uso da DLR obterão imediatamente o mesmo benefício. Se o DLR agregar otimizações como melhor compilação, o desempenho também melhorará para todas as linguagens implementadas usando o DLR.

Permite o compartilhamento de bibliotecas e objetos

Os objetos e bibliotecas implementados em uma linguagem podem ser usadas por outras. O DLR também proporciona interoperabilidade entre linguagens dinâmicas e com tipo estático. Por exemplo, C# pode declarar um objeto dinâmico que usa uma biblioteca que é escrita em uma linguagem dinâmica. Ao mesmo tempo, linguagens dinâmicas podem usar bibliotecas do .NET Framework.

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

O DLR fornece a rápida execução das operações dinâmicas dando suporte a cache polimórfico avançado. 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.

Arquitetura do DLR

O DLR agrega um conjunto de serviços ao CLR para melhorar o suporte a linguagens dinâmicas. esses serviços incluem o seguinte:

  • Árvores de expressão. O DLR usa árvores de expressão para representar a semântica da linguagem. 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. Para obter mais informações, consulte Árvores de expressão (C#) ou Árvores de expressão (Visual Basic).

  • Cache de site de chamada. 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. 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 uma operação tiver sido executada anteriormente, o DLR recupera todas as informações necessárias do cache para expedição rápida.

  • Interoperabilidade de objeto dinâmico. 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. Essas classes e interfaces incluem IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject e ExpandoObject.

O DLR usa associadores em sites de chamada para se comunicar não apenas com o .NET, mas também com outras infraestruturas e serviços, como COM. Associadores encapsulam a semântica da linguagem e especificam como executar operações em um site de chamada usando árvores de expressão. 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.

Documentação do DLR

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

Confira também