🚀 Capítulo 13: Geração de Código Intermediário (Tema: Transformers)

NOTE

Este capítulo utiliza a temática de Transformers para explicar o Código Intermediário. Nem carro, nem robô: fique no meio do caminho para conseguir se adaptar a qualquer situação!


1. 🎯 Objetivo da Aula

Compreender a fase de Geração de Código Intermediário, entendendo como o compilador cria uma linguagem “meio-termo” que facilita a tradução para diferentes tipos de processadores.

2. 🏢 O Cenário Prático (Seu Desafio)

Um robô Transformer, quando está mudando de forma, passa por um estado intermediário onde ele não é nem um carro completo nem um robô completo. Ele está no meio do caminho. Esse estado serve de ponte para que a transformação aconteça sem quebrar as peças.

No compilador, acontece algo parecido. O seu código em C++ (Alto Nível) é muito complexo. A linguagem de máquina (Baixo Nível) é muito simples. Passar de um direto para o outro é muito difícil! Por isso, o compilador cria um Código Intermediário. É uma linguagem artificial, simples e universal, que serve de ponte! Seu desafio é entender essa transformação!


🧠 Fundamentos: A Teoria Traduzida

O Código Intermediário é uma representação do programa fonte que o compilador gera para facilitar a otimização e a tradução para o código de máquina final.

📐 O Código de Três Endereços (3AC):

É uma das formas mais comuns de código intermediário. Nele, cada linha de instrução pode ter, no máximo, 3 nomes de variáveis (endereços).

  • Se você escrever a conta: X = A + B * C
  • O computador não consegue fazer tudo de uma vez. O compilador quebra em passos menores usando variáveis temporárias (t1, t2):
    1. t1 = B * C
    2. t2 = A + t1
    3. X = t2

🌍 A Grande Vantagem: Portabilidade

Imagine que você criou um compilador para a linguagem C++.

  • Se você traduzir o C++ direto para o processador Intel, e amanhã quiser rodar no processador ARM do celular, você terá que reescrever o compilador inteiro!
  • Usando Código Intermediário, você só precisa fazer a tradução do C++ para o Código Intermediário uma vez. Depois, você só cria pequenos tradutores desse código intermediário para cada tipo de processador! Poupa anos de trabalho!

4. 📖 Exemplo Guiado: Quebrando Expressões

Vamos transformar a expressão matemática D = (A + B) / (C - 5) em código de três endereços:

  1. t1 = A + B (Resolve o primeiro parênteses)
  2. t2 = C - 5 (Resolve o segundo parênteses)
  3. t3 = t1 / t2 (Faz a divisão)
  4. D = t3 (Guarda o resultado final em D)

5. 🛠️ Prática Obrigatória 1: Gerando Código de 3 Endereços

Transforme a seguinte linha de código em uma sequência de código de três endereços usando variáveis temporárias (t1, t2, etc.): Resultado = A * B + C * D; (Dica: A multiplicação tem prioridade sobre a soma!)

6. 🛠️ Prática Obrigatória 2: O Benefício da Ponte

Com base no que aprendemos sobre portabilidade:

  1. Se uma empresa de software quer que a sua nova linguagem de programação rode no Windows (Intel), no iPhone (ARM) e no PlayStation, por que o uso de Código Intermediário no compilador é fundamental?

7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 13 Hardware) e clique em Commit to main.
  2. Envie para a Nuvem (Push): Clique em Push origin.

8. 📂 Estrutura de Pastas

mod_14_hardware_e_compiladores/
├── capitulos/
│   ├── capitulo_13_intermediario.md
│   └── codigos/
│       └── cap13/
│           └── codigo_3ac.txt

💡 Checkpoint de Lógica

O código intermediário é o segredo por trás do Java e do C#. O arquivo .class do Java nada mais é do que um código intermediário (Bytecode) que roda em qualquer computador que tenha a Máquina Virtual Java instalada!

10. 🔥 Desafio de Fixação

Pesquise o que significa a sigla IR (Intermediate Representation) no contexto de compiladores modernos como o LLVM.

🔑 Gabarito de Código/Fórmulas

Gabarito da Prática 1:

  1. t1 = A * B
  2. t2 = C * D
  3. t3 = t1 + t2
  4. Resultado = t3 Gabarito da Prática 2:
  5. Porque a empresa só precisa escrever a parte do compilador que entende a linguagem nova uma única vez (gerando o código intermediário). Para fazer rodar em cada aparelho diferente, ela só precisa criar um pequeno tradutor que pegue esse código intermediário e transforme no código específico daquele aparelho. Economiza muito tempo e dinheiro!

Capitulo Anterior | Proximo Capitulo