미리 컴파일된 헤더
Precompiled header컴퓨터 프로그래밍에서 사전 컴파일된 헤더(PCH)는 컴파일러를 위해 처리 속도가 더 빠른 중간 형태로 컴파일되는 (C 또는 C++) 헤더 파일이다.사전 컴파일된 헤더를 사용하면 특히 큰 헤더 파일, 다른 헤더 파일을 많이 포함하는 헤더 파일 또는 많은 변환 단위에 포함된 헤더 파일에 적용할 때 컴파일 시간이 크게 단축될 수 있다.
이론적 근거
C 및 C++ 프로그래밍 언어에서 헤더 파일은 소스 파일에서 전처리기 지시어를 사용하여 C 전처리기자에 의해 다른 소스 파일에 텍스트가 자동으로 포함될 수 있는 파일이다.
헤더 파일에는 때때로 매우 많은 양의 소스 코드(예: 헤더 파일)가 포함될 수 있음windows.h그리고Cocoa/Cocoa.h마이크로소프트 윈도우즈 및 OS X에 각각 적용됨.이는 특히 아이겐 수학 라이브러리나 부스트 C++ 라이브러리처럼 템플릿을 광범위하게 사용하는 대형 "헤더" 라이브러리의 출현과 함께 더욱 그러하다.그것들은 거의 전적으로 사용자의 헤더 파일로 쓰여진다.#includes, 런타임에 연결되기 보다는.따라서 사용자가 프로그램을 컴파일할 때마다 사용자는 기본적으로 수많은 헤더 라이브러리를 다시 컴파일하고 있다. (이러한 헤더 라이브러리는 "헤더"가 아닌 라이브러리의 공유 개체 또는 동적 링크 라이브러리로 미리 컴파일될 것이다.)
컴파일 시간을 줄이기 위해 일부 컴파일러는 헤더 파일을 컴파일러가 더 빨리 처리할 수 있는 형태로 컴파일할 수 있다.이 중간 형식은 사전 컴파일된 헤더로 알려져 있으며, 일반적으로 확장명으로 명명된 파일에 보관된다..pch다음과 같은 유사함.gchGNU 컴파일러 컬렉션 아래에.
사용법
예를 들어 C++ 파일이 지정된 경우source.cpp을 포함한header.hpp:
//message.hpp ... //source.cpp #include "reason.hpp" ... 컴파일할 때source.cpp사전 컴파일된 헤더 기능을 처음으로 켠 상태에서 컴파일러는 사전 컴파일된 헤더를 생성하며,header.pch. 다음에 이 헤더의 타임스탬프가 변경되지 않은 경우 컴파일러는 다음과 관련된 컴파일 단계를 건너뛸 수 있다.header.hpp대신 사용header.pch단도직접의
공통 구현
Microsoft Visual C 및 C++
Microsoft Visual C++(버전 6.0 이상[citation needed])는 헤더뿐만 아니라 모든 코드를 사전 컴파일할 수 있다.[1]이것은 두 가지 방법으로 할 수 있다: 모든 코드를 이름과 일치하는 파일로 미리 컴파일하는 것./Ycfilename옵션 또는 (이 경우)/Yc아무 것도 없이 지정filename) 첫 번째 발생 시까지 모든 코드 사전 컴파일#pragma hdrstop코드에서[2][3] 사전 컴파일된 출력은 다음 이름을 딴 파일에 저장된다.filename에게 주어진/Yc옵션, 포함).pch확장명 또는 에서 제공한 이름에 따라 명명된 파일/Fpfilename옵션의[3]그/Yu옵션, 에 종속된/Yc옵션을 함께 사용하면 컴파일러가 이미 사전 컴파일된 코드를 사용할 수 있다.[3]
pch.h(이름)stdafx.h Visual Studio 2017[4] 이전)은 Microsoft Visual Studio에서 생성한 파일이다.IDEwizard는 표준 시스템과 프로젝트별 파일 모두를 기술하며 자주 사용되지만 거의 변경되지 않는 파일을 포함한다.
stdafx.h의 afx는 애플리케이션 프레임워크 확장을 의미한다.AFX는 마이크로소프트 파운데이션 클래스(MFC)의 원래 약어였다.stdafx.h라는 이름은 버전 2017 이전의 MSVC 프로젝트에서 기본적으로 사용되었지만, 모든 대체 이름은 수동으로 지정할 수 있다.
호환 컴파일러는 전체 컴파일 시간을 줄이기 위해 이 파일을 미리 컴파일할 것이다.Visual C++는 다음보다 먼저 컴파일되지 않음#include "pch.h"컴파일 옵션이 아닌 경우 원본 파일에서/Yu'pch.h'선택되지 않음(기본적으로); 이 행을 포함한 소스의 모든 코드가 이미 컴파일된 것으로 가정한다.
GCC
사전 컴파일된 헤더는 GCC(3.4 이상)에서 지원된다.GCC의 접근방식은 VC와 호환 컴파일러의 접근방식과 유사하다.GCC는 "을(를) 사용하여 미리 컴파일된 버전의 헤더 파일을 저장한다..gch" 접미사.소스 파일을 컴파일러는 이 파일이 동일한 디렉토리에 있는지 확인하고 가능하면 사용한다.
GCC는 헤더가 컴파일되었을 때와 동일한 컴파일러 스위치가 설정되어 있고 최대 한 개만 사용할 수 있는 경우에만 사전 컴파일된 버전을 사용할 수 있다.또한 사전 컴파일된 헤더 앞에 전처리기 지침만 배치할 수 있다(왜냐하면 컴파일 가능한 코드 앞에 다른 일반 헤더를 통해 직간접적으로 포함되어야 하기 때문이다).
GCC는 대부분의 헤더 파일을 확장명으로 자동 식별한다.단, (예를 들어, 비표준 헤더 확장 때문에) 이 실패하는 경우-x스위치를 사용하여 GCC가 파일을 헤더로 취급하는지 확인할 수 있다.
쨍그랑 소리를 내다
clang 컴파일러는 2009년 clang 2.5 / LLVM 2.5에서 PCH에 대한 지원을 추가했다.[5]컴파일러는 모두 입력 소스 코드를 토큰화하고 헤더에 대한 통사적 및 의미 분석을 수행하여 컴파일러의 내부에서 생성된 추상 구문 트리(AST)와 기호 테이블을 사전 컴파일된 헤더 파일에 작성한다.[6]
clang의 사전 컴파일된 헤더 체계와 함께, 하나의 사전 컴파일된 헤더가 내부적으로 사용되고 사전 컴파일된 헤더를 참조할 수 있는 기능과 같은 일부 개선사항도 그것의 모듈 메커니즘의 기초를 형성한다.[6]LLVM이 채택한 것과 동일한 비트코드 파일 형식을 사용하며, Common Object File Format 또는 Extensible Linking Format 파일의 clang별 섹션으로 캡슐화한다.[6]
C++빌더
기본 프로젝트 구성에서 C++Builder 컴파일러는 선까지 소스 모듈에 포함된 모든 헤더에 대해 사전 컴파일된 헤더를 암시적으로 생성함#pragma hdrstop발견되다.[7]: 76 가능한 경우 사전 컴파일된 헤더는 프로젝트의 모든 모듈에 대해 공유된다.예를 들어, Visual Component Library와 함께 작업할 때, 다음 항목을 포함하는 것이 일반적이다.vcl.h일반적으로 사용되는 대부분의 VCL 헤더 파일을 포함하는 헤더 먼저따라서 사전 컴파일된 헤더를 모든 프로젝트 모듈에서 공유할 수 있어 빌드 시간을 획기적으로 단축할 수 있다.
또한 C++Builder는 Visual C++에서 제공하는 메커니즘과 유사하게 특정 헤더 파일을 사전 컴파일된 헤더로 사용하도록 계측할 수 있다.
C++Builder 2009는 포함된 헤더 파일에 대해 프로젝트의 모든 소스 모듈을 구문 분석하여 분류하고(즉, 헤더 파일이 프로젝트의 일부이거나 포함 가드가 없는 경우 제외) 지정된 파일에 대해 사전 컴파일된 헤더를 자동으로 생성하고 테스트하는 "사전 컴파일된 헤더 마법사"를 도입한다.
사전 토큰화된 헤더
사전 토큰화된 헤더(PST)는 어휘 분석을 통해 실행된 형태로 저장된 헤더 파일이지만, 의미론적 연산은 이루어지지 않았다.PTH는 PCH를 지원하기 전에 클랑에 존재하며, GCC의 한 분과에서도 시도되었다.[8]
완전한 PCH 메커니즘과 비교했을 때, PTH는 서로 다른 대상 아키텍처에 대해 컴파일할 때 동일한 토큰 스트림을 사용할 수 있기 때문에 어휘 분석이 C-패밀리 언어에 유사하므로 언어(및 방언) 독립성과 아키텍처 독립성의 장점을 가지고 있다.[9]그러나 토큰 스트림의 통사적 및 의미적 분석을 모든 컴파일에서 수행하도록 요구하면서 단순한 어휘적 분석보다 더 이상 진행하지 않는다는 단점이 있다.또한 사전 컴파일된 파일의 크기, 사전 컴파일된 파일의 크기에 따라 선형적으로 스케일링을 컴파일하는 시간. 이는 완전히 준비된 사전 컴파일 메커니즘(NCH in cang)의 경우 반드시 그렇지는 않다.[9]
클랑의 프리토큰화 메커니즘은 사전 프로세서를 보조하기 위한 몇 가지 사소한 메커니즘, 즉 파일 존재와 데이터 스탬프 정보의 캐싱과 보호 코드를 빠르게 건너뛸 수 있도록 포함 가드를 기록하는 것을 포함한다.[9]
참고 항목
참조
- ^ "Creating Precompiled Header Files". MSDN. Microsoft. 2015. Archived from the original on 2018-03-28. Retrieved 2018-03-28.
- ^ "Two Choices for Precompiling Code". MSDN. Microsoft. 2015. Retrieved 2018-03-28.
- ^ a b c "/Yc (Create Precompiled Header File)". MSDN. Microsoft. 2015. Retrieved 2018-03-28.
- ^ "Can I use #include "pch.h" instead of #include "stdafx.h" as my precompile header in Visual Studio C++?". Stack Overflow.
- ^ "LLVM 2.5 Release Notes". releases.llvm.org.
- ^ a b c The Clang Team (2018). "Precompiled Header and Modules Internals". Clang 7 documentation. Retrieved 2018-03-28.
- ^ Swart, Bob (2003). Borland C++ Builder 6 Developer's Guide. Sams Publishing. ISBN 9780672324802.
- ^ "pph - GCC Wiki". gcc.gnu.org.
- ^ a b c The Clang Team (2018). "Pretokenized Headers (PTH)". Clang 7 documentation. Archived from the original on 2018-03-22. Retrieved 2018-03-28.
