🚀 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):t1 = B * Ct2 = A + t1X = 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:
t1 = A + B(Resolve o primeiro parênteses)t2 = C - 5(Resolve o segundo parênteses)t3 = t1 / t2(Faz a divisão)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:
- 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)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 13 Hardware) e clique em Commit to main. - 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:
t1 = A * Bt2 = C * Dt3 = t1 + t2Resultado = t3Gabarito da Prática 2:- 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!