CEDIS | UnB

Geração de código final

Prática com bitcode textual

Prof. Sergio Antônio Andrade de Freitas
FGA0003 - Compiladores 1 · Semana 10 · Prática · 2025/2
símbolo CEDIS logo UnB
símbolo CEDISCEDIS
2/21

Roteiro da prática

  1. 01Acessar o projeto e reconhecer os arquivos
  2. 02Compilar o gerador com Makefile
  3. 03Executar testes automatizados
  4. 04Mapear expressões Java simples para bitcode
  5. 05Criar novos testes e adaptar ao projeto da equipe
símbolo CEDISCEDIS
3/21

Resultado esperado da aula

  • Projeto compilado com Flex, Bison, GCC e Make
  • Testes executados com make test
  • Bitcode textual interpretado a partir de entradas Java simples
  • Novos arquivos .java adicionados em tests/
  • Commit e push das alterações no repositório da equipe
símbolo CEDISCEDIS
4/21
atividade

Acesso ao código

Abra o repositório da disciplina e localize o material da Semana 10.

  • Repositório: sergioaafreitas/COMP1
  • Diretório esperado: semana 10
  • Procure pelos arquivos src/, tests/, Makefile e README.md
QR Code para acesso à atividade
símbolo CEDISCEDIS
5/21

Estrutura do projeto

A organização separa especificações de linguagem, implementação da AST, casos de teste e automação de compilação.

  • src/: lexer.l, parser.y, ast.c e ast.h
  • tests/: entradas .java usadas nos testes
  • Makefile: compilar, testar e limpar
  • README.md: instruções e autoria
Estrutura do projeto da prática
símbolo CEDISCEDIS
6/21
Fluxo da geração de bitcode

Fluxo completo do gerador

A prática transforma uma declaração simples em uma sequência de instruções de máquina abstrata.

  • O arquivo .java fornece a entrada
  • Flex produz tokens para o parser
  • Bison reconhece a gramática e aciona ações semânticas
  • A geração emite bitcode textual
seção

Primeiro ciclo: compilar e executar

Antes de modificar, é preciso obter uma execução limpa.

símbolo CEDISCEDIS
8/21

Comandos principais

Compilação

  • make clean
  • make
  • Verificar se o executável generate foi criado

Testes

  • make test
  • Conferir cada arquivo em tests/
  • Comparar entrada e saída gerada
símbolo CEDISCEDIS
9/21

Exemplo de entrada e saída

A declaração é reconhecida e convertida em instruções de uma máquina abstrata baseada em pilha.

  • Entrada: int x = 3 + 4;
  • Constantes são carregadas na pilha
  • ADD consome dois valores e empilha o resultado
  • STORE grava o resultado no identificador
Mapeamento de uma declaração para bitcode
símbolo CEDISCEDIS
10/21

Como interpretar o bitcode

LOAD_CONST n

Coloca uma constante na pilha da máquina abstrata.

LOAD_VAR id

Carrega o valor de uma variável, quando houver suporte no protótipo.

ADD, SUB, MUL, DIV

Consomem operandos e produzem o resultado da operação.

STORE id

Armazena o resultado final no identificador da atribuição.

símbolo CEDISCEDIS
11/21

Da gramática à emissão

1

Reconhecer declaração

A regra do Bison identifica tipo, variável, atribuição e expressão.

2

Reconhecer expressão

A expressão aritmética é decomposta em operandos e operadores.

3

Executar ação semântica

A ação associada à produção chama a rotina de geração.

4

Emitir instruções

As instruções são impressas em ordem compatível com a avaliação.

símbolo CEDISCEDIS
12/21

Relação com Flex e Bison

Flex

  • Reconhece int, identificadores e números
  • Reconhece operadores e delimitadores
  • Envia tokens ao parser

Bison

  • Define a gramática das declarações
  • Resolve a estrutura das expressões
  • Chama as rotinas de geração de bitcode
símbolo CEDISCEDIS
13/21
Ciclo de compilação e teste

Ciclo de testes

Os testes automatizados reduzem regressões quando novas instruções são adicionadas.

  • Criar um arquivo tests/nome.java
  • Executar make test
  • Conferir a sequência emitida
  • Ajustar a gramática ou o gerador
símbolo CEDISCEDIS
14/21

Novos testes sugeridos

  • int y = 10 - 2;
  • int z = 5 * 6;
  • int w = 20 / 4;
  • int r = (3 + 4) * 2;
  • int a = b + 1; se o protótipo suportar variáveis em expressões
símbolo CEDISCEDIS
15/21

Falhas frequentes

Token ausente

O lexer não reconhece algum símbolo usado no teste.

Produção incompleta

A gramática não cobre a forma da declaração ou expressão.

Ordem incorreta

A emissão do bitcode não respeita a avaliação da expressão.

Teste frágil

A entrada não cobre a funcionalidade recém-adicionada.

seção

Segundo ciclo: adaptar ao projeto da equipe

O protótipo é ponto de partida, não produto final.

símbolo CEDISCEDIS
17/21

Adaptação ao compilador da equipe

Decisões técnicas

  • Qual será a linguagem-alvo?
  • O alvo será bitcode, assembly ou C intermediário?
  • Quais instruções mínimas serão necessárias?

Implementação

  • Integrar emissão ao parser ou à AST
  • Criar testes para cada comando
  • Documentar o formato de saída
símbolo CEDISCEDIS
18/21

Tarefas da aula

1

Executar

Rodar make, make test e registrar a saída inicial.

2

Inspecionar

Relacionar cada instrução gerada à produção gramatical correspondente.

3

Estender

Adicionar novos testes e uma pequena melhoria no gerador.

4

Registrar

Atualizar README, comentar código, fazer commit e push.

símbolo CEDISCEDIS
19/21

Checklist de evidências

  • Print ou log de make test executado com sucesso
  • Novos arquivos .java em tests/
  • Saídas esperadas registradas no README ou comentário
  • Código com cabeçalho institucional e funções comentadas
  • Commit e push no repositório da equipe
símbolo CEDISCEDIS
20/21

Referências

  1. Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2007). Compilers: Principles, Techniques, and Tools (2nd ed.). Pearson.
  2. Appel, A. W. (2002). Modern Compiler Implementation in Java (2nd ed.). Cambridge University Press.
  3. Tremblay, J. P., & Sorenson, P. G. (2008). Theory and Practice of Compiler Writing. BS Publications.
  4. Wirth, N. (2005). Compiler Construction. ETH Zürich.
símbolo CEDISCEDIS
21/21

Encerramento

Próximo passo: consolidar a geração de código final no compilador ou interpretador da equipe.

→ avançar · ← voltar · deslize (touch) · n notas · f tela cheia · p imprimir