Construindo C / C ++: o que realmente acontece e por que demora tanto
Uma parte relativamente grande do tempo de desenvolvimento de software não é gasta na gravação, execução, depuração ou até no design de código, mas na espera pela conclusão da compilação. Para agilizar as coisas, primeiro precisamos entender o que está acontecendo quando o software C / C ++ é compilado. As etapas são aproximadamente as seguintes:
- Configuração
- Arranque da ferramenta de construção
- Verificação de dependência
- Compilação
- Linking
Agora, analisaremos cada etapa com mais detalhes, focando em como eles podem ser feitos mais rapidamente.
Configuração
Este é o primeiro passo ao iniciar a construção. Geralmente significa executar um script de configuração ou CMake, Gyp, SCons ou alguma outra ferramenta. Isso pode levar de um segundo a vários minutos para scripts de configuração muito grandes baseados em Autotools.
Este passo acontece relativamente raramente. Ele só precisa ser executado ao alterar configurações ou alterar a configuração de compilação. Com exceção da mudança dos sistemas de construção, não há muito a ser feito para acelerar esse passo.
Arranque da ferramenta de construção
É o que acontece quando você executa o make ou clica no ícone de construção em um IDE (que geralmente é um alias para o make). O binário da ferramenta de construção é iniciado e lê seus arquivos de configuração, bem como a configuração de construção, que geralmente são a mesma coisa.
Dependendo da complexidade e tamanho da compilação, isso pode levar de uma fração de segundo a vários segundos. Por si só, isso não seria tão ruim. Infelizmente, a maioria dos sistemas de build baseados em make faz com que o invocador seja invocado dezenas de centenas de vezes para cada build único. Geralmente, isso é causado pelo uso recursivo de make (o que é ruim).
Deve-se notar que o motivo pelo qual o Make é tão lento não é um bug de implementação. A sintaxe do Makefiles possui algumas peculiaridades que tornam uma implementação realmente rápida quase impossível. Esse problema é ainda mais perceptível quando combinado com a próxima etapa.
Verificação de dependência
Depois que a ferramenta de construção lê sua configuração, ela precisa determinar quais arquivos foram alterados e quais precisam ser recompilados. Os arquivos de configuração contêm um gráfico acíclico direcionado que descreve as dependências de construção. Esse gráfico geralmente é construído durante a etapa de configuração. O tempo de inicialização da ferramenta de compilação e o scanner de dependência são executados em cada compilação. Seu tempo de execução combinado determina o limite inferior no ciclo de edição-compilação-depuração. Para pequenos projetos, esse tempo geralmente leva alguns segundos. Isso é tolerável. Existem alternativas para o Make. O mais rápido deles é o Ninja, construído pelos engenheiros do Google para o Chromium. Se você estiver usando o CMake ou o Gyp para construir, mude para os back-ends Ninja deles. Você não precisa alterar nada nos arquivos de compilação, apenas aproveite o aumento de velocidade. O Ninja não é fornecido na maioria das distribuições, no entanto,
Compilação
Neste ponto, finalmente chamamos o compilador. Cortando alguns cantos, aqui estão os passos aproximados dados.
- A fusão inclui
- Analisando o código
- Geração / otimização de código
Ao contrário da crença popular, compilar C ++ não é tão lento assim. O STL é lento e a maioria das ferramentas de compilação usadas para compilar C ++ é lenta. No entanto, existem ferramentas e maneiras mais rápidas de mitigar as partes lentas do idioma.
Usá-los requer um pouco de graxa nos cotovelos, mas os benefícios são inegáveis. Tempos de construção mais rápidos levam a desenvolvedores mais felizes, mais agilidade e, eventualmente, melhor código.