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: