.NET - O suporte a linguagens dinâmicas na plataforma .NET


Você sabe o que é uma linguagem dinâmica ???

Mesmo que você não saiba definir com precisão com certeza já utilizou uma linguagem dinâmica.

Vai me dizer que você nunca usou JavaScript ???

Pois JavaScript, PHP, Python e Ruby (IronPython e IronRuby versões opensource da plataforma .NET), apenas para citar as mais conhecidas, são linguagens dinâmicas.

Mas e as linguagens Visual Basic .NET e C# , não são linguagens dinâmicas ?

Não, Visual Basic .NET , C# , C, Pascal, Java, etc. são linguagens estáticas.

Mas então qual a diferença entre as linguagens dinâmicas e as estáticas ?

Em uma linguagem estática a verificação dos tipos, objetos, declaração de métodos, variáveis, etc. é feita em tempo de compilação, de forma que havendo qualquer inconsistência, uma mensagem de erro será emitida em tempo de compilação. Dizemos que estas linguagens são estaticamente tipadas.

As linguagens dinâmicas realizam a verificação em tempo de execução, ou seja, somente quando o código for executado, de forma que durante a compilação nenhuma mensagem de erro será emitida. Dizemos que estas linguagens são dinamicamente tipadas.

Obs: Possuir tipagem dinâmica não implica necessáriamente que a linguagem seja dinâmica.A linguagem VB Script possui tipagem dinâmica mas não é uma linguagem dinâmica.

Qual é a melhor linguagem : estática ou dinâmica ?

Depende.

Obs: Existe uma 'eterna' discussão sobre qual linguagem seria melhor (coisas do tipo VB .NET ou C# ? Java ou C# ?) um dos argumentos a favor das linguagens estáticas seria que nas linguagens dinâmicas os testes unitários não conseguem 'pegar' erros que somente se manifestariam em tempo de execução em produção.

Tenha em mente que uma linguagem estática como C# ou VB .NET foi concebida para atuar dessa forma e não há nada errado com isso. Elas cumprem bem o seu papel e permitem ao desenvolvedor criar aplicações dos mais variados tipos com total funcionalidade.

As linguagens dinâmicas podem oferecer outros recursos não presentes nas linguagens estáticas mas devem ser usadas com muito cuidado e atenção pois podem esconder erros em tempo de compilação que somente se manifestarão em tempo de execução.

Então tudo vai depender da finalidade e do ambiente no qual você vai atuar mas em geral as linguagens estáticas vão muito bem obrigado.

C# e VB .NET agora com suporte ao novo tipo dynamic

Com o lançamento do VIsual Studio 2010 , a versão 4.0 do .NET Framework introduziu um novo tipo que funciona de forma dinâmica.

Na minha humilde opinião este recurso não transforma as linguagens C# e VB .NET em linguagens dinâmicas mas faz com que elas tenham suporte a tipos dinâmicos.

Antes da introdução deste curso a plataforma .NET utilizava a CLR - Commom Language RunTime - como plataforma comum para as linguagens estaticamente tipadas suportas pela plataforma .NET.

O CLR - Common Language Runtime - é o ambiente de execução do .NET T Framework, ele é responsável pelo gerenciamento da execução das aplicações, assim todo o código que ele gerencia é chamado de código gerenciado e todo o código que é executado diretamente sobre o sistema operacional é chamado código não gerenciado.

No processo de compilação de código escrito em qualquer linguagem .NET, são gerados artefatos denominados assemblies (DLLs ou EXEs), expressos em uma linguagem intermediária independente de hardware, a Microsoft Intermediate Language (MSIL). Neste momento o CLR usa um compilador de MSIL para o hardware em questão , é o que conhecemos por compilação just-in-time (JIT).

Mas então como o suporte a tipos dinâmicos foi introduzido ?

Na nova versão foi introduzido a DLR - Dynamic Language Runtime que é um ambiente de runtime que adiciona um conjunto de serviços para as linguagens dinâmicas no CLR. O DLR torna mais fácil desenvolver a execução de linguagens dinâmicas na plataforma .NET além de adicionar recursos recursos dinâmicos para as linguagens tipadas estaticamente.

A DLR passou então a dar suporte a as linguagens estáticas e dinâmicas:

A figura abaixo mostra a arquitetura da DLR na plataforma .NET:

Tanto as linguagens estáticas como as linguagens dinâmicas se baseiam na DLR. A novidade foi que o suporte para usar a DLR foi adicionado ao C# e ao Visual Basic.

Na DLR temos os binders que se comunicam com outros recursos da plataforma .NET a saber:

Dentre algumas vantagens de uma linguagem dinâmica podemos citar:

  1. A capacidade de introduzir um laço de resposta rápida. Dessa forma você pode introduzir várias instruções executando-as imediatamente para obter o resultado;
  2. Suporte tanto ao desenvolvimento top-down como ao tradicional bottom-up. Na abordagem top-down você pode chamar funções que ainda não foram implementadas adicionando implementações subjacentes quando precisar delas;
  3. Executar a refatoração e a modificação de código de maneira mais fácil visto que não temos que alterar as declarações dos tipos estáticos por todo o código;

A DLR introduz os objetos dinâmicos para o C# e VB .NET no VS 2010 de forma a oferecer suporte ao comportamento dinâmico nestas linguagens e ativar a interação com as linguagens dinâmicas.

Assim a DLR agrega um conjunto de serviços ao CLR para dar um melhor suporte a linguagens dinâmicas. Dentre os quais destacamos:

- A classe ExpandoObject - Representa um objeto cujos membros podem ser adicionados e removidos em tempo de execução dinamicamente;
- A classe
DynamicObject - Fornece uma classe base para especificar o comportamento dinâmico em tempo de execução. Essa classe deve ser herdada não é possível instanciá-la diretamente.

Obs: Para obter mais informações sobre como usar a versão de código-fonte aberto do DLR para adicionar o comportamento dinâmico para um idioma ou sobre como habilitar o uso de uma linguagem dinâmica com o.NET Framework, consulte a documentação sobre o CodePlex site da Web

Dynamic , Reflection e Object

A plataforma .NET introduziu na usa última versão um novo tipo de dados chamado de Dynamic.

O tipo dynamic é um tipo estático que é definido pela palavra reservada dynamic sendo que a princípio a variável desse tipo pode ser TUDO, e, em tempo de compilação o tipo dynamic assume qualquer operação.

Mesmo sendo um tipo estático a declaração dynamic faz com que o compilador não realize as validações estáticas sendo que as operações também somente serão avaliadas em tempo de execução.

A sua utilização ou não vai depender de cada caso e do cenário, e, como ele não dá suporte ao Intellisense você deve tomar muito cuidado ao usar esse tipo.

object , var e dynamic qual a diferença ????

- object e dynamic : são tipos;
- var :  é uma forma de inferir um tipo e somente variáveis podem ser declaradas;
-  object e var :  toda a informação do tipo/variável é conhecida em tempo de compilação;
- dynamic : a informação é conhecida somente em tempo de execução e pode ser aplicado a propriedades, retorno de métodos, parâmetros, objetos, enfim a TUDO.
- object e var : são palavras reservadas enquanto que dynamic não é. Dessa forma se você definir uma variável chamada dynamic ela será compilada no C# 4.0.

Muitos desenvolvedores acham que os objetos 'Dynamic' foram introduzidos para substituir a 'Reflection' ou o tipo de dado 'Object'.

O objetivo principal do objeto 'Dynamic' é consumir objetos criados em linguagens dinâmicas em linguagens de tipagem estática. Mas esse objetivo tem se confundido com Reflection e o tipo de dados Object.

Eventualmente ele poderá substituir a Reflection e os tipos de dados Object devido ao código simplificado e vantagens de cache mas o objetivo principal do objeto dynamic nunca foi substituir a "Reflection" ou tipo de dados Object, mas sim devido a sobreposição de recursos que ele realiza.

Na tabela abaixo temos uma comparação entre as principais características de dynamic, object e reflection:

Dynamic Object / Reflection
O objeto dynamic é um recurso fornecido pela DLR pelo qual podemos fazer chamadas para os objetos criados em linguagens dinâmicas. A DLR ajuda a não só a consumir mas também expor as suas classes a  linguagem dinâmica. O tipo Reflection e o tipo Object serve apenas para referenciar tipos cujas funções e métodos não são conhecidos em tempo de execução. Eles não ajudam a expor as suas classes a outras linguagens; seu objetivo é apenas consumir objetos cujos métodos são conhecidos até o tempo de execução.
O sintaxe do código e limpa A sintaxe possui uma baixa curva de aprendizagem
O desempenho é melhorado com o cache na chamada de métodos. Na existe cache nas chamadas de métodos

Agora a linguagem C# e VB .NET contam os recursos das linguagens dinâmicas.

Como diz o ditado popular: "Bom senso e caldo de galinha nunca fizeram mal a ninguém."

"Quando Cristo que é a vossa vida, se manifestar, então também vós vos manifestareis com ele em glória." Colossenses 3:4

Referências:


José Carlos Macoratti