Beruflich Dokumente
Kultur Dokumente
Resumo
O desenvolvimento de um software que permita acompanhar a execuo de um
algoritmo de forma visual com intuito de auxiliar no ensino e entendimento da
programao, parte da elaborao de uma linguagem que seja completa e de fcil
entendimento para a escrita desse algoritmo, passa pelos projetos do compilador dessa
linguagem e do executor do cdigo ou rvore sinttica gerada pelo compilador e
culmina na implementao propriamente dita. Este artigo descreve a implementao de
um prottipo que permite escrever, compilar e visualizar a rvore sinttica gerada a
partir do algoritmo escrito, visando dar suporte implementao do executor.
Palavras-Chave
Algoritmo; Animao; Linguagem de Programao; Compilador; Lex; Yacc.
Abstract
The development of a software that allows to follow the execution of an
algorithm in a visual way with the intention of assisting in the education and
understanding of the programming, starts with the elaboration of a language that is
complete and easy understanding for the writing of this algorithm, passes for the
projects of the compiler of this language and the executer of the code or syntactic tree
generated by the compiler and culminates in the implementation. This article discrible
the implementation of a prototype that allows write, compile and visualize the syntactic
tree generated from the algorithm wrote, with the purpose of giving support to the
implementation of the executer.
Keywords
Algorihtm; Animation; Programming Language; Compiler; Lex; Yacc.
1
2
1. Introduo
De acordo com [VARANDA E HENRIQUES], a animao de um algoritmo
definida como sendo um tipo de visualizao dinmica das principais abstraes
expressas por esse algoritmo.
Segundo [REZENDE] e [MENDES], uma grande dificuldade encontrada pelos
estudantes - e conseqentemente pelos professores - a falta da capacidade de abstrao
do processo de execuo de um programa. So estudantes que, na sua maioria, nunca
tiveram contato com a matria e tm dificuldade em abstrair o problema para instrues
de uma linguagem de programao.
A animao de algoritmos vem dar uma contribuio nesse sentido medida que
torna visual o processo de execuo, facilitando o entendimento do que ocorre quando
uma dada instruo executada [VARANDA E HENRIQUES]. Alm disso, segundo
[VARANDA E HENRIQUES], pode-se transpor os limites do ensino da programao e
aplicar a animao de algoritmos em qualquer rea onde algoritmos so utilizados,
como por exemplo no ensino da matemtica.
Surge nesse ponto, um imenso leque de aplicaes para ferramentas de animao
de algoritmos, que vai desde o ensino mdio at o ensino superior, e tambm para os
autodidatas.
Prope-se assim, o desenvolvimento de um software que permita escrever,
compilar e executar de forma animada um determinado algoritmo escrito numa
linguagem de fcil entendimento.
O projeto para o desenvolvimento deste software foi dividido em duas fases. A
primeira fase compreende o desenvolvimento de um prottipo funcional que permite
escrever e compilar um algoritmo gerando uma estrutura de dados - rvore de sintaxe
decorada - que ser, na segunda fase, utilizada para execuo do algoritmo. Nesta
primeira fase, com base nos requisitos de software, sero feitas as definies sobre a
linguagem a ser utilizada na escrita dos algoritmos, a arquitetura do software, o modo de
funcionamento do compilador para a linguagem, a estrutura de dados da rvore de
sintaxe decorada e a interface com o usurio. A segunda fase ento, compreende o
desenvolvimento do mdulo que ir interagir com a rvore de sintaxe decorada gerada
na compilao, realizando o processo de execuo animada do algoritmo.
Ser tratada neste artigo, a primeira fase do projeto.
2. Requisitos
Como descrito em [VARANDA E HENRIQUES], o objetivo da animao de
algoritmos perceber o funcionamento de aplicaes cuja animao vai ocorrendo
progressivamente como resposta a aes do utilizador, tornando a interao mais
realista.
Em [MENDES], pode-se encontrar mais alguns requisitos importantes para uma
ferramenta que se propes ao auxlio do ensino e entendimento da programao. So
eles:
I) Ser Interativa, gerando feedback adequado para o aluno permitindo- lhe
interatuar, controlar e desempenhar um papel ativo no processo de aprendizagem.
II) Ser Configurvel, a fim de permitir a adio, remoo e alterao dos
exemplos, exerccios propostos e solues apresentadas, sem que tal acarrete quaisquer
alteraes no seu cdigo.
III) Permitir Representaes alternativas, de forma a possibilitar ao aluno
diferentes pontos de vista, estilos de raciocnio e solues para os mesmos problemas.
2
3. Arquitetura Proposta
No sistema ALMA, [VARANDA E HENRIQUES] propem uma arquitetura
baseada nos seguintes itens:
I) Criao de um front-end (interface da frente) para uma determinada
linguagem, a partir da respectiva gramtica (para diferentes linguagens, o front-end
dever ser gerado de novo de acordo com as suas gramticas). O front-end primeira
interface com o usurio. a interface que permite escrever e/ou editar os algoritmos,
bem como compilar o cdigo fonte escrito, garantindo que o mesmo est corretamente
escrito com base nas definies da linguagem.
II) Criao de um back-end (interface final) que, a partir da informao extrada
do resultado produzido pelo front-end, fornea a necessria interface para programao
da animao e realize a visualizao pretendida (independente da linguagem fonte). Este
Pode ser traduzido simplesmente como Avaliador de rvore. Um algoritmo que possui as instrues
necessrias para avaliar cada n de uma rvore a medida em que a percorre segundo um percurso pdefinido.
4
Ver tpico 4.2.1. rvore de Sintaxe Decorada.
O editor fornece o cdigo fonte como entrada para o compilador. Este retorna
para a interface, atravs do editor, os erros que por ventura existirem neste cdigo fonte.
Ao terminar a compilao do cdigo sem erros, o compilador ter gerado a ASD, que
fica disponvel na me mria para que o executor realize a animao.
Como pode ser notado na Figura 2, o back-end necessita apenas da ASD como
entrada, no importando como a mesma foi gerada, nem em qual linguagem foi escrito o
algoritmo. Isso faz com que o executor seja independente do front-end e tambm
permite que o back-end seja escrito para utilizar a ASD para a gerao de cdigo objeto
e outras formas de execuo diferente da execuo animada.
4. Projeto do Software
O projeto do software envolve o detalhamento de cada um dos componentes da
arquitetura do sistema descrita no item anterior.
Inicialmente, porm, deve-se definir qual linguagem e IDE sero utilizadas no
desenvolvimento, pois algumas linguagens possuem limitaes que implicam no projeto
do compilador.
O Delp hi 5 foi escolhido como IDE para o desenvolvimento do software, devido
ao fato de possuir uma linguagem muito verstil, permitindo criao de tipos, uso de
ponteiros na memria, recursividade e disponibilizar vrios componentes (proprietrios
e de terceiros) para construo da interface, do compilador e do executor.
A nica limitao para o Delphi o fato de no gerar cdigo portvel.
4.1. Front-End
4.1.1. Linguagem
O projeto do front-end inicia-se com a definio da linguagem a ser utilizada na
escrita dos algoritmos.
Tem-se na linguagem Pascal, amplamente utilizada e consagrada, uma
linguagem completa e de fcil entendimento. Por esse motivo, o Pascal foi utilizado
como base para se definir a linguagem a ser utilizada no projeto. A BNF 5 do Pascal
Simplificado pode ser encontrada em [KOWALTOWSKI] e [NEPOMUCENO].
Bakus-Naur From (BNF) uma metalinguagem, uma linguagem utilizada para descrever outra
linguagem. Cada sentena desta metalinguagem chamada de regra de produo. [MAK]
Existem ainda alguns pontos que tambm devem ser considerados na definio
da linguagem.
Primeiramente, o objetivo do projeto no criar uma nova linguagem que
contemple a resoluo de qualquer problema, mas sim possibilitar o entendimento da
execuo utilizando animao. Tambm, deve-se considerar que a linguagem no
necessita prover todas as funcionalidades do Pascal. Desta forma, no ser
implementado o uso de procedimentos e funes e somente sero utilizados os tipos de
varivel inteiro e real. Estes recursos podero ser agregados ao projeto futuramente,
caso haja necessidade.
Em segundo lugar, a BNF deve ser construda de forma que facilite a
implementao da estrutura de dados que representa o programa 6 .
Outro ponto a ser considerado a sintaxe da linguagem, que deve ser simples e
permitir a estruturao do programa. Para facilitar ainda mais, a linguagem no deve
diferenciar letras maisculas de minsculas (no case sensitive).
Por ltimo, deve-se utilizar identificadores de palavras reservadas em portugus,
permitindo entendimento mais intuitivo do algoritmo pelos usurios.
Assim, tem-se, de forma simplificada, a definio da linguagem:
PROGRAMA NomeDoPrograma
VARIAVEIS
ListaDeVariveis COMO INTEIRO
ListaDeVariveis COMO REAL
INICIO
ListaDeComandos
FIM
Em ListaDeComandos podem ser encontrados comandos simples, comando
condicional e/ou comandos repetitivos.
Os comandos simples so:
Varivel := Expresso
LEIA (ListaDeVariveis )
MOSTRE (ListaDeVariveis)
O comando condicional :
SE Expresso ENTAO
ListaDeComandos
SENAO
ListaDeComandos
FIM SE
Onde no obrigatrio que haja a condio representada pelo SENAO.
Os comandos repetitivos so:
REPITA
ListaDeComandos
ATE QUE Expresso
6
Pode-se adequar a BNF durante a construo do compilador de forma que as regras de produo
permitam gerar a ASD corretamente.
4.1.2.1. Expresses
As expresses possuem os seguintes campos em sua estrutura:
Operador
Valor
NFilhoDaEsqueda
NFilhoDaDireita
Sendo que, h distines nos campos para os ns e para as folhas
(extremidades). Estas distines podem ser verificadas no anexo [Anexo B rvore de
Sintaxe Decorada].
4.1.2.2. Comandos
Os comandos possuem os seguintes campos em sua estrutura:
Comando
PrximoComando
ListaDeVariveis
Varivel
Expresso
PrimeiroComandoInterno
PrimeiroComandoSenao
Expresso1
ContadorDoPara
Expresso2
Sendo que, para cada comando, existem algumas distines nos campos. Estas
distines podem ser verificadas no anexo [Anexo B rvore de Sintaxe Decorada].
4.1.3. Interface
Algumas especificaes so necessrias para a interface. Ela deve conter
algumas funcionalidades bsicas comuns maioria dos softwares de edio. So elas:
I) Comandos para criar novo, abrir, fechar e salvar os arquivos escritos.
II) Comandos para organizar as janelas abertas dentro da aplicao (considera-se
que vrios arquivos podem ser abertos para edio ao mesmo tempo).
III) Ajuda ou Help com a sintaxe da linguagem como referncia.
No entanto, a parte central da interface o editor, que como j foi dito, onde o
algoritmo escrito.
O ponto crucial do editor a marcao das palavras reservadas, smbolos e
comentrios da linguagem na edio. Para isso, necessrio que seja implementado um
analisador lxico embutido no editor, que permita reconhecer cada palavra da entrada e
9
format- la (colorir, destacar em negrito, etc) de acordo com uma tabela de definies de
formatao pr-carregada na memria. Esse analisador lxico deve ser chamado toda
vez que um evento de teclado ou de mouse (copiar/colar/recortar) for interceptado, para
que a marcao possa ser percebida como em tempo real.
Foi comprovado de forma emprica, com a implementao de um editor
simplificado [Anexo A - Editor], que as especificaes para a marcao do cdigo so
extensivas e fogem do escopo do projeto. Como j existem componentes disponveis no
mercado que realizam esta tarefa [Anexo A - SynEdit], fica a critrio do desenvolvedor
implementar ou no a marcao do cdigo de forma original. Optou-se neste projeto por
utilizar o SynEdit na construo do editor para diminuir o tempo de implementao.
4.1.4. Compilador
O compilador por sua vez a parte central e mais crtica do projeto do software,
pois ele que permite gerar a ASD utilizada pelo executor, alm de verificar a corretude
do algoritmo escrito, retornando os erros para o usurio.
[AHO], [PRICE] e [MAK] descrevem os conceitos e tcnicas para projetar e
implementar compiladores. Estes trs autores indicam que a construo de um
compilador pode ser facilitada utilizando-se geradores de cdigo para compiladores.
Estes geradores de cdigo interpretam arquivos com as especificaes da linguagem e
geram o cdigo fonte correspondente ao analisador lxico e ao analisador sinttico do
compilador, reduzindo boa parte do trabalho braal de programao.
No entanto, a maior vantagem de se utilizar geradores de cdigo para
compiladores que eles facilitam a manuteno do compilador, pois permitem
facilmente alterar a linguagem.
Sendo assim, foi utilizado neste projeto o software Glyd [Anexo A - Glyd], que
um gerador de cdigo para compiladores compatvel com o Delphi (leia Pascal).
A escolha do Glyd se deve ao fato de possuir uma interface mais amigvel para
escrever e compilar os arquivos de especificao necessrios gerao do cdigo do
compilador. Na ve rdade, o Glyd funciona utilizando dois outros programas: o Lex e o
Yacc, [Anexo A - LexYacc] que podem ser adquiridos separadamente e gratuitamente
na Internet (assim como o Glyd). O Lex l um arquivo contendo as expresses regulares
que definem os identificadores e smbolos da linguagem, gerando o cdigo fonte do
analisador lxico. O Yacc l um outro arquivo contendo a gramtica da linguagem e as
aes semnticas (utilizadas na anlise semntica e na gerao da ASD ou cdigo
intermedirio) gerando o cdigo fonte do analisador sinttico. Para a construo do
compilador, utiliza-se o cdigo gerado pelo Lex e pelo Yacc incluindo-os no programa
principal e fazendo-se chamadas a eles de forma apropriada.
4.2. Back-End
O Back-End do software o executor. Conforme foi dito anteriormente, a partir
da ASD gerada no front-end, possvel escrever um Tree-Walker Evaluator (TWE)
capaz de fazer as animaes necessrias para a visualizao da execuo do algoritmo e
interagir com o usurio durante essa execuo. Da mesma forma, o TWE pode tambm
ser escrito para gerar um cdigo intermedirio como o MEPA [KOWALTOWSKI], por
exemplo. Em fim, a escolha de como ser a "interface da execuo" depende apenas da
aplicao e no do front-end.
Em se tratando de animao de algoritmos, o funcionamento do executor pode
ser definido em duas etapas: Carregar a ASD e Executar a ASD.
10
5. Prottipo
O prottipo se encontra em anexo [Anexo A - AnimaAlgo].
6. Concluso
Os objetivos iniciais foram atingidos satisfatoriamente, j que o prottipo est
estvel e permite trabalhar bem com algoritmos simples.
A implementao do compilador do prottipo foi bastante facilitada com o uso
do Glyd (Lex/Yacc). Com ele, possvel a adio de novas funciona lidades
linguagem de forma mais simples. Inclusive, a principal funcionalidade que deve ser
adicionada linguagem a utilizao de vetores e matrizes.
Outro ponto a ser destacado a facilidade que foi obtida com a estratgia de
trabalhar com a ASD. Claramente, se verifica que a ASD gerada pode ser utilizada de
vrias formas: para gerar cdigo intermedirio, para executar o programa, para mostrar
as instrues e para depurao (debuging). E mais ainda, pode-se percorr- la no sentido
do topo para baixo (top-down) ou de baixo para cima (botton-up).
O projeto deixa uma imensa base para a prxima fase, que a construo do
executor para a animao do algoritmo. Para isso, ainda necessrio definir como sero
os blocos representativos de cada instruo do algoritmo no fluxograma, definir como
ser a interface com o usurio, como deve ser mostrado o contedo das variveis e
como ser implementado a parte grfica (desenhos e animaes).
7. Referncias
[AHO] - AHO, Alfred V., et al.; Compiladores: Princpios, Tcnicas e Ferramentas. Rio
de Janeiro: Editora Guanabara Koogan S.A., 1995.
[KOWALTOWSKI] - KOWALTOWSKI, Tomasz; Implementao de Linguagens de
Programao. Rio de Janeiro: Editora Guanabara Dois, 1983.
[MAK] - MAK, Ronald; Writing Campilers adn Interpreters. Estados Unidos da
Amrica: Editora: Wiley Computer Publishing, 1996.
[MENDES] - MENDES, Antnio Jos Nunes; Software educativo para apoio
aprendizagem de programao. http://virtual.inesc.pt/virtual/CGME99/actas/c2/,
27/05/2003.
[NEPOMUCENO] - NEPOMUCENO, Rogrio Melo; BNF do Pascal Simplificado.
Disciplina de Compiladores, Universidade de Uberaba. Uberaba-MG, 2002.
12
13
ANEXO A
Implementaes e Componentes utilizados no projeto
14
AnimaAlgo
http://www.nucleoti.com/Frederico/Compiladores/AnimaAlgo.zip
Editor
http://www.nucleoti.com/Frederico/Programas/Editor.zip
SynEdit
http://synedit.sourceforge.net/
Glyd
http://www.musikwissenschaft.uni- mainz.de/~ag/tply/Glyd_2_0.zip
LexYacc
http://www.musikwissenschaft.uni- mainz.de/~ag/tply/tply41a.zip
15
ANEXO B
Especificaes da BNF e ASD
16
BNF da Linguagem
<codigo_fonte> ::= programa <identificador> <bloco>
<bloco> ::= <definicao_das_variveis> inicio <lista_de_comandos> fim
<tipo> ::=
<identificador_de_tipo>
<identificador_de_tipo> ::= inteiro | real
<definicao_das_variveis> ::=
variaveis <declaracao_de_variveis> <mais_variveis>
|
<declaracao_de_variaveis> ::=
<lista_de_identificadores> como <tipo>
<mais_variaveis> ::=
<declaracao_de_variaveis> <mais_variaveis>
|
<lista_de_identificadores> ::= <identificador> <mais_identificadores>
<mais_identificadores> ::= , <identificador> <mais_identificadores> |
<lista_de_comandos> ::= <comando> <mais_comandos>
<mais_comandos> ::= <comando> <mais_comandos> |
<comando> ::=
<comando_simples>
| <comando_condicional>
| <comando_repetitivo>
<comando_simples> ::=
<atribuicao>
| leia (<variaveis_leia>)
| mostre (<variaveis_mostre>)
<atribuicao ::= <variavel> := <expressao>
<variaveis_leia> ::= <variavel> <mais_variaveis_leia>
<mais_variaveis_leia> ::= , <variaveis_leia> |
<variaveis_mostre> ::= <variavel> <mais_variaveis_mostre>
<mais_variaveis_mostre> ::= , <variaveis_mostre> |
<comando_condicional> ::=
17
NFilhoDaDireita
Nos Ns
Operador: igual a "+", "- " , "*", "/", "=", "<", ">", "<>", ">=" ou "<="
Valor: invlido (no utilizado).
NFilhoDaEsqueda: aponta para o n da esquerda.
NFilhoDaDireita: aponta para o n da direita.
Nas Folhas (Extremidades)
Operador: igual a "VARIVEL" ou "NMERO"
Valor: o valor do nmero ou o endereo da varivel na tabela de smbolos.
NFilhoDaEsqueda: aterrado.
NFilhoDaDireita: aterrado.
Comandos
Campos:
Comando
PrximoComando
ListaDeVariveis
Varivel
Expresso
PrimeiroComandoInterno
PrimeiroComandoSenao
Expresso1
ContadorDoPara
Expresso2
Comando Atribuio (:=)
Comando: "ATRIBUIO".
PrximoComando: ponteiro para o prximo comando ou aterrado.
ListaDeVariveis: invlido.
Varivel: endereo da varivel na tabela de smbolo.
Expresso: ponteiro para a expresso cujo valor deve ser atribudo varivel.
PrimeiroComandoInterno : invlido.
PrimeiroComandoSenao: invlido.
Expresso1: invlido.
ContadorDoPara: invlido.
Expresso2: invlido.
Comando Leia
Comando: "LEIA".
PrximoComando: ponteiro para o prximo comando ou aterrado.
ListaDeVariveis: vetor com o endereo das variveis na tabela de smbolos.
Varivel: invlido.
Expresso: invlido.
PrimeiroComandoInterno : invlido.
PrimeiroComandoSenao: invlido.
Expresso1: invlido.
ContadorDoPara: invlido.
19
Expresso2: invlido.
Comando Mostre
Comando: "MOSTRE".
PrximoComando: ponteiro para o prximo comando ou aterrado.
ListaDeVariveis: vetor com o endereo das variveis na tabela de smbolos.
Varivel: invlido.
Expresso: invlido.
PrimeiroComandoInterno : invlido.
PrimeiroComandoSenao: invlido.
Expresso1: invlido.
ContadorDoPara: invlido.
Expresso2: invlido.
Comando Se
Comando: "SE".
PrximoComando: ponteiro para o prximo comando ou aterrado.
ListaDeVariveis: invlido.
Varivel: invlido.
Expresso: ponteiro para a expresso a ser avaliada.
PrimeiroComandoInterno : ponteiro para o primeiro comando caso a expresso
seja verdadeira.
PrimeiroComandoSenao: ponteiro para o primeiro comando caso a expresso
seja falsa.
Expresso1: invlido.
ContadorDoPara: invlido.
Expresso2: invlido.
Comando Enquanto
Comando: "ENQUANTO".
PrximoComando: ponteiro para o prximo comando ou aterrado.
ListaDeVariveis: invlido.
Varivel: invlido.
Expresso: ponteiro para a expresso a ser avaliada no incio do passo do loop.
PrimeiroComandoInterno : ponteiro para o primeiro comando caso a expresso
seja verdadeira.
PrimeiroComandoSenao: invlido.
Expresso1: invlido.
ContadorDoPara: invlido.
Expresso2: invlido.
Comando Repita
Comando: "REPITA".
PrximoComando: ponteiro para o prximo comando ou aterrado.
ListaDeVariveis: invlido.
Varivel: invlido.
Expresso: ponteiro para a expresso a ser avaliada no final do passo do loop.
PrimeiroComandoInterno : ponteiro para o primeiro comando do loop.
PrimeiroComandoSenao: invlido.
Expresso1: invlido.
ContadorDoPara: invlido.
20
Expresso2: invlido.
Comando Para
Comando: "PARA".
PrximoComando: ponteiro para o prximo comando ou aterrado.
ListaDeVariveis: invlido.
Varivel: endereo da varivel na tabela de smbolo a ser utilizada como
contador do loop.
Expresso: invlido.
PrimeiroComandoInterno : ponteiro para o primeiro comando do loop.
PrimeiroComandoSenao: invlido.
Expresso1: ponteiro para a expresso que inicializa o contador.
ContadorDoPara: valor do incremento ou decremento para o contador.
Expresso2: ponteiro para a expresso a ser avaliada no incio do passo do loop.
21