MC911 - Projeto em Compiladores

1o. Semestre de 2014

Turmas A e B

Aulas Atendimento Avaliação Projetos Links Referências Notas
Avisos

24/02
· Página da disciplina no ar. Confira critérios de avaliação e calendário.

Aulas

Turmas A e B
· Qua: 14-18h, salas IC 302 e 303

Professores

Contato
· Professor: Sandro Rigo (sandro AT ic dot unicamp dot br)
· Monitor: Maxiwell Garcia (maxiwell AT gmail dot com)
· OBS.: Quando enviar um e-mail favor colocar no subject [MC911], caso contrário você corre sério risco de seu email ser filtrado como spam.

Avaliação

Avaliação
Teremos três projetos a serem elaborados (descrição, data de entrega e pesos abaixo) ao longo do semestre. Cada entrega será composta de uma avaliação presencial e da entrega do pacote com o código fonte desenvolvido. A nota de cada etapa será composta por Pi = 0,3*(AP)+0,7*(I). Onde AP é a avaliação presencial e I é a implementação. A avaliação presencial é obrigatória a todos os alunos. A não participação nesta avaliação implica em nota zero na etapa correspondente. Além disso, existirão exercícios de desenvolvimento aplicados em aula. Esses exercícios deverão ser realizados e entregues durante o período da aula. A média do desempenho será calculada por:
M = 0,2 * P1 + 0,4*P2 + 0,25*P3 + 0,15 EX
Se M >= 5,0 o aluno aprovou-se. Caso contrário o aluno estará reprovado.
A entrega de todos os projetos é obrigatória. Nota menor do que 2,5 em qualquer um dos projetos acarreta automaticamente a reprovação com média final MF = Min (4,0; M).

Fraudes
Qualquer tentativa de fraude implicará em nota ZERO no projeto correspondente, reprovando automaticamente todos os envolvidos.

Calendário

  • 19/03: Entrega e Avaliação presencial do Projeto 1
  • 30/04: Entrega e avaliação presencial do Projeto 2
  • 11/06: Entrega e avaliação presencial do Projeto 3

Projetos

Projeto 1
Especificação dos tokens, da gramática livre de contexto e implementação de um parser para uma linguagem de alto nível chamada "News Publication Language (NPL)". Esta linguagem é usada para geração de código HTML para um site de notícias.
O trabalho deve ser realizado em duplas usando a ferramenta Flex e Bison.

O arquivo sempre_online.npl (em HTML com syntax highlight: sempre_online.npl.html) apresenta a especificação da linguagem NPL através de um exemplo. Nele aparecem as estruturas válidas da linguagem e as palavras reservadas. Aos usuários de VIM, aqui encontra-se um arquivo de syntax highlight da linguagem NPL.
O objetivo final, é usar uma descrição em NPL para gerar um site de notícias como este jornal. Note que a formatação usada neste site é apenas ilustrativa. Cada grupo deve escolher o estilo de formatação que lhe pareça mais adequado, inclusive aplicando o uso de CSS.
Cada grupo pode propor extensões para a linguagem NPL, visando torná-la mais poderosa ou flexível em termos de definição e apresentação do conteúdo do jornal. A nota final do trabalho será composta de 70% para a implementação correta do parser e o cumprimento total da especificação, 30% para a qualidade visual e de organização do site produzido, e as extensões como bônus extra na nota. A especificação da linguagem NPL pode ser encontrada em sempre_online.npl.
Atenção especial às possibilidades de formatação do texto inserido nos campos dos objetos. Essa formatação deve usar o padrão de códigos do wiki da Wikipedia (http://pt.wikipedia.org/wiki/Ajuda:Guia_de_edição/Formatação#Os_c.C3.B3digos_wiki_para_formatar_artigos). O programa sempre_online.npl usa alguns desses códigos de formatação no campo "text".

Submissão

A submissão dos arquivos do projeto deverão ser feitos através do Susy . As Senhas foram enviadas por email, se você não recebeu a sua, entre em contato com o monitor da disciplina.

No susy deverá ser submetido um arquivo compactado (.tar ou .tar.gz) que deverá conter a seguinte estrutura na sua raiz:

  • Um diretório chamado raXXXXXX_raYYYYYY, se você está fazendo o projeto em duplas ou raXXXXXX se está fazendo o projeto individualmente. Dentro deste diretório, devem aparecer os seguintes arquivos:
    • Um diretório chamado src, onde você deverá colocar todo o conteúdo de código do seu projeto (arquivo com gramática, código fonte, arquivos de bibliotecas, etc.). Atenção: não colocar binários de qualquer tipo (inclusive .class) do seu projeto.
    • Um arquivo Makefile que deverá responder aos seguintes comandos:
      • 'make compile'. Este comando deverá preparar seu projeto para ser rodado (se precisar compilar ou configurar alguma coisa, coloque isso dentro desse comando). Após a execução desse comando, o seu projeto deverá estar pronto para ser executado.
      • 'make run INPUT=<arquivo de entrada> OUTPUT=<arquivo de saída>'. Esse comando deverá rodar seu projeto, lendo o arquivo .npl de entrada e escrevendo a saída no arquivo .html passado.
    • Opcionalmente, escreva um arquivo LEIAME.txt. Use esse arquivo para informar qualquer coisa que achar pertinente sobre seu laboratório (fez coisas a mais, a menos, precisa instalar alguma coisa, etc.).
    • Opcionalmente, você pode colocar qualquer coisa que achar pertinente dentro de um diretório chamado 'misc'. Neste caso, escreva no arquivo LEIAME.txt o que há dentro desse diretório.
Atenção: O não cumprimento de qualquer requisito de submissão influenciará na nota do grupo!.

Projeto 2

Este segundo projeto abordará o tópico de geração de código.

Teoria
A parte teórica da necessária para a implementação do laboratório foi vista no curso de MC910, e pode ser revista nos slides da disciplina ou capítulo 9 do Appel (2a edição). É importante ressaltar que conhecimentos sobre Árvores de representações intermediária, também vistos na disciplina MC910 e contidos no capítulo 7 do Appel (2a edição), são necessários.

Descrição
Você deverá implementar uma classe na linguagem Java que recebe uma lista de árvores e sobre elas executa um algoritmo de seleção de instruções (maximal munch, por exemplo) e devolve uma lista com as instruções referentes a essas árvores. Para mais detalhes sobre os nós que podem estar nessas árvores, você pode verificar o livro do Appel (2a edição) na seção 7.1 ou na documentação das classes . As instruções deverão ser instruções assembly para a representação intermediária do compilador LLVM, e você deverá utilizar as classes auxiliares para essas instruções . Note que a arquitetura é diferente da arquitetura utilizada pelo livro do Appel, portanto a parte da implementação do livro (seção 9.3) não necessariamente diz respeito ao que deve ser implementado no projeto (porém pode ajudar a entender melhor o que fazer).

Uma estrutura inicial do projeto será disponibilizada em breve.

Submissão

A submissão dos arquivos do projeto deverão ser feitos através do Susy . Deverá ser enviado um arquio .tar.gz e seu conteúdo deve seguir a estrutura passada (obviamente, você deve alterar o seu RA e de sua dupla ou remover o segundo RA). Se você decidiu separar a implementação em várias classes, altere o Makefile para que ele compile e rode corretamente. Novamente, o não cumprimento de qualquer requisito de submissão influenciará na nota do grupo!

Projeto 3

O objetivo desta parte é implementar a otimização Dead Code Elimination (DCE) no compilador descrito no livro do Appel. Esta otimização é descrita no livro no capítulo 17, pág 360.

DCE depende da implementação da DFA chamada Análise de Longevidade, que está descrita no capítulo 10 do livro.

Esta otimização será implementada como sendo um passo do compilador LLVM (www.llvm.org). EM breve discutiremos em aula e colocaremos instruções de como um passo para LLVM deve ser implementado.



Submissão

A submissão dos arquivos do projeto deverão ser feitos através do Susy . Deverá ser enviado um arquio .tar.gz e seu conteúdo deve seguir a estrutura passada (obviamente, você deve alterar o seu RA e de sua dupla ou remover o segundo RA). Se você decidiu separar a implementação em várias classes, altere o Makefile para que ele compile e rode corretamente. Novamente, o não cumprimento de qualquer requisito de submissão influenciará na nota do grupo!

Links

Referências Principais

Notas de Aula

Modern Compiler Implementation in Java
Andrew Appel, 2a Edicão

Compiladores : Princípios, Técnicas e Ferramentas
Aho, Sethi & Ullman

Implementação de Linguagens de Programação
Kowaltowski, Editora Guanabara Dois, 1983.