ILDA BASSO (Org.)
JOSÉ CARLOS RODRIGUES ROCHA (Org.)
MARILEIDE DIAS ESQUEDA (Org.)
II SIMPÓSIO INTERNACIONAL DE EDUCAÇÃO
LINGUAGENS EDUCATIVAS:
PERSPECTIVAS INTERDISCIPLINARES NA ATUALIDADE
BAURU
2008
S6126 Simpósio Internacional de Educação (2. : 2008 : Bauru, SP)
Anais [recurso eletrônico] / 2. Simpósio Internacional de
Educação / Ilda Basso, José Carlos Rodrigues Rocha,
Marileide Dias Esqueda (organizadores). – Bauru, SP :
USC, 2008.
Simpósio realizado na USC, no mês de junho de 2008,
tendo como tema : Linguagens educativas – perspectivas
interdisciplinares na atualidade.
ISBN 978-85-99532-02-7.
1. Educação – simpósios. 2. Linguagens educativas. I.
Basso, Ilda. II. Rocha, José Carlos Rodrigues. III. Esqueda,
Marileide Dias. VI. Título.
CDD 370
AUXÍLIO NO ENSINO EM COMPILADORES: SOFTWARE SIMULADOR COMO
FERRAMENTA DE APOIO NA ÁREA DE COMPILADORES
Kelton A. P. da COSTA
Luis Alexandre da SILVA
Talita Pagani BRITO
Universidade do Sagrado Coração.
RESUMO: Apresenta-se o estudo, pesquisa e desenvolvimento de um software simulador
com alunos e professores de graduação em Ciência da Computação, na Universidade do
Sagrado Coração, SP, Brasil, com aplicações de conceitos e princípios das fases de um
Compilador para utilização em salas de aula como apoio para as disciplinas que abordam a
área de compiladores. A ferramenta simula as fases internas existentes em um compilador
executando um processo de análise de um código de programação baseado em linguagem
Pascal.
Palavras-chave: compiladores, ensino, fases do compilador, simulador
ABSTRACT: It presents the study, research and development of a software simulator with
students and teachers to graduate in computer science at the University of the Sagrado
Coração, Brazil, with applications of concepts and principles of the phases of a compiler for
use in meeting rooms for classroom as support for the disciplines that address the area of
compilers. The tool simulates the stages in an existing internal compiler running a process of
examining a code-based programming language Pascal.
Keywords: compilers, education, phases of the compiler, simulator
INTRODUÇÃO
A disciplina de Compiladores ministrada em cursos de computação se apresenta como
um conteúdo complexo e de difícil compreensão.
Tendo em vista a necessidade de se elaborar uma técnica facilitadora para
compreensão dos alunos do curso de computação, foi definido entre professores e alunos do
curso de Ciência da Computação, da Universidade do Sagrado Coração, a elaboração e
desenvolvimento de um software simulador que demonstre claramente o funcionamento
interno das fases de um compilador.
De acordo com Aho (1995) e Delamaro (2004), o compilador é dividido em fases: a
Análise Léxica que tem como função separar os símbolos significativos dentro do programafonte e verificar a categoria a que estes pertencem (LOUDEN , 2004); a Análise Sintática que
verifica se a seqüência dos símbolos escritos no Programa Fonte é válida ou não (HUNTER,
1986); a Análise Semântica que verifica, através da árvore sintática (montada depois de passar
pelas duas primeiras fases), se os aspectos semânticos do programa têm coerência com o
Gerador de código intermediário que usa as estruturas produzidas pelo analisador sintático e
verificadas pelo analisador semântico para criar uma seqüência de instruções simples, dita
código intermediário (está entre a linguagem de alto nível e a linguagem de baixo nível)
(AHO, 1995); a Otimização de código que, independentemente de máquina, é um módulo
opcional (presente na grande maioria dos compiladores) que objetiva melhorar o código
intermediário de modo que o programa-objeto produzido ao fim da compilação seja menor
(ocupe menos espaço de memória) e/ou mais rápido (tenha tempo de execução menor). A
seguir é descrito o funcionamento de cada fase para a execução de um compilador:
Segundo Aho (1995), um compilador é dividido em seis fases:
Análise Léxica: tem como função separar os símbolos significativos dentro do
programa-fonte e verificar a categoria a que estes pertencem.
Análise Sintática: verifica se a seqüência dos símbolos escritos no Programa Fonte é
válida ou não.
Análise Semântica: verifica, através da árvore sintática (montada depois de passar
pelas duas primeiras fases), se os aspectos semânticos do programa têm coerência.
Gerador de código intermediário: usa as estruturas produzidas pelo analisador sintático
e verificadas pelo analisador semântico para criar uma seqüência de instruções simples, dita
código intermediário (está entre a linguagem de alto nível e a linguagem de baixo nível).
Otimização de código: independentemente de máquina, é um módulo opcional
(presente na grande maioria dos compiladores) que objetiva melhorar o código intermediário
de modo que o programa-objeto produzido ao fim da compilação seja menor (ocupe menos
espaço de memória) e/ou mais rápido (tenha tempo de execução menor). A saída do
otimizador de código é um novo código intermediário.
Gerador de código: produz o código-objeto final, tomando decisões com relação à
alocação de espaço para os dados do programa, selecionando a forma de acessá-los, definindo
que registradores da UCP serão usados, etc. Projetar um gerador de código que produza
programas objeto verdadeiramente eficientes é uma das tarefas mais difíceis no projeto de um
compilador.
Já Delamaro (2004) descreve um compilador com os seguintes componentes: o
analisador léxico, o analisador sintático, o analisador semântico e o gerador de código.
Cada autor caracteriza as fases de um compilador de uma forma pessoal, uns com uma
quantidade maior de fases que outros, mas é perceptível que a maioria conclui e obtém os
mesmos níveis de descrição existentes em todas as literaturas existentes sobre compiladores.
Alguns autores descrevem todas as fases detalhamente, enquanto outros autores ocultam ou
retiram fases, mas acabam iserindo na fase seguinte a função da fase retirada.
A saída do otimizador de código é um novo código intermediário e, por fim, o
Gerador de código que produz o código-objeto final, tomando decisões com relação à
alocação de espaço para os dados do programa, selecionando a forma de acessá-los, definindo
que registradores da UCP (Unidade Central de Processamento) serão usados, etc. (AHO,
1995)
Projetar um gerador de código que produza programas objeto verdadeiramente
eficientes é uma das tarefas mais difíceis no projeto de um compilador (AHO, 1995)
A construção de compiladores se estende através dos temas de linguagens de
programação como arquitetura de máquina, teoria das linguagens, algoritmos e engenharia de
software.
Foram desenvolvidas como foco principal do software simulador, a análise Léxica e a
análise Sintática, devido suas características serem de grande importância para a construção
de um compilador e finalizando com a interpretação e a geração de código intermediário.
Caso as fases iniciais de um compilador não forem bem elaboradas, o restante de seu
desenvolvimento ficará comprometido. As duas primeiras fases fazem parte do chamado
“núcleo do compilador” (JACOBS et al, 2001).
A ferramenta CompilerSim possui como diferencial a conversão do código baseado em
linguagem PASCAL para a linguagem de baixo nível Assembly. Esta possiblidade de analisar
códigos baseados em uma linguagem em específico e converter para linguagem Assembly
possibilita a utilização da ferramenta em outras disciplinas relacionadas à programação de
baixo nível e que também envolvam conteúdos sobre circuitos digitais.
Para MORIMOTO (2008), o Assembly foi provavelmente a primeira linguagem de
programação da história, surgida na década de 50, época em que os computadores ainda
usavam válvulas. A idéia do Assembly é usar um comando em substituição a cada instrução de
máquina. Esta linguagem é considerada como uma linguagem de baixo nível, pois permite o
gerenciamento direto da CPU do computador.
Uma das características existentes, na linguagem em questão, é que cada linha do
código fonte possui apenas uma instrução para o processador também denominada de CPU.
Por exemplo, a sintaxe MOV EAX,EDX da linguagem declara que irá mover o conteúdo do
registrador EDX para o registrador EAX. Neste caso, a instrução "MOV"é chamada de
mneumônico que são os apelidos das instruções, mais fáceis para guardar na memória do que
o valor hexadecimal exigido pelo processador. De mneumônico em mneumônico é possível
escrever códigos e fazer com que o processador realize exatamente o que é solicitado.
JUSTIFICATIVA
As disciplinas que envolvem conceitos e aplicações na área de compiladores geram
muitas dúvidas aos alunos devido a sua complexidade em conceitos abordados. A proposta de
desenvolvimentos de um software que simule as fases, conceitos e aplicações, busca auxiliar
alunos e professores no contexto, esclarecendo dúvidas das técnicas utilizadas pelo
compilador e consequente facilitora aos professores que lecionam disciplinas desta área.
OBJETIVO GERAL
Oferecer um ferramenta de apoio às disciplinas da área computacional que simule os
conceitos e aplicações em compiladores.
OBJETIVO ESPECÍFICO
A ferramenta desenvolvida visa auxiliar docentes da área computacional com
exemplos e demonstrações específicas das fases de um compilador facilitando na
compreensão pelos alunos.
O SIMULADOR COMPILERSIM
O simulador CompilerSim foi desenvolvido com base na série de artigos Let's Build a
Compiler, escrita pelo cientista Ph.D. Jack W. Crenshaw, datados do final da década de 80 até
meados da década de 90.
O compilador foi originalmente desenvolvido em Pascal e desempenha funções
básicas de compilação, interpretação e geração de código intermediário, não tratando de
aspectos mais complexos como registros, vetores, operações de E/S com arquivos, ponto
flutuante e otimização de código.
O código original foi modificado e adaptado para a Borland Delphi com o intuito de
fazer com que as etapas do processo de compilação pudessem ser demonstradas de modo mais
fácil através de uma interface gráfica. Dessa forma, pôde ser desenvolvida uma ferramenta
com enfoque pedagógico para o ensino da disciplina de Compiladores, permitindo que os
alunos possam compreender o funcionamento geral de um compilador que analisa uma
pseudo-linguagem com gramática simples.
A linguagem analisada pelo simulador assemelha-se muito ao Pascal, mas possui uma
sintaxe mais simplificada. Algumas das diferenças são:
•
A instrução program não deve vir acompanhada do nome do programa;
•
As linhas com instruções não devem conter ponto-e-vírgula;
•
As instruções begin e end são necessárias apenas para o corpo do programa;
•
As variáveis são fracamente tipadas, ou seja, não é preciso declarar o tipo das
variáveis no início do programa;
•
Instruções condicionais e de laço como if, while e for são terminadas com endif,
enwhile e endfor, respectivamente;
•
Até o momento, o simulador reconhece apenas valores numéricos para variáveis, não
identificando cadeias de caracteres.
A respeito do compilador desenvolvido por Crenshaw, algumas funcionalidades que
foram acrescentadas são:
•
Possibilidade de abrir arquivos texto (*.txt) contendo o código fonte a ser compilado;
•
Barra de Status, que indica o status da compilação e a quantidade de erros quando é
simulada a compilação do código;
•
Grid Simulador que aponta a linha e a descrição completa do erro ocorrido;
•
Grid Tabela de Símbolos, contendo os símbolos encontrados durante o processo de
compilação;
•
Exemplos de programas para serem testados.
METODOLOGIA
O estudo tipicamente realizado por pesquisa básica e exploratória em Compiladores,
mais precisamente das fases para desenvolvimento de um compilador, foi realizado entre
professores e uma aluna do curso de Ciência da Computação da Universidade do Sagrado
Coração.
Através da pesquisa realizada e da complexidade do conteúdo de uma disciplina que
aborda o conteúdo de compiladores, foi definido o desenvolvimento de um software que
simule as duas primeiras fases na elaboração de um compilador. Vale ressaltar que, para
qualquer
compilador
gerado
ou
a
ser
desenvolvido
para
diversas
aplicações
(hardware/software), é sempre necessária a utilização padrão das fases para o
desenvolvimento.
O software simulador foi desenvolvido em ambiente/linguagem Delphi versão 7.0, a
linguagem utilizada possui facilidade em sua programação e interface agradável na execução,
facilitando ainda mais na utilização pelos alunos como ferramenta de apoio à disciplina. A
ferramenta poderá ser utilizada somente em plataforma Windows em todas as suas versões.
RESULTADOS E DISCUSSÃO
A figura 1, demonstra a tela principal e padrão da ferramenta CompilerSim para
execução e geração dos resultados.
Figura 1 – Tela padrão do simulador CompilerSim
Um código é exibido em uma linguagem baseada em Pascal que foi inserido no
software simulador CompilerSim conforme figura 1.
A ferramenta também mostra, após execução, de acordo com a figura 2, os resultados
com base no código inserido na ferramenta. O software CompilerSim aponta, como resultados
finais da análise, os tokens gerados pela análise Léxica e também para a interpretação e
geração do código intermediário o resultado em códigos Assembly.
Figura 2 – Análise da linguagem e resultados abordados
O software simulador CompilerSim dispõe de exemplos prontos para auxiliar na
compreensão dos alunos (figura 3).
Figura 3 – Exemplos prontos para execução
Como forma de auxiliar estudantes e pesquisadores da área no esclarecimento do
funcionamento e execução das fases de um compilador, a figura 3 indica em seu menu o item
“Exemplos” com as opções “Fatorial”, “Média Aritmética”, “Cálculo de Delta (Báscara)” e
“exemplos de erros de sintaxe” (figura 4).
Cada código inserido na ferramenta com exemplos práticos demostra claramente as
fases descritas no capítulo introdução, indicando os tokens criados pelo analisador Léxico
presente na ferramenta. O analisador Léxico é a primeira fase presente em um compilador
para fins gerais.
Os exemplos citados demonstram eficazmente o funcionamento interno de um
compilador.
Figura 4 – Execução de um código e a indicação de erros.
CONSIDERAÇÕES FINAIS
O desenvolvimento da ferramenta através do estudo aprofundado dos conceitos e
técnicas, mais precisamente o software simulador para auxílio nas disciplinas que abordam
conceitos e aplicações em compiladores, através de testes em salas de aula, demostrou que sua
utilização face à forma tradicional do ensino na disciplina de compiladores pode influenciar
positivamente e significativamente no processo ensino-aprendizagem.
REFERÊNCIAS
AHO, A. V. Compiladores: princípios, técnicas e ferramentas. Rio de Janeiro: LTC, 1995
ARVIND Dataflow: Passing the token. In: ISCA Keynote, 2005.
CARDOSO, J.; NETO, H. Compilation for FPGA-Based Reconfigurable Hardware. IEEE
Design & Test of Computers Magazine, 2003.
CRENSHAW,
J.
W.
Let’s
Build
a
Compiler.
Disponível
em:
<http://compilers.iecc.com/crenshaw/>. Acesso em: jul de 2007.
DELAMARO, M. E. Como construir um Compilador: utilizando ferramentas Java. São
Paulo: Novatec, 2004.
HUNTER, R. Compilers. Their Design and Construction using Pascal. New York: Editora
Newnes Books, 1986.
JACOBS, C.J.H. et al. Projeto Moderno de Compiladores. São Paulo: Campus: 2001.
LOUDEN, K. C. Compiladores – Princípios e práticas. São Paulo: Thomson Pioneira, 2004.
MORIMOTO,
C.E.
Assembly.
Termos
Técnicos
GDH.
Disponível
<http://www.guiadohardware.net/termos/assembly> Acesso em: 20 abr 2008.
em:
Download

auxílio no ensino em compiladores