En ingeniería de software , una compilación unificada (también conocida como compilación unificada , compilación jumbo o compilación de blob ) es un método utilizado en el desarrollo de software en C y C++ para acelerar la compilación de proyectos mediante la combinación de múltiples unidades de traducción en una sola, lo que generalmente se logra utilizando directivas include para agrupar varios archivos fuente en un archivo más grande.
Implementación
Si dos unidades de traducción diferentes ArchivoA.cpp :
#incluir "Header.hpp"// contenido del archivo fuente A ...y FileB.cpp :
#incluir "Header.hpp"// contenido del archivo fuente B ...En el mismo proyecto, ambos incluyen el encabezado Header.hpp ; ese encabezado será procesado dos veces por la cadena del compilador, una vez por cada tarea de compilación. Si las dos unidades de traducción se fusionan en un único archivo fuente JumboFile.cpp :
#incluir "ArchivoA.cpp" #incluir "ArchivoB.cpp"entonces Header.hpp se procesará solo una vez (gracias a los protectores de inclusión ) al compilar JumboFile.cpp . [ 1 ]
Efectos
La principal ventaja de las compilaciones unitarias es la reducción del esfuerzo duplicado en el análisis y la compilación del contenido de los encabezados que se incluyen en más de un archivo fuente. El contenido de los encabezados suele representar la mayor parte del código en un archivo fuente después del preprocesamiento . Las compilaciones unitarias también mitigan la sobrecarga causada por tener una gran cantidad de archivos fuente pequeños al reducir la cantidad de archivos objeto creados y procesados por la cadena de compilación, y permiten el análisis y la optimización interprocedimentales en todos los archivos que forman la tarea de compilación unitaria (similar a los efectos de la optimización en tiempo de enlace ). También facilitan la detección de violaciones de la regla de una sola definición , ya que si un símbolo se define dos veces en diferentes archivos fuente en la misma compilación unitaria, el compilador podrá identificar la redefinición y emitir una advertencia o un error.
Una de las desventajas de las compilaciones unitarias es un mayor consumo de memoria debido a las unidades de traducción más grandes. Estas unidades también pueden afectar negativamente a las compilaciones paralelas, ya que, por lo general, es más difícil o imposible programar un número reducido de tareas de compilación grandes para saturar eficazmente todos los recursos de computación paralela disponibles . Las compilaciones unitarias también pueden anular parte de las ventajas de las compilaciones incrementales, que se basan en reconstruir la menor cantidad de código posible, es decir, solo las unidades de traducción afectadas por los cambios desde la última compilación. Estas desventajas se pueden compensar con un gran aumento en la velocidad de la etapa de enlace de la aplicación, que ya no tiene que cargar y eliminar bloques duplicados de generación de código de plantilla en cada unidad de traducción. El uso de memoria de la etapa de enlace también disminuirá.
Las compilaciones unitarias también pueden tener efectos peligrosos en la semántica de los programas. Algunas construcciones válidas de C++ que dependen del enlace interno pueden fallar en una compilación unitaria; por ejemplo, conflictos entre símbolos estáticos y símbolos definidos en espacios de nombres anónimos con el mismo identificador en diferentes archivos. Si diferentes archivos C++ definen diferentes funciones con el mismo nombre, el compilador puede resolver inesperadamente la sobrecarga seleccionando la función incorrecta, algo que no era posible al diseñar el software con los archivos como diferentes unidades de traducción. Otro efecto adverso es la posible fuga de definiciones de macros entre diferentes archivos fuente. [ 2 ]
Compilación de soporte del sistema
Algunos sistemas de compilación proporcionan soporte integrado para compilaciones automatizadas de Unity, incluidos Visual Studio , [ 3 ] Meson , [ 4 ] CMake . [ 5 ] y xmake.
Referencias
- ↑ Kubota et al. (2019)
- ↑ Kirilov, Viktor (7 de julio de 2018). "Una guía para compilaciones de Unity" . Archivado del original el 12 de noviembre de 2020.
- ↑ Olga Arkhipova (2 de julio de 2018). "Compatibilidad con archivos Unity (Jumbo) en Visual Studio 2017 15.8 (Experimental)" . Microsoft.
- ↑ "Unity compila" .
- ↑ "UNITY_BUILD - Documentación de CMake 3.17.0" .
- Kubota, Takafumi; Yusuke, Suzuki; y Kenji Kono (2019). Unificar o no unificar: un estudio de caso sobre compilaciones unificadas (en WebKit) . Actas de la 28.ª Conferencia Internacional sobre Construcción de Compiladores. doi : 10.1145/3302516.3307347 .
- Automatización de compilaciones
- compiladores de C++
- Familia de lenguajes de programación C++
- Software programado en C++