MC011 - Laboratório de Compiladores


Primeiro semestre de 2009

Turmas A e B


Aulas Atendimento Avaliação Projetos
Bibliografia Links
Notas

Contatos

Professores:
Turmas A e B:       Sandro Rigo (sandro 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

Avisos


03/07
As notas do terceiro trabalho estão disponíveis aqui, já estando descontados os 20% para as entregas em atraso e calculadas as médias finais.
30/06
As notas do segundo trabalho estão disponíveis aqui, já estando descontados os 20% para as entregas em atraso.
17/06
AVISO IMPORTANTE: Entrega do Trabalho 3

Devido ao adiamento da data de entrega e visando acelerar a entrega das notas no término do semestre, a entrega 3 será feita em um formato diferente das anteriores. Os projetos serão avaliados através de uma demonstração de no máximo 10 min feita por cada grupo. Nessa demonstração, os alunos explicarão como foi feita a implementação e rodarão um exemplo de programa, mostrando o efeito da aplicação de seu algoritmo de constant propagation.

Todos os grupos demonstrarão seus projetos no dia 1/07, durante o horário da aula ( a partir das 13h). Olharei os projetos na ordem de cadastramento dos grupos. É obrigatória a presença de todos os integrantes do grupo para evitar penalidades na nota. Grupos que não demonstrarem seus trabalhos nessa data, poderão demonstrar o trabalho no dia 3/7 as 10h na sala 42 do IC-2, com penalidade de 20% da nota. Não serão aceitas demonstrações após essa data.

Para esta etapa, não há necessidade de elaborar um relatório por escrito.

03/06
Os questionários para avaliação de cursos estão disponíveis hoje na sala 302 durante o horário da aula.
26/05
Dia 27/5 não poderei comparecer no horário de laboratório. Em caso de dúvidas, os alunos podem me procurar na sexta-feira. Os interessados podem marcar por email o horário para o atendimento.
20/05
As notas do primeiro trabalho estão disponíveis aqui, já estando descontados os 20% para as entregas em atraso.
20/05
Alguns alunos relataram ter problemas para montar o assembly gerado pelo compilador minijava no Nasm versão 2.03. Tente usar versões mais recentes.
20/05
Atendendo a pedidos de vários alunos, submissão sem penalidades pode ser feita até as 23:59h do dia 22/05. O trabalho será aceito com penalidade de 20% na nota até segunda (25/5) as 23:59h. Não serã aceitas submissões após essa data. O projeto 3 poderá ser submetido até dia 1/7, sem possibilidades de novos adiamentos.
19/05
A submissão deve ser feita nos mesmos moldes do projeto 1. Um pacote por grupo, com script para compilação e execução e um pequeno relatório. O relatório deve conter um resumo da sua implementação, com as informação mais relevantes e problemas encontrados, principais padrões de instruções que você escolheu incluir, etc. O ideal é não passar de 5 páginas. A submissão pode ser feita até as 23:59h do dia 20/05. O trabalho será aceito com penalidade de 20% na nota até sexta (22/5) as 23:59h. Não serã aceitas submissões após essa data.
07/05
Dia 13/5 não haverá aula de laboratório. Dia 20/5 a aula será iniciada as 13h30 na sala 301 para apresentação do projeto 3.
07/05
Estou disponibilizando uma documentação sobre o pacote do Appel escrito por um antigo monitor de MC011. Pode ajudar a entender a estrutura de classes e os métodos existentes. Faça o download aqui.
22/04
Instruções para compilação e execução no Linux dos programas de teste usando seu compilador para o Projeto 2:
java main.Main < #arquivo de teste#
nasm -felf minijava.asm
gcc runtime.o minijava.o
./a.out.

Notem que runtime.o é obtido pela compilação da biblioteca de runtime que está no diretório runtime do pacote( gcc -c runtime.c).
14/04
A aula de 15/4 será iniciada as 13h30 na sala 301 para a apresentação do projeto 2.
07/04
Instruções sobre entrega Projeto 1: As entregas deverão ser feitas por email para o professor com o subject [MC011] Grupo X. Onde X é o número de cadastro de seu grupo no site. É importante que seja entregue um pacote completo (TAR ou ZIP) contendo o compilador completo e um arquivo README, que será o relatório (máximo desejado de 2 páginas). No relatório é importante a descrição de eventuais problemas de implementação, bugs conhecidos, etc. Também deve conter uma explicação de como foi resolvida a detecção de herança cíclica, se o grupo inclui recuperação de erros no compilador e qualquer outra característica que tenha implementado a mais do especificado.
É muito importante o pacote conter um mecanismo fácil e claro (script, makefile, etc) de compilar o pacote e executar a compilação de um programa no seu compilador, visando tornar mais completo e agilizar a correção, sendo também considerado na nota final. Fique atento que o compilador será corrigido sendo invocado pela LINHA DE COMANDO em linux. Os usuários de Eclipse ou outro ambiente devem se certificar que o compilador funciona corretamente desta maneira antes de submetê-lo, caso estejam invocando sua execução de dentro de um ambiente de desenvolvimento e/ou em windows.
06/04
Como nos dois últimos finais de semana houve interrupção de energia na Unicamp, vou adiar a entrega sem penalidades do Projeto 1 para segunda 13/4. O trabalho será aceito, com penalidade de 20% na nota, até quarta dia 15/4. Após essa data não serã aceitas mais entregas.
01/04
Volto a lembrar que obrigatório o cadastramento dos grupos ANTES da data de submissão, mesmo os que decidiram por grupos de apenas 1 integrante
20/03
Vários alunos me procuraram para relatar dificuldades em trabalhar no projeto usando Eclipse. Segue abaixo instruções que me foram enviadas pelo colega Alexandre Hirata e estou compartilhando com vocês:

No Eclipse, após criar um projeto java e extrair o conteúdo de mc011_proj1.tgz para a pasta do projeto, entre no terminal e vá até a pasta do projeto e crie um JAR a partir do pacote minijava:

jar -cf minijava.jar minijava/

Voltando ao Eclipse, clique com o botão direito no ícone do projeto (menu de navegação à esquerda) e selecione "Properties". Selecione "Java Build Path" e clique na aba "Libraries". Feito isso, clique em "Add JARs" e selecione o arquivo minijava.jar recém-criado. Com isso, o Eclipse consegue encontrar as dependcias com os *.class.

16/03
É obrigatório o cadastramento dos grupos ANTES da data de submissão.
16/03
Foi liberado o formulário de cadastro para os grupos de MC011. Cadastre seu grupo aqui
16/03
Ainda sem dupla? Consulte a lista com outros alunos procurando formar uma dupla aqui
04/02
Mais um link para ajudar a entender o padrão de visitors, usado pelo Appel no analisador semântico: http://en.wikipedia.org/wiki/Visitor_pattern
04/02
É importante a leitura dos capítulos 4 e 5 para a elaboração do projeto 1. O capítulo 4 tem uma explicação sobre os métodos visitors usados no analisador semântico e sobre a representação intermediária dos programas.
04/02
 Primeira aula, explicação de como funcionará a matéria e apresentação do primeiro projeto
04/02
Os alunos deve se dividir em duplas para a realização do projeto, ou fazê-lo de forma individual.




Aulas
   Turmas A e B: Quartas: 13:00 - 14:00    Sala: IC-301
   Turmas A e B: Quartas: 14:00 - 16:00    Sala: IC-302

Atendimento

Professor:
             Sandro Rigo


Avaliação

 Avaliação e equipes: 
As atividades do curso serão feitas por equipes de 2 alunos. O projeto consistirá em implementar um compilador para a linguagem mini-java, conforme descrita no apêndice A do livro "Modern Compiler Implementation in Java" do Appel.
O compilador será implementado em três etapas (descrição, data de entrega e pesos abaixo), e nota menor do que 2,5 em qualquer uma das etapas reprova automaticamente os alunos da dupla.
Na nota de cada etapa será avaliado não só o funcionamento do código, mas também a sua clareza. Além disso, junto de cada entrega deverá ser também fornecido um arquivo contendo uma descrição de como foi feita a implementação, os problemas encontrados e como eles foram solucionados, quais testes funcionaram com sucesso. Quaisquer deficiências da sua implementação devem estar descritas nesse documento.
Cálculo da média:
M = 0,3 * P1 + 0,35*P2 + 0,35*P3

Qualquer tentativa de fraude na elaboração dos projetos implicará em nota ZERO a todos os envolvidos, acarretando sua reprovação.
Se M >= 5,0 o aluno aprovou-se na disciplina, caso contrário o aluno está reprovado.


Projetos

A implementação será dividida em três partes :
  • Projeto 1
    • Entrega : 13/04 -- Nova data!!
    • Peso : 30 %
    • Implementação da etapa de Análise Semântica (capítulo 5 do livro). A entrega deve consistir de um arquivo .tgz contendo o pacote semant de seu compilador mais o relatório.
    • É importante ressaltar que você não precisa alterar nenhum outro pacote além do semant para a implementação desta etapa. Porém não é vetado a alteração de arquivos em outros pacotes.
    • O pacote disponível abaixo já contém uma implementação dos analisadores léxico e sintático no diretório minijava, equivalente à implementação feita no semestre passado no curso de MC910. Ele não inclui o arquivo de descrição da gramática. Se você acidentalmente apagar os arquivos .class deste diretório, baixe o pacote novamente.
    • Para compilar o pacote execute javac main/Main.java
    • Para executar o compilador use java main.Main #programa#
    • Pacote de Implementação do Compilador
    • Programas de teste em minijava

  • Projeto 2
    • Entrega : 22/05
    • Peso : 35 %
    • Implementação da Análise de Liveness e Seleção de Instruções (capítulos 9 e 10 do livro)
    • O algoritmo a ser utilizado para Seleção de Instruções é o Maximal Munch (página 180 do livro do Appel). Se ao invés disso a dupla optar por implementar o de Programação Dinâmica (página 182 do livro do Appel), então esta entrega terá sua nota multiplicada por 1.1
    • Pacote de Implementação do Compilador
    • Programas de teste em minijava

  • Projeto 3
    • Entrega : 01/07 <== NOVA DATA !!!
    • Peso : 35 %
    • Objetivo: Implementar a otimização de Constant Propagation
    • Para essa otimização será necessário incluir mais uma análise de fluxo de dados no compilador. Seguindo o modelo utilizado para a implementação de Liveness Analysis, criar uma nova classe que implemente a análise chamada de Reaching Definitions. A partir daí, implementar a otimização de Constant Propagation usando essa análise. A descrição de Reaching Definitions e Constant Propagation encontra-se no capítulo 17 do livro texto. Um modelo de como usar chamadas a uma análise de fluxo de dados é a implementação do alocador de registradores na entrega anterior. Na execução do compilador, a chamada para constant propagation deve ser realizada antes de liveness analysis e alocação de registradores, e após a seleção de instruções.
    • Durante a demonstração para essa etapa, o grupo deve mostrar, para um programa exemplo, o código assembly gerado pelo seu compilador usando e não usando constant propagation, discutindo as melhorias geradas pela aplição desta nova transformação. É importante também mostrar a especificação das novas classes adicionadas e onde elas foram adicionadas nos pacotes.
    • O pacote disponível abaixo já contém uma implementação dos diretórios reg_alloc e x86 contendo as partes implementadas no projeto 2.
    • Pacote de Ajuda na Implementação do Projeto 3
    • Programas de teste em minijava

     





Bibliografia


  • SableCC (usado no projeto do parser) : http://www.sablecc.org

  • Pacote de Implementação do Compilador

  • Programas de teste em minijava