En programación informática , un encabezado precompilado (PCH) es un archivo de encabezado ( C o C ++ ) que se compila en una forma intermedia que es más rápida de procesar para el compilador . El uso de encabezados precompilados puede reducir significativamente el tiempo de compilación , especialmente cuando se aplica a archivos de encabezado grandes, archivos de encabezado que incluyen muchos otros archivos de encabezado o archivos de encabezado que se incluyen en muchas unidades de traducción .
Razón fundamental
En los lenguajes de programación C y C ++ , un archivo de encabezado es un archivo cuyo texto puede ser incluido automáticamente en otro archivo fuente por el preprocesador C mediante el uso de una directiva de preprocesador en el archivo fuente.
Los archivos de encabezado a veces pueden contener cantidades muy grandes de código fuente (por ejemplo, los archivos de encabezado windows.h
y Cocoa/Cocoa.h
en Microsoft Windows y OS X , respectivamente). Esto es especialmente cierto con la llegada de grandes bibliotecas de "encabezados" que hacen un uso extensivo de plantillas , como la biblioteca matemática Eigen y las bibliotecas Boost C ++ . Están escritos casi en su totalidad como archivos de encabezado del usuario #include
, en lugar de estar vinculados en tiempo de ejecución. Por lo tanto, cada vez que el usuario compila su programa, el usuario esencialmente vuelve a compilar también numerosas bibliotecas de encabezados. (Estos se compilarían previamente en objetos compartidos o bibliotecas de vínculos dinámicos en bibliotecas que no son de "encabezado").
Para reducir los tiempos de compilación, algunos compiladores permiten que los archivos de encabezado se compilen en una forma que sea más rápida para que el compilador los procese. Esta forma intermedia se conoce como un encabezado precompilado y comúnmente se guarda en un archivo llamado con la extensión .pch o similar, como .gch bajo la Colección de compiladores GNU .
Uso
Por ejemplo, dado un archivo C ++ source.cpp que incluye header.hpp :
//header.hpp ...
//source.cpp #include "header.hpp"...
Al compilar source.cpp por primera vez con la función de encabezado precompilado activada, el compilador generará un encabezado precompilado, header.pch
. La próxima vez, si la marca de tiempo de este encabezado no cambió, el compilador puede omitir la fase de compilación relacionada con header.hpp
y, en su lugar, usar header.pch directamente.
Implementaciones comunes
Microsoft Visual C y C ++
Microsoft Visual C ++ (versión 6.0 y más reciente [ cita requerida ] ) puede precompilar cualquier código, no solo encabezados. [1] Puede hacer esto de dos maneras: precompilando todo el código hasta un archivo cuyo nombre coincida con la opción o (cuando se especifica sin ninguno ) precompilando todo el código hasta la primera aparición de en el código [2] [3] La salida precompilada se guarda en un archivo con el nombre dado a la opción, con una extensión, o en un archivo con el nombre proporcionado por la opción. [3] La opción, subordinada a la opción si se usa en conjunto, hace que el compilador haga uso del código ya precompilado de dicho archivo. [3]/Ycfilename
/Yc
filename
#pragma hdrstop
filename
/Yc
.pch
/Fpfilename
/Yu
/Yc
pch.h
(nombrado stdafx.h
antes de Visual Studio 2017 [4] ) es un archivo generado por el asistente de IDE de Microsoft Visual Studio , que describe tanto el sistema estándar como los archivos de inclusión específicos del proyecto que se utilizan con frecuencia pero que casi nunca cambian.
El afx en stdafx.h significa extensiones del marco de la aplicación . AFX era la abreviatura original de Microsoft Foundation Classes (MFC). Si bien el nombre stdafx.h se usaba de forma predeterminada en proyectos de MSVC antes de la versión 2017, cualquier nombre alternativo se puede especificar manualmente.
Los compiladores compatibles precompilarán este archivo para reducir el tiempo total de compilación. Visual C ++ no compilará nada antes que #include "pch.h"
en el archivo fuente, a menos que la opción de compilación no /Yu'pch.h'
esté marcada (por defecto); asume que todo el código en la fuente hasta e incluyendo esa línea ya está compilado.
GCC
Los encabezados precompilados son compatibles con GCC (3.4 y versiones posteriores). El enfoque de GCC es similar al de VC y compiladores compatibles. GCC guarda versiones precompiladas de archivos de encabezado usando un sufijo " .gch ". Al compilar un archivo fuente, el compilador verifica si este archivo está presente en el mismo directorio y lo usa si es posible.
GCC solo puede usar la versión precompilada si se establecen los mismos parámetros del compilador que cuando se compiló el encabezado y puede usar como máximo uno. Además, solo las instrucciones del preprocesador pueden colocarse antes del encabezado precompilado (porque debe incluirse directa o indirectamente a través de otro encabezado normal, antes de cualquier código compilable).
GCC identifica automáticamente la mayoría de los archivos de encabezado por su extensión. Sin embargo, si esto falla (por ejemplo, debido a extensiones de encabezado no estándar), se puede usar el modificador -x para garantizar que GCC trate el archivo como un encabezado.
sonido metálico
El compilador clang agregó soporte para PCH en Clang 2.5 / LLVM 2.5 de 2009. [5] El compilador tanto tokeniza el código fuente de entrada como realiza análisis sintácticos y semánticos de encabezados, escribiendo el árbol de sintaxis abstracta (AST) y símbolo tabla a un archivo de encabezado precompilado. [6]
El esquema de encabezado precompilado de clang, con algunas mejoras, como la capacidad de un encabezado precompilado para hacer referencia a otro encabezado precompilado utilizado internamente, también forma la base del mecanismo de sus módulos. [6] Utiliza el mismo formato de archivo de código de bits que emplea LLVM , encapsulado en secciones específicas de clang dentro de archivos de formato de archivo de objeto común o formato de enlace extensible . [6]
Constructor de C ++
En la configuración predeterminada del proyecto, el compilador C ++ Builder genera implícitamente encabezados precompilados para todos los encabezados incluidos por un módulo fuente hasta que #pragma hdrstop
se encuentra la línea . [7] : Si es posible, se comparten 76 encabezados precompilados para todos los módulos del proyecto. Por ejemplo, cuando se trabaja con la biblioteca de componentes visuales , es común incluir vcl.h
primero el encabezado que contiene la mayoría de los archivos de encabezado VCL de uso común. Por lo tanto, el encabezado precompilado se puede compartir entre todos los módulos del proyecto, lo que reduce drásticamente los tiempos de compilación.
Además, C ++ Builder puede instrumentarse para usar un archivo de encabezado específico como encabezado precompilado, similar al mecanismo proporcionado por Visual C ++.
C ++ Builder 2009 presenta un "Asistente de encabezado precompilado" que analiza todos los módulos de origen del proyecto en busca de archivos de encabezado incluidos, los clasifica (es decir, excluye los archivos de encabezado si son parte del proyecto o no tienen una protección de inclusión ) y genera y prueba automáticamente un encabezado precompilado para los archivos especificados.
Encabezado pretokenizado
Un encabezado pretokenizado (PTH) es un archivo de encabezado almacenado en un formulario que se ha ejecutado mediante análisis léxico , pero no se han realizado operaciones semánticas en él. PTH está presente en Clang antes de admitir PCH, y también se ha probado en una rama de GCC. [8]
En comparación con un mecanismo PCH completo, PTH tiene las ventajas de la independencia del idioma (y dialecto), ya que el análisis léxico es similar para los lenguajes de la familia C, y la independencia de la arquitectura, ya que se puede usar el mismo flujo de tokens al compilar para diferentes arquitecturas de destino. . [9] Sin embargo, tiene la desventaja de no ir más allá del simple análisis léxico, requiriendo que el análisis sintáctico y semántico del flujo de tokens se realice con cada compilación. Además, el tiempo de compilación se escala linealmente con el tamaño, en tokens léxicos, del archivo pretokenizado, que no es necesariamente el caso de un mecanismo de precompilación completo (PCH en clang permite el acceso aleatorio). [9]
El mecanismo de pretokenización de Clang incluye varios mecanismos menores para ayudar al preprocesador: almacenamiento en caché de la existencia de archivos y la información de la marca de fecha, y registros de protección de inclusión para que el código protegido se pueda omitir rápidamente. [9]
Ver también
- Unidad de compilación única
- Encabezado de prefijo
Referencias
- ^ "Creación de archivos de encabezado precompilados" . MSDN . Microsoft. 2015. Archivado desde el original el 28 de marzo de 2018 . Consultado el 28 de marzo de 2018 .
- ^ "Dos opciones para precompilar código" . MSDN . Microsoft. 2015 . Consultado el 28 de marzo de 2018 .
- ^ a b c "/ Yc (Crear archivo de encabezado precompilado)" . MSDN . Microsoft. 2015 . Consultado el 28 de marzo de 2018 .
- ^ "¿Puedo usar #include" pch.h "en lugar de #include" stdafx.h "como mi encabezado de precompilación en Visual Studio C ++?" . Desbordamiento de pila .
- ^ "Notas de la versión LLVM 2.5" . releases.llvm.org .
- ^ a b c El equipo de Clang (2018). "Internos de módulos y encabezados precompilados" . Documentación de Clang 7 . Consultado el 28 de marzo de 2018 .
- ^ Swart, Bob (2003). Borland C ++ Builder 6 Developer's Guide . Sams Publishing. ISBN 9780672324802.
- ^ "pph - Wiki de GCC" . gcc.gnu.org .
- ^ a b c El equipo de Clang (2018). "Encabezados pretokenizados (PTH)" . Documentación de Clang 7 . Archivado desde el original el 22 de marzo de 2018 . Consultado el 28 de marzo de 2018 .
enlaces externos
- El cuidado y la alimentación de los encabezados precompilados
- Encabezados precompilados con GCC
- Fractal eXtreme: encabezados precompilados