Etapa 7: Geração de Código para JVM

Objetivos

  • Aprender sobre a máquina de pilha da JVM (Java Virtual Machine).
  • Utilizar a biblioteca ASM para gerar bytecode.
  • Finalizar o compilador gerando um artefato executável (.class).

Fundamentação Teórica

A JVM não possui registradores de uso geral (como EAX, EBX). Ela opera sobre uma Pilha de Operandos. Exemplo para a = b + c: 1. iload_1 (Carrega b na pilha) 2. iload_2 (Carrega c na pilha) 3. iadd (Desempilha dois, soma, empilha o resultado) 4. istore_0 (Desempilha o resultado e salva em a)

Atividades Práticas

1. Configurando a Biblioteca ASM

Adicione ao pom.xml:

<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.6</version>
</dependency>

2. O CodeGen Visitor

Crie um Visitor que percorre a AST e emite instruções ASM. Ele precisará de: - ClassWriter: Para criar a estrutura da classe. - MethodVisitor: Para escrever instruções dentro do método main.

Mapeamento de Variáveis: Diferente da Tabela de Símbolos (que usa nomes), a JVM usa índices numéricos (0, 1, 2…). Você precisará de um mapa String -> Integer para saber qual índice representa a variável x.

3. Implementando Instruções

  • Programa: Cria a classe Program, cria o método public static void main(String[] args).
  • Atribuição (x := expr):
    • Visita expr (gera código que deixa o resultado na pilha).
    • Emite istore varIndex (salva da pilha na variável).
  • Soma (a + b):
    • Visita a (pilha: a).
    • Visita b (pilha: a, b).
    • Emite iadd (pilha: a+b).
  • Print (writeln(x)):
    • getstatic System.out
    • Visita x (carrega valor)
    • invokevirtual println

4. Compilador Final

O seu programa deve: 1. Ler arquivo .pas. 2. Analisar Lexico/Sintatico. 3. Analisar Semântico. 4. Gerar arquivo .class.

O que entregar

  • O compilador completo funcionando.
  • Exemplo fatorial.pas compilado e executado.

Exemplo de execução:

java -jar meu-compilador.jar fatorial.pas
# Gera fatorial.class
java fatorial
# Saída: 120
Back to top