Tem alguma pergunta?
Mensagem enviada. Fechar

Geração de Código Final e o Processo de Linkagem

4 Alunos Inscrito
0
0 avaliação
  • Descrição
  • Currículo
  • Revisões
Geração de Código.png

Este curso oferece uma exploração profunda e detalhada das etapas finais e cruciais que transformam um programa, já analisado e otimizado, em um arquivo executável pronto para rodar no hardware. Desmistificamos a “mágica” que acontece após a representação intermediária (IR) ser gerada, mergulhando no coração do back-end do compilador e no processo de ligação (linking).

Passaremos por cada fase da “linha de montagem” final:

  1. Geração de Código: Aprenderemos como o compilador seleciona as melhores instruções da máquina, as reordena para otimizar o pipeline da CPU e resolve o quebra-cabeça de alocar um número infinito de variáveis nos poucos e preciosos registradores físicos.

  2. Organização de Memória: Investigaremos como as chamadas de função são gerenciadas através da pilha de execução (stack), com a criação de stack frames pelos prólogos e epílogos, e como os dados globais e estáticos encontram seu lugar nas seções .data e .bss.

  3. Ligação (Linking): Entenderemos o trabalho do linker, que atua como um detetive para resolver referências entre diferentes arquivos de código (Resolução de Símbolos) e, em seguida, como um engenheiro que “remenda” o código binário para que todas as chamadas e acessos a dados apontem para os endereços corretos (Realocação).

Ao final, o aluno terá uma visão completa e integrada de como uma representação abstrata de um programa é metodicamente convertida em um arquivo binário concreto e executável.

Escopo e Foco do Curso

Para garantir profundidade e clareza, este curso foca especificamente no back-end de um compilador estático e no processo de ligação estática.

O Que Será Abordado:

  • Geração de Código: As três fases primárias (Seleção de Instruções, Ordenação de Instruções e Alocação de Registradores).

  • Gerenciamento de Memória em Tempo de Compilação: Alocação na pilha (stack) e alocação estática.

  • Ligação Estática: O processo completo, incluindo Resolução de Símbolos e Realocação de Endereços.

  • A Interface com o Hardware e o SO: A estrutura de arquivos objeto e como o executável final é entregue ao Carregador do Sistema Operacional.

O Que NÃO Será Abordado:

  • O front-end do compilador (análise léxica, sintática e semântica).

  • Otimizações de alto nível realizadas na Representação Intermediária (IR).

  • Ligação dinâmica e o funcionamento de bibliotecas compartilhadas (.so, .dll) em profundidade.

  • O funcionamento interno detalhado do Carregador do Sistema Operacional (OS Loader).

Objetivos de Aprendizagem

Ao concluir este curso, o aluno será capaz de:

  1. Explicar o Fluxo Completo: Descrever a jornada de um programa desde uma representação intermediária de baixo nível até um arquivo executável, detalhando o propósito de cada fase no back-end e no linker.

  2. Analisar a Geração de Código:

    • Diferenciar as responsabilidades da Seleção, Ordenação e Alocação de Instruções.

    • Interpretar um Grafo de Dependência de Dados (DDG) para identificar o caminho crítico e entender as restrições de ordenação.

    • Explicar o funcionamento do algoritmo de Coloração de Grafos para Alocação de Registradores, incluindo o conceito de spilling.

  3. Compreender o Gerenciamento de Memória:

    • Ilustrar a estrutura de um Stack Frame e explicar a função do prólogo e do epílogo de uma função.

    • Diferenciar a alocação de variáveis locais (na pilha) da alocação de variáveis globais e estáticas (nas seções .data e .bss).

  4. Dominar os Conceitos de Ligação:

    • Distinguir claramente entre Resolução de Símbolos e Realocação de Endereços.

    • Aplicar as regras de símbolos fortes vs. fracos para prever o comportamento do linker diante de definições múltiplas.

    • Explicar como as bibliotecas estáticas são utilizadas para resolver símbolos indefinidos.

    • Calcular manualmente os valores para realocações absolutas e relativas ao PC em cenários simplificados.

  5. Justificar a Arquitetura do Processo: Argumentar por que as fases ocorrem em uma ordem específica (ex: por que a alocação de registradores deve ocorrer após o agendamento de instruções, e por que a realocação deve ocorrer após a resolução de símbolos).

Geração de Código