MC011 - Laboratório de Construção de Compiladores

1o. Semestre de 2013

Turmas A e B

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

02/07
Notas do projeto 3 e médias finais estão disponíveis aqui. Bom final de semestre a todos.

04/06
Codegen no Projeto 3
Pessoal, o propósito do projeto 3 é vocês aplicarem a otimização pedida sobre o código produzido pelo Codegen que vocês escreveram no Projeto 2. Porém, alguns grupos não conseguiram gerar código correto no Projeto 2, e talvez tenham problemas de tempo para conseguir arrumar o Codegen e fazer o projeto 3. Em vista disso, estou incluindo no pacote um Codegen.class que funciona. A avaliação do projeto 3 levará em conta esse ponto da seguinte forma. Se você usar seu próprio Codegen para o projeto, sua nota será até 10, se o grupo optar por usar o Codegen fornecido, a nota será até o máximo de 8.0.

03/06
Notas do projeto 2 estão disponíveis aqui. A coluna de nota já tem eventuais penalidades por atraso computadas, representando a nota final do projeto.

14/5
Nos últimos dois dias recebi vários emails solicitando o adiamento da entrega do Projeto 2. Este projeto já teve 5 semanas de prazo para desenvolvimento. Durante estas 5 semanas, o nível de presença nas aulas tem sido MUITO abaixo do desejável, sendo esse um valioso tempo que deveria ter sido aplicado para tirar dúvidas e trabalhar no desenvolvimento aproveitando o apoio presencial do professor e do PED. Em vista disso, vou aceitar entregas em atraso do Projeto 2 sob as seguintes condições:
(1) Entregas feitas até 15/5 (data normal) receberão 100% da nota.
(2) Entregas feitas até domingo (19/5) as 23:59 receberão 90% da nota. A apresentação dos projetos entregues depois da aula do dia 15 e o dia 19/5 será no dia 22/5. (3) Entregas feitas entre segunda (20/5) e quarta (22/5), as 23:59, receberão 80% da nota. Não serão aceitos trabalhos após 22/5.
(4) A data de entrega do Projeto 3 continua a mesma (19/6).

24/04
Notas do projeto 1 estão disponíveis aqui.

24/04
Colocamos no Susy um PDF com explicações sobre possíveis padrões de instruções para arquitetura x86. Não é uma receita que deve ser seguida obrigatoriamente, é apenas para auxiliá-los a entender como é o conjunto de instruções x86. Cada grupo é livre para projetar e adotar os padrões que desejar. Lembro que padrões maiores tendem a gerar código mais eficiente, como explicado no PDF, e será um diferencial de nota caso o grupo apresente uma solução contendo esse tipo de padrão.

25/02
No projeto 1, vale lembrar que o tratamento de erros, dando mensagens compreensivas ao usuário é um dos pontos principais de uma ferramenta de compilação. Não apenas a produção correta do código gerado.

27/02
Você pode consultar os grupos já cadastrados aqui

27/02
Atenção,todos os grupos deve ser cadastrados antes da entrega do Projeto 1. Cadastre seu grupo aqui

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

Aulas

Turmas A e B
· Qua: 13-16h, salas IC 353, 302 e 303

Professores

Contato
· Professor: Sandro Rigo (sandro AT ic dot unicamp dot br)
· Monitor: Marcio Pereira (mpereira AT ic dot unicamp dot br)
· OBS.: Quando enviar um e-mail favor colocar no subject [MC011], 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 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. A média do desempenho será calculada por:
M = 0,3 * P1 + 0,4*P2 + 0,3*P3
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

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

Projetos

Parte 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 individualmente usando a ferramenta ANTLR (Java).

O arquivo exemplo.npl apresenta a especificação da linguagem NPL através de um exemplo. Nele aparecem as estruturas válidas da linguagem e as palavras reservadas. O objetivo final, é usar um programa em NPL para gerar um site de notícas 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. Note também que o programa exemplo.npl tem apenas a definição do conteúdo das duas primeiras colunas do jornal.
Cada grupo deve 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á baseada no funcionamento da especificação básica dada em exemplo.npl (50%, sendo 1 deles relativo à formatação do texto conforme descrito no parágrafo abaixo), na qualidade visual e de organização do site produzido (30%) e na qualidade das extensões propostas (20%).
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 exemplo.npl usa alguns desses códigos de formatação no campo "text" do objeto "headline1".

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 arquitetura x86, 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 pode ser encontrada aqui.

Submissão

A submissão dos arquivos do projeto deverão ser feitos através do Susy . Deverá ser enviado um arquivo .tar.gz e seu conteúdo deve seguir a estrutura passada, que também está no Susy (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.

O compilador deve, através de alguma opção de linha de comando, poder desabilitar a otimização. Assim, no momento da apresentação do projeto o grupo compilará os teste com e sem otimização e mostrará as diferenças no código, comentando os pontos onde a otimização foi aplicada.



Submissão

A submissão dos arquivos do projeto deverão ser feitos através do Susy . Deverá ser enviado um arquivo .tar.gz e seu conteúdo deve seguir a estrutura passada, que também está no Susy (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.