Geração e Otimização de Código
A geração e otimização de código traduzem representações intermediárias em código-alvo eficiente, transformando programas para que executem mais rapidamente ou utilizem menos recursos, preservando seu significado.
Definition
Geração de código é a produção de instruções-alvo (máquina ou bytecode) a partir de uma representação intermediária, e otimização é a aplicação de transformações que preservam a semântica e melhoram a velocidade, o tamanho ou o uso de recursos de um programa.
Scope
Este tópico abrange o back-end e o middle-end do compilador: representações intermediárias como a forma de atribuição estática única (SSA), análise de fluxo de dados, otimizações clássicas (propagação de constantes, eliminação de subexpressões comuns, otimizações de laço), seleção de instruções, agendamento de instruções e alocação de registradores. Aborda como as transformações preservam a semântica do programa enquanto melhoram o desempenho.
Core questions
- Como as transformações de programa podem melhorar o desempenho sem alterar o comportamento?
- Quais representações intermediárias tornam a análise de otimização eficiente?
- Como os registradores de máquina limitados são alocados para muitos valores de programa?
- Como a correção e o desempenho são equilibrados em otimizações agressivas?
Key theories
- Forma de atribuição estática única
- Cytron e colegas apresentaram um algoritmo eficiente para converter programas para a forma SSA, onde cada variável é atribuída uma única vez, simplificando dramaticamente muitas otimizações baseadas em fluxo de dados.
- Alocação de registradores por coloração de grafos
- Chaitin modelou a alocação de registradores como coloração de grafos de um grafo de interferência, fornecendo a abordagem fundamental para atribuir valores de programa a um conjunto limitado de registradores de máquina.
- Otimização baseada em fluxo de dados
- Muchnick e o Dragon Book formalizam a análise de fluxo de dados como a estrutura subjacente às otimizações clássicas, calculando propriedades do programa necessárias para justificar transformações seguras.
Clinical relevance
A otimização da geração de código determina a eficiência com que os programas utilizam processadores e memória, com amplo impacto no uso de energia e custo em escala. A forma SSA e a alocação de registradores por coloração de grafos permanecem centrais para compiladores de produção e sistemas just-in-time.
History
A otimização começou com o compilador Fortran e amadureceu através da análise de fluxo de dados de Allen e Cocke na década de 1970. A alocação de registradores por coloração de grafos de Chaitin em 1981-82 e a construção eficiente de SSA por Cytron et al. em 1991 tornaram-se pilares dos compiladores modernos, possibilitando os sofisticados pipelines de otimização usados nas cadeias de ferramentas atuais.
Debates
- Agressividade da otimização versus correção e previsibilidade
- Os projetistas de compiladores debatem quão agressivamente otimizar, já que explorar comportamento indefinido e reordenar pode gerar velocidade, mas introduzir resultados surpreendentes ou inseguros, o que impulsiona o interesse em otimização verificada e previsível.
Key figures
- Frances Allen
- Gregory Chaitin
- Ron Cytron
- Steven Muchnick
- Alfred Aho
Related topics
Seminal works
- cytron1991
- chaitin1982
- muchnick1997
- aho2006
Frequently asked questions
- O que é a forma SSA?
- A forma de atribuição estática única é uma representação intermediária na qual cada variável é atribuída exatamente uma vez e os usos são vinculados a uma única definição, o que simplifica e fortalece muitas otimizações de compilador.
- Por que a alocação de registradores é difícil?
- Os programas geralmente usam muito mais valores do que o número de registradores de máquina disponíveis, então o compilador deve decidir quais valores compartilham registradores e quais são despejados na memória; o problema central é equivalente à coloração de grafos, que é computacionalmente difícil em geral.