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
oua.b()
em objetos dinâmicos. O DLR armazena em cache as características dea
eb
(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.