4a. feira e 6a. feira, sempre de 11:00 às 12:40 na sala 315.
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 linguagens 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.
Datas importantes
P1 - 15 e 17/05 - 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.
- O parser pode ser implementado fazendo-se uso de um gerador de analisador sintático ou manualmente como descrito no LLVM Tutorial. A linguagem fonte do projeto pode ser mudada de Imp para Kaleidoscope. A especificação das Π denotations deverá ser adaptada no entanto.
- Entender o Π Framework.
- Implementar Π IR-mark0: (i) Interpreting Automata, (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.
P2 - 26 e 28/06 - 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) Interpreting Automata com ambientes, (ii) declarações de variáveis e constantes.
- Implementar um compilador de Imp-1 para Π IR-mark1.
P3 - 17 e 19/07 - 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
- Três provas (P1, P2 e P3) e uma verificação suplementar (VS).
- Seja a média das provas (MP) = (P1+P2+P3)/3
- Se MP ≥ 6, o aluno está aprovado.
- Se MP < 4, o aluno está reprovado.
- Se 4 ≤ MP < 6, o aluno deve fazer VS. Neste caso, ficará aprovado se VS ≥ 6 e reprovado caso contrário.
Durante as aulas e em cada prova, a avaliação será feita segundo os seguintes critérios:
Em aula 10% | Apresentação 70% | Projeto 20% |
Presença 30%, Participação 70% | Completude 15%, Corretude 15%, Clareza/Qualidade 10%, Participação 60% | Completude 40%, Corretude 40%, Testes 20% |
Grupos
# | Linguagem | Integrantes | Dia de apresentação | Link para o projeto |
1 | C++ | Nicholas Barcelos | 4a. feira | https://github.com/nicholas-barcelos/Cppimp |
2 | Idris | Caio, Ronald e Nicholas | 4a. feira | https://github.com/RonaldCamp/ImpCompiler |
3 | Julia | Julia Noce, Gabriela Hecksher | 4a. feira | https://github.com/gabihecksher/jupiter |
4 | Lua | Caroline Rosa e Henrique Fontenelle | 6a. feira | https://github.com/carolinerosa/lobisomen |
5 | Ocaml | Felipe Assad, Jorge Felipe e Thiago Augusto | 6a. feira | https://github.com/sevontheedge/Ocampiler |
6 | Prolog | - | - | - |
7 | Swift | Beatriz e Vitor | 6a. feira | https://github.com/VitorA29/swimft |
Referência bibliográfica
- Aho, Sethi, Ullman, Compilers: Principles, Techniques, and Tools, Addison-Wesley, 1986. ISBN 0-201-10088-6
Documentação complementar
- Slides do curso
- Π Framework
- Template para preparação das apresentações
- LLVM Tutorial, em C++ e OCaml.