Construyendo C / C ++: lo que realmente sucede y por qué tarda tanto
Una parte relativamente grande del tiempo de desarrollo de software no se gasta en escribir, ejecutar, depurar o incluso diseñar código, sino en esperar a que termine de compilarse. Para acelerar las cosas, primero tenemos que entender lo que sucede cuando se compila el software C / C ++. Los pasos son aproximadamente los siguientes:
- Configuración
- Crear herramienta de inicio
- Comprobación de dependencia
- Compilacion
- Enlace
Ahora veremos cada paso con más detalle enfocándonos en cómo se pueden hacer más rápido.
Configuración
Este es el primer paso al comenzar a construir. Por lo general, significa ejecutar un script de configuración o CMake, Gyp, SCons o alguna otra herramienta. Esto puede tomar desde un segundo hasta varios minutos para scripts de configuración basados en Autotools muy grandes.
Este paso ocurre relativamente raramente. Solo necesita ejecutarse al cambiar configuraciones o al cambiar la configuración de compilación. A menos que cambien los sistemas de compilación, no hay mucho por hacer para acelerar este paso.
Crear herramienta de inicio
Esto es lo que sucede cuando ejecuta make o hace clic en el icono de construcción en un IDE (que generalmente es un alias para make). El binario de la herramienta de compilación se inicia y lee sus archivos de configuración, así como la configuración de compilación, que generalmente son lo mismo.
Dependiendo de la complejidad y el tamaño de la construcción, esto puede tomar desde una fracción de segundo hasta varios segundos. Por sí solo esto no sería tan malo. Desafortunadamente, la mayoría de los sistemas de compilación basados en make hacen que se invoque decenas a cientos de veces por cada compilación. Por lo general, esto es causado por el uso recursivo de make (que es malo).
Cabe señalar que la razón por la que Make es tan lento no es un error de implementación. La sintaxis de Makefiles tiene algunas peculiaridades que hacen que una implementación realmente rápida sea casi imposible. Este problema es aún más notable cuando se combina con el siguiente paso.
Comprobación de dependencia
Una vez que la herramienta de compilación ha leído su configuración, tiene que determinar qué archivos han cambiado y cuáles deben recompilarse. Los archivos de configuración contienen un gráfico acíclico dirigido que describe las dependencias de compilación. Este gráfico generalmente se construye durante el paso de configuración. El tiempo de inicio de la herramienta de compilación y el escáner de dependencias se ejecutan en cada compilación. Su tiempo de ejecución combinado determina el límite inferior en el ciclo de edición-compilación-depuración. Para proyectos pequeños, este tiempo suele ser de unos segundos. Esto es tolerable Hay alternativas para hacer. El más rápido de ellos es Ninja, que fue construido por ingenieros de Google para Chromium. Si está utilizando CMake o Gyp para construir, simplemente cambie a sus backends Ninja. No tiene que cambiar nada en los archivos de compilación, solo disfrute del aumento de velocidad. Sin embargo, Ninja no está empaquetado en la mayoría de las distribuciones,
Compilacion
En este punto, finalmente invocamos el compilador. Cortando algunas esquinas, aquí están los pasos aproximados tomados.
- La fusión incluye
- Analizando el código
- Generación / optimización de código
Contrariamente a la creencia popular, compilar C ++ no es realmente tan lento. El STL es lento y la mayoría de las herramientas de compilación utilizadas para compilar C ++ son lentas. Sin embargo, existen herramientas y formas más rápidas para mitigar las partes lentas del lenguaje.
Usarlos requiere un poco de grasa, pero los beneficios son innegables. Los tiempos de construcción más rápidos conducen a desarrolladores más felices, más agilidad y, finalmente, un mejor código.