Visão geral do runtime de linguagem dinâmica
O DLR (dynamic Language Runtime) é um ambiente de runtime que adiciona um conjunto de serviços para linguagens dinâmicas ao CLR (Common Language Runtime). A 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.
Idiomas dinâmicos 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 dos idiomas dinâmicos oferece 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 inserir várias instruções e executá-las imediatamente para ver os resultados.
- Suporte para desenvolvimento de cima para baixo e desenvolvimento de baixo para cima mais tradicional. Por exemplo, ao usar uma abordagem de cima para baixo, você pode chamar funções que ainda não foram implementadas e, em seguida, adicionar implementações subjacentes quando precisar delas.
- Refatoração e modificações de código mais fáceis, pois você não precisa alterar declarações de tipo estático em todo o código.
Idiomas dinâmicos fazem excelentes idiomas de script. Os clientes podem estender facilmente os aplicativos criados usando linguagens dinâmicas com novos comandos e funcionalidades. Linguagens dinâmicas também são frequentemente usadas para criar sites e ferramenta de teste, manter fazendas de servidores, desenvolver vários utilitários e executar transformações de dados.
A finalidade da DLR é permitir que um sistema de linguagens dinâmicas seja executado no .NET e conceder-lhes interoperabilidade do .NET. A DLR adiciona objetos dinâmicos ao C# e ao Visual Basic para dar suporte ao comportamento dinâmico nesses idiomas e habilitar sua interoperação com idiomas dinâmicos.
A 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 use objetos XML ou JavaScript Object Notation (JSON), seus objetos poderão 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 a DLR, você pode usar o código a seguir para a mesma operação.
scriptobj.Count += 1;
Assim como o CLR, a DLR faz parte do .NET. Ele está disponível para download no repositório IronLanguages/dlr no GitHub.
IronPython é um exemplo de uma linguagem que foi desenvolvida usando a DLR.
Principais vantagens de DLR
A DLR fornece as seguintes vantagens.
Simplifica a portabilidade de idiomas dinâmicos para .NET
O DLR permite que os implementadores de linguagem evitem criar analisadores léxicos, analisadores de sintaxe, analisadores semânticos, geradores de código e outras ferramentas que tradicionalmente precisavam criar eles mesmos. Para usar a DLR, uma linguagem precisa produzir árvores de expressão , que representam o código em 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. A 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 idiomas se concentrem em recursos de linguagem exclusivos.
Habilita recursos dinâmicos em linguagens tipadas 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 do .NET
As linguagens implementadas usando a DLR podem se beneficiar de melhorias futuras de DLR e .NET. Por exemplo, se o .NET lançar uma nova versão que tenha um coletor de lixo aprimorado ou tempo de carregamento de assembly mais rápido, os idiomas implementados usando a DLR obterão imediatamente o mesmo benefício. Se a DLR adicionar otimizações como melhor compilação, o desempenho também melhorará para todos os idiomas implementados usando a DLR.
Habilita o compartilhamento de bibliotecas e objetos
Os objetos e bibliotecas implementados em um idioma podem ser usados por outras linguagens. A DLR também habilita a interoperação entre linguagens estaticamente tipadas e dinâmicas. Por exemplo, o C# pode declarar um objeto dinâmico que usa uma biblioteca que é escrita em uma linguagem dinâmica. Ao mesmo tempo, idiomas dinâmicos podem usar bibliotecas do .NET Framework.
Fornece despacho e invocação dinâmicos e rápidos
A DLR fornece execução rápida de operações dinâmicas com suporte ao cache polimórfico avançado. O DLR cria regras para operações de vinculação que usam objetos para as implementações de runtime necessárias e, em seguida, armazena essas regras em cache para evitar cálculos de vinculação que esgotam recursos durante execuções subsequentes do mesmo código nos mesmos tipos de objeto.
Arquitetura de DLR
A DLR adiciona um conjunto de serviços ao CLR para dar melhor suporte a linguagens dinâmicas. Esses serviços incluem o seguinte:
Árvores de expressão. A DLR usa árvores de expressão para representar a semântica da linguagem. Para essa finalidade, a DLR estendeu árvores de expressão 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 chamada. Um site de chamada dinâmica é um local no código em que você executa uma operação como
a + b
oua.b()
em objetos dinâmicos. A DLR armazena em cache as características dea
eb
(geralmente os tipos desses objetos) e informações sobre a operação. Se essa operação tiver sido executada anteriormente, a DLR recuperará todas as informações necessárias do cache para despacho rápido.Interoperabilidade de objeto dinâmico. A DLR fornece um conjunto de classes e interfaces que representam objetos e operações dinâmicos e podem ser usadas por implementadores de linguagem e autores de bibliotecas dinâmicas. Essas classes e interfaces incluem IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObjecte ExpandoObject.
O DLR usa vinculadores em sites de chamada para se comunicar não apenas com o .NET, mas com outras infraestruturas e serviços, como o COM. Os associadores encapsulam a semântica de um idioma e especificam como executar operações em um site de chamada usando árvores de expressão. Isso permite que linguagens dinamicamente e estaticamente tipadas que usam a DLR compartilhem bibliotecas e acessem todas as tecnologias suportadas pela DLR.
Documentação da DLR
Para obter mais informações sobre como usar a versão de software livre da DLR para adicionar comportamento dinâmico a um idioma 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.