(Pós AAE)
4a. feira e 6a. feira, sempre de 11:00 às 12:40 no Google Meets.
Objetivo
Apresentar conceitos básicos da construção de compiladores.
Tópicos
- Análise sintática
- Análise semântica
- Geração de código
Projeto
O projeto da disciplina é a implementação de um compilador da linguagem Imp para Π IR, a linguagem do Π framework. A especificação do Π framework pode ser obtida aqui. A especificação da linguagem Imp e sua tradução ao Π framework pode ser obtida aqui.
Este projeto tem os seguintes objetivos:
- Apresentar conceitos básicos de construção de compiladores.
- Exercitar o desenvolvimento de uma aplicação a partir de uma descrição matemática.
- Expor os alunos ao desenvolvimento por programação declarativa, em contraposição à imperativa.
- Exercitar o uso de ferramentas de desenvolvimento colaborativo.
A linguagem Imp é extremamente simples, porém tem o poder computacional de uma linguagem Turing-completa. As entregas do projeto estão organizadas segundo classes sintáticas da linguagem Imp.
Uma vez formados os grupos, de não mais do que 3 alunos, será sorteada a linguagem de programação na qual cada grupo implementará seu projeto.
Cada grupo deverá criar um repositório para seu projeto no Github, com um nome apropriado para o projeto. (Um exemplo muito ruim é "Apresentacao_compiladores". Um bom exemplo é https://github.com/jpsmedeiros/impiler.) A cada entrega, o repositório será clonado e executado o comando make
. Cada entrega deverá ter seu branch associado, isto é, P1, P2 e P3.
O Makefile
no repositório deverá então:
- garantir que todas as dependências para o build estão satisfeitas,
- construir o compilador,
- executar testes apropriados para a entrega.
O projeto deverá ser desenvolvido no sistema operacional Linux Ubuntu 18.04. Será portanto corrigido neste sistema, sendo executado como uma máquina virtual no Virtual Box.
Aulas
As aulas do curso estão organizadas em 3 módulos. As primeiras aulas de cada módulo, usualmente a 1a ou 1a e 2a aulas, são expositivas, quando são apresentados os conceitos associados ao módulo em questão. Aulas seguintes do módulo serão interativas onde cada grupo apresentará o estado atual do seu projeto, levantando principalmente dúvidas a serem discutidas com o restante da classe, e/ou simplesmente atualizando os demais com a evolução de seu trabalho.
Expressões e comandos.
Objetivos:
- Ambientar-se com a linguagem escolhida e suas ferramentas.
- Implementar um parser para a linguagem Imp-0, contendo operações aritméticas, Booleanas e comandos.
- Entender o Π Framework.
- Implementar Π IR-mark0: (i) Π autômato, (ii) operações aritméticas, Booleanas e comandos.
- Implementar um compilador de Imp-0 com operações aritméticas, Booleanas e comandos para Π IR-mark0.
Definições e declarações
Objetivos:
- Especificar a semântica de declarações utilizando o Π Framework.
- Implementar um parser para a linguagem Imp-1 estendendo Imp-0 com declarações de variáveis e constantes.
- Implementar Π IR-mark1: (i) Π autômato com ambientes, (ii) declarações de variáveis e constantes.
- Implementar um compilador de Imp-1 para Π IR-mark1.
Funções e procedimentos
Objetivos:
- Especificar a semântica de procedimentos e funções utilizando Π Framework.
- Implementar um parser para Imp-2 estendendo Imp-1 com procedimentos e funções recursivas.
- Implementar Π IR-mark2: (i) Declarações de operações e funções recursivas.
- Implementar um compilador de Imp-2 para Π IR-mark2.
Critério de avaliação
Avaliação continuada no Google Classroom.
A avaliação será feita segundo os seguintes critérios:
Em aula 10% | Apresentação 70% | Projeto 20% |
Presença 100% | Completude 15%, Corretude 15%, Clareza/Qualidade 10%, Participação 60% | Completude 40%, Corretude 40%, Testes 20% |
Grupos
A serem definidos.
Referência bibliográfica
- Aho, Sethi, Ullman, Compilers: Principles, Techniques, and Tools, Addison-Wesley, 2nd. ed., 2007. ISBN 0-321-48681-1
Documentação complementar
- Slides do curso
- Π Framework
- Template para preparação das apresentações