- Projeto de calendário de advento de 25 dias com o tema otimizações de compilador C/C++
- De 1º a 25 de dezembro, é apresentado um caso de otimização por dia através de postagens de blog e vídeos
- Cada postagem aborda com detalhes quando aplicar, interpretação de assembly e cenários em que não é aplicada
- Foco principal em x86-64, mas inclui também partes de arquitetura ARM de 64 e 32 bits
- Uma série de alto valor educacional para quem quer aprender os princípios de funcionamento de compiladores
Visão geral do projeto Advent of Compiler Optimisations 2025
- Projeto preparado ao longo de cerca de 1 ano, com a publicação de um novo caso de otimização de compilador por dia durante dezembro
- Publica um post e um vídeo por dia, de 1º a 25 de dezembro
- Cada conteúdo aborda otimizações interessantes realizadas pelo compilador com base em código C ou C++
- Cada otimização explica em detalhes condições de aplicação, interpretação de código assembly e casos em que não é aplicada
- Em vez de uma simples comparação de código, apresenta uma análise do funcionamento real do compilador
Escopo técnico abordado
- Abrange de truques de arquitetura de baixo nível a técnicas de otimização de alto nível
- Foca principalmente em x86-64, mas também inclui alguns conteúdos relacionados a ARM de 64 e 32 bits
- Composto por material prático para aprender o funcionamento interno do compilador e o processo de geração de código
Como participar e assistir
- É possível acompanhar todas as postagens pelo tag AoCO2025 no blog
- Os vídeos podem ser assistidos pelo canal do YouTube ou pela playlist dedicada
Significado do projeto
- Projeto pessoal de grande porte, concluído após quase 1 ano de preparação, com o objetivo de explorar a sofisticação e eficiência dos compiladores
- Uma tentativa educacional para ajudar desenvolvedores a compreender o verdadeiro funcionamento da otimização de compiladores e aplicar esse conhecimento na escrita de código
- O autor pretende compartilhar também o prazer de aprender o quão incrível é um compilador
Sobre Matt Godbolt
- Desenvolvedor C++ residente em Chicago, que trabalha na Hudson River Trading
- Coapresentador do podcast Two’s Complement
- Ativo no Mastodon e no Bluesky
- O conteúdo do blog é distribuído sob a licença Creative Commons BY-NC 3.0 Unported
1 comentários
Comentários no Hacker News
Depois de ver as otimizações de compilador do Matt, vale a pena conferir também a entrevista que fiz com ele
O que passei a acreditar é o seguinte: trabalhe no nível de abstração com o qual você se sente confortável, mas também precisa entender a camada logo abaixo
Por exemplo, se você é programador em C, precisa saber como o runtime de C interage com o sistema operacional. Não é necessário conhecer todos os detalhes, mas é preciso ter noção de por onde começar quando surgir um problema
O artigo da ACM Queue que o Matt escreveu também é antigo, mas continua sendo uma ótima introdução para entender esses conceitos de otimização
Por exemplo, ao trabalhar com Java, entender a JVM me permitiu otimizar muito melhor o desempenho de software médico. E, além disso, simplesmente entender a camada abaixo também é divertido
Apesar de ele ser claramente um especialista no assunto, impressiona como explica tudo passo a passo a partir do básico, em vez de já mergulhar de cara no conjunto complexo de instruções x86
Matt Godbolt é uma verdadeira joia das comunidades de C e C++
Acho que o mundo de muitos desenvolvedores ficou melhor graças ao Compiler Explorer e às contribuições dele
Estou acompanhando o Advent of Computer Science Advent Calendars, Day 2
Tenho bastante interesse na técnica de amalgamação de código usada pelo SQLite
Segundo a equipe do SQLite, só essa abordagem já traz um ganho de desempenho de 5 a 10%. Gostaria que o Matt abordasse esse tema durante a sessão
Referência: wiki de Unity build
Ainda assim, como o LTO pode ser lento em builds não incrementais, unity build continua útil para builds pontuais
Trabalho com desenvolvimento de software há 25 anos, mas ainda me pergunto se estou usando as flags de compilador ideais
Na maioria dos casos,
-O2já basta. A cada atualização do compilador, as otimizações internas melhoram, então quase nunca há necessidade de o desenvolvedor ajustar tudo manualmenteAlém disso, é arriscado adicionar flags com base em benchmarks ruins. Diferenças de desempenho de 1 a 2% são comuns dependendo do estado do sistema
Se a estrutura do código mudar, a afinidade com cache também pode mudar e isso afetar o desempenho. Ou seja, pode não ser por causa da flag, mas da disposição do código
Estou animado com os posts que ainda faltam. Hoje de manhã ensinei o SBCL a otimizar os padrões
(+ base (* index scale))e(+ base (ash index n))para uma única instrução LEA. Foi como aplicar imediatamente o que aprendi no Day 2Nunca existe conteúdo demais do Godbolt
Gostaria que abordassem divisão por constantes inteiras. O capítulo correspondente de Hacker’s Delight é excelente, mas para o leitor comum ele parece um pouco difícil
Parece um Advent of Code para fãs de compiladores
Adorei o formato de construir intuição com pequenas lições diárias de otimização
Se você entende o que o compilador faz e por quê, acaba se tornando um programador melhor independentemente da linguagem que usa