Skip to main content

Codificação dinâmica

Versão de impressão
  Codificação dinâmica é uma expressão para designar uma funcionalidade que está neste momento em desenvolvimento, em que esta consiste em dar a capacidade a um programa de se auto-estender através de compilação de código fonte em código executável na própria máquina de execução, conseguindo assim se auto-adaptar ao ambiente de execução, para além de conseguir resolver problemas na área da programação que não são facilmente solucionáveis por programação normal e exigem bastante trabalho entedioso.

  Alguns desses problemas são bastante conhecidos como por exemplo o problema da impedância entre as bases de dados em que estas têm uma estrutura tabular e os objectos de uma linguagem de programação de 4ª geração, por exemplo a C#, que têm uma estrutura hierárquica com vários níveis, para compensar este problema os programadores fazem bastante trabalho tedioso ao adaptar uma estrutura à outra, podem usar também bibliotecas de mapeamento que exigem bastante trabalho para as configurar e manter, tudo isto seria evitado se houvesse uma biblioteca que pegasse no objecto a persistir e criasse em tempo de execução um objecto que estendesse este mas desta vez com todos os métodos necessários para aceder à base de dados em questão podendo se adaptar a qualquer base de dados tal como a qualquer objecto, mais detalhes serão dados no decorrer deste estudo.

  Criar aplicações que se conseguem adaptar em tempo de execução é uma estratégia usada para lidar com cenários em que não se consegue determinar em detalhe na altura do desenvolvimento dando abertura à introdução de diversas linhas de código futuramente para compensar a falta destes cenários no planeamento da aplicação, no entanto criando código dinamicamente estes problemas são ultrapassados, compilando assim código executável enquanto a aplicação está em execução é uma óptima maneira de compensar diferentes configurações de máquina, necessidades dos utilizadores, etc.

  A codificação dinâmica é a execução de código compilado em tempo de execução tendo como base, templates pré-determinados pelo programador na altura do desenvolvimento chamados por snippets, esta é uma funcionalidade muito potente que permite às aplicações serem estendidas com código que não é compilado com a aplicação, mas sim pela própria aplicação em tempo de execução utilizando guias criados pelo programador.

  Para ser conseguido isso numa aplicação, por exemplo no ambiente de programação Windows tínhamos no passado e também no presente, no entanto já menos usado, o recurso a código VBScript interpretado no script engine do Windows, temos também o VBA que é uma implementação do Visual Basic para os produtos do MS Office, dentro de todas as soluções deste tipo temos a vantagem de adicionar funcionalidades às aplicações que as hospedam, no entanto estas soluções têm todas uma grande desvantagem que é estas serem interpretadas em tempo de execução e não compiladas resultando num grande impacto de performance, para além de o sistema de debug ser muito precário.

  Se existem tantas desvantagens com estas soluções porque é que se está a pensar utilizá-las? Exactamente por estas soluções terem as desvantagens acima referidas estas não serão utilizadas, no entanto a grande vantagem acima referida não foi esquecida, muito pelo contrário foi repensada e incorporada em uma funcionalidade do .NET Framework.

  O .Net Framework da Microsoft implementa nas suas classes de SDK todas as funcionalidades necessárias para providenciar nativamente total controlo sobre código dinâmico, no entanto este processo não é muito trivial requerendo uma certa quantidade de operações necessárias para se conseguir compilar e executar código dinâmico previamente escrito em código fonte C# ou VB.NET, mas a grande vantagem é que podemos usar esse código directamente na nossa aplicação podendo também guardar para mais tarde usar, para além disso obtemos uma flexibilidade extrema ao termos total controlo sobre todo o processo de compilação, gestão de erros de compilação, carregamento de objectos e controle sobre o ambiente de execução do código dinâmico.

  Para abordar este projecto vamos executar pequenas parcelas do problema, a primeira será como compilar código fonte directamente nas nossas aplicações, para isso vamos criar um ficheiro de código C# e outro em VB.NET que vão executar a mesma função, em seguida compilamos o código em execução, para podermos usar esta parcela do problema nas próximas vamos fazer uma classe reutilizável que encapsule todos os detalhes da compilação e execução do código dinâmico.

  Na segunda parcela será introduzido uma optimização ao processo de compilação, pois caso um código fonte for igual a um já compilado no passado então não vale a pena recompilar de novo, usaremos assim uma base de dados SQLite para armazenar um código hash do código fonte, o código fonte e a assembly compilada, portanto se mais tarde a mesma hash for encontrada o código fonte é comparado e caso sejam iguais então será usado o binário já compilado, optimizando assim a compilação de código fonte muito frequente.

  Numa terceira parcela será abordado o desenvolvimento de um pequeno sistema de desenvolvimento de scripts, dando informações sobre os erros no script, e execução.