10 likes | 105 Views
Projeto e implementação de uma linguagem de programação de alto nível para a execução de algoritmos adaptativos.
E N D
Projeto e implementação de uma linguagem de programação de alto nível para a execução de algoritmos adaptativos A implementação de algoritmos adaptativos atualmente foi feita através da utilização de linguagens que permitissem a auto-modificação de código durante o tempo de execução. Mesmo as linguagens de programação que permitem modificar o próprio código durante a execução não são capazes de auxiliar o programador já que o compilador ou interpretador não foi projetado para expressar algoritmos adaptativos, fica exclusivamente sobre o programador a tarefa de validar e documentar o algoritmo adaptativo. Neste trabalho foi projetada e implementada uma linguagem de programação imperativa com uma extensão direcionada a expressão de algoritmos adaptativos. Ao invés de trabalhar com a alteração do código do programa em tempo de execução, foi utilizado um modelo alternativo, porém equivalente, onde a ordem de execução de trechos de comandos do programa pode ser alterada a fim de remover ou adicionar trechos de código durante a execução do programa. MODULE module; VAR fat10:INTEGER; (* procedimento adaptativo para calcular fatorial *) ADAPTIVE fat(n:INTEGER):INTEGER; VAR result:INTEGER; (* a inicialização do algoritmo começa pelo primeiro fragmento *) FRAGMENT init; result := 1 END init; (* passo de cálculo *) FRAGMENT calc; result := result * n; n := n - 1 END calc; ACTIONS (* conexões executadas caso n > 0 *) ACTION not0; AFTER init GOTO calc; AFTER calc RETURN result CASE n = 0, GOTO calc OTHERWISE END not0; CONNECTIONS (* conexões iniciais *) AFTER init RETURN result CASE n = 0, PERFORM not0 OTHERWISE END fat; BEGIN fat10 := fat(10) END module. O projeto da linguagem utilizou como base a linguagem Oberon, criada por Niklaus Wirth, por ser simples e concisa para implementar algoritmos imperativos. Na linguagem Oberon foi adicionado um tipo especial de procedimento voltado para a implementação de algoritmos adaptativos de maneira controlada a fim de separar a parte adaptativa de um programa da parte imperativa tradicional. Um procedimento adaptativo é visto pelo restante do programa como um procedimento qualquer. Dentro de um procedimento adaptativo, os trechos de código do programa são chamados de fragmentos que podem conter qualquer comando da linguagem Oberon. A seqüência de execução é determinada dentro de um bloco de ação que contém a descrição das conexões entre fragmentos, podendo alterá-las através da indicação de outro bloco de ações (bloco que passará a ser usado para descrever as conexões) ou finalizar o procedimento adaptativo. Ferramentas utilizadas Para auxiliar o projeto do compilador foi utilizada a biblioteca LLVM (Low Level Virtual Machine) que ficou responsável pela geração de código executável o que fez com que todo o esforço fosse dedicado ao frontend do compilador. Foram implementados apenas os comandos e declarações da linguagem Oberon essenciais para o funcionamento do compilador e toda camada adaptativa, já que os demais comandos e declarações da linguagem Oberon podem ser facilmente implementados utilizando as técnicas tradicionais de compilação. Como resultado foi obtido um protótipo de uma linguagem de programação capaz de expressar claramente algoritmos adaptativos, além de permitir a utilização de comandos e declarações imperativos presentes no cotidiano dos programadores. A linguagem de programação proposta é totalmente estática, fornecendo informações suficientes para o compilador detectar erros durante a compilação e que dispensa componentes de interpretação para a execução de algoritmos adaptativos o que resulta em um maior desempenho na execução. Jorge Augusto Sabaliauskas <jaugustosaba@gmail.com> Ricardo Luis de Azevedo da Rocha <rlarocha@usp.br>