Prekompilowany nagłówek — Precompiled header

W programowania , A prekompilowany nagłówka (PCH) oznacza grupę ( C lub C ++ ) Plik nagłówka , która przedstawia w postaci kształtki pośredniej , która jest szybciej sposobu kompilatora . Użycie prekompilowanych nagłówków może znacznie skrócić czas kompilacji , szczególnie w przypadku zastosowania do dużych plików nagłówkowych, plików nagłówkowych zawierających wiele innych plików nagłówkowych lub plików nagłówkowych zawartych w wielu jednostkach tłumaczeniowych .

Racjonalne uzasadnienie

W C i ++ C języków programowania , A nagłówek pliku jest plik, którego tekst może być automatycznie uwzględniane w innym pliku źródłowego przez C preprocesora przy użyciu dyrektywy preprocesora w pliku źródłowym.

Pliki nagłówkowe mogą czasami zawierać bardzo duże ilości kodu źródłowego (na przykład pliki nagłówkowe windows.horaz odpowiednio Cocoa/Cocoa.hw systemie Microsoft Windows i OS X ). Jest to szczególnie widoczne w przypadku pojawienia się dużych bibliotek „nagłówkowych”, które intensywnie korzystają z szablonów , takich jak biblioteka matematyczna Eigen i biblioteki Boost C++ . Są one zapisywane prawie w całości jako pliki nagłówkowe użytkownika #include, a nie są łączone w czasie wykonywania. Tak więc za każdym razem, gdy użytkownik kompiluje swój program, zasadniczo rekompiluje również liczne biblioteki nagłówkowe. (Byłyby one prekompilowane do obiektów współdzielonych lub bibliotek dołączanych dynamicznie w bibliotekach innych niż „nagłówkowe”).

Aby skrócić czas kompilacji, niektóre kompilatory umożliwiają kompilowanie plików nagłówkowych do postaci, która jest szybsza do przetworzenia przez kompilator. Ta forma pośrednia jest znana jako prekompilowany nagłówek i jest powszechnie przechowywana w pliku o nazwie z rozszerzeniem .pchlub podobnym, na przykład .gchw GNU Compiler Collection .

Stosowanie

Na przykład, biorąc pod uwagę plik C++, source.cppktóry zawiera header.hpp:

//header.hpp
...
//source.cpp
#include "header.hpp"
...

Podczas kompilacji source.cpppo raz pierwszy z włączoną funkcją prekompilowanego nagłówka kompilator wygeneruje prekompilowany nagłówek header.pch. Następnym razem, jeśli znacznik czasu tego nagłówka nie uległ zmianie, kompilator może pominąć fazę kompilacji dotyczącą header.hppi zamiast tego użyć header.pchbezpośrednio.

Wspólne wdrożenia

Microsoft Visual C i C++

Microsoft Visual C++ (wersja 6.0 i nowsze) może prekompilować dowolny kod, nie tylko nagłówki. Może to zrobić na dwa sposoby: wstępnie kompilując cały kod do pliku o nazwie zgodnej z opcją lub (gdy podano bez żadnego ) wstępnie kompilując cały kod aż do pierwszego wystąpienia w kodzie Wstępnie skompilowane dane wyjściowe są zapisywane w pliku o nazwie po danym opcji, z rozszerzeniem, lub w pliku o nazwie zgodnej z nazwą podaną przez opcję. Opcja, podporządkowane opcją jeśli używane razem powoduje, że kompilator do wykorzystania kodu już wstępnie skompilowana z takiego pliku. /Ycfilename/Ycfilename#pragma hdrstopfilename/Yc.pch/Fpfilename/Yu/Yc

pch.h(nazwany stdafx.hprzed Visual Studio 2017) to plik wygenerowany przez kreatora Microsoft Visual Studio IDE , który opisuje zarówno standardowe pliki systemowe, jak i specyficzne dla projektu , które są często używane, ale prawie nigdy się nie zmieniają.

Afx w stdafx.h oznacza rozszerzeń Application Framework . AFX był oryginalnym skrótem Microsoft Foundation Classes (MFC). Chociaż nazwa stdafx.h była domyślnie używana w projektach MSVC przed wersją 2017, dowolną alternatywną nazwę można określić ręcznie.

Zgodne kompilatory prekompilują ten plik, aby skrócić całkowity czas kompilacji. Visual C++ nie skompiluje niczego przed #include "pch.h"w pliku źródłowym, chyba że opcja kompilacji /Yu'pch.h'jest odznaczona (domyślnie); zakłada, że ​​cały kod w źródle do tego wiersza włącznie jest już skompilowany.

GCC

Prekompilowane nagłówki są obsługiwane w GCC (3.4 i nowsze). Podejście GCC jest podobne do podejścia VC i kompatybilnych kompilatorów. GCC zapisuje prekompilowane wersje plików nagłówkowych przy użyciu .gchsufiksu „ ”. Podczas kompilowania pliku źródłowego kompilator sprawdza, czy ten plik znajduje się w tym samym katalogu i używa go, jeśli to możliwe.

GCC może używać wersji prekompilowanej tylko wtedy, gdy ustawione są te same przełączniki kompilatora, co podczas kompilacji nagłówka i może używać co najwyżej jednego. Co więcej, tylko instrukcje preprocesora mogą być umieszczane przed prekompilowanym nagłówkiem (ponieważ musi on być bezpośrednio lub pośrednio zawarty w innym normalnym nagłówku, przed jakimkolwiek kompilowalnym kodem).

GCC automatycznie identyfikuje większość plików nagłówkowych według ich rozszerzenia. Jednakże, jeśli to się nie powiedzie (np. z powodu niestandardowych rozszerzeń nagłówka), -xprzełącznik może być użyty do zapewnienia, że ​​GCC traktuje plik jako nagłówek.

szczęk

Dzyń kompilator dodano wsparcie dla PCH w Clang 2.5 / LLVM 2.5 2009. Kompilator zarówno tokenizes kodu źródłowego wejściowy i wykonuje składniowe i semantyczne analizy nagłówków, wypisywanie wewnętrznego kompilator wygenerował drzewo składni abstrakcyjne (AST) i tablicę symboli do A prekompilowany plik nagłówkowy.

Schemat prekompilowanych nagłówków clang, z pewnymi ulepszeniami, takimi jak zdolność jednego prekompilowanego nagłówka do odwoływania się do innego, używanego wewnętrznie, prekompilowanego nagłówka, również stanowi podstawę mechanizmu jego modułów. Używa tego samego formatu pliku kodu bitowego , który jest używany przez LLVM , zamkniętego w sekcjach specyficznych dla klangu w plikach Common Object File Format lub Extensible Linking Format .

C++Builder

W domyślnej konfiguracji projektu kompilator C++Builder niejawnie generuje prekompilowane nagłówki dla wszystkich nagłówków zawartych przez moduł źródłowy do momentu #pragma hdrstopznalezienia wiersza . Jeśli to możliwe, prekompilowane nagłówki są współdzielone dla wszystkich modułów projektu. Na przykład podczas pracy z Biblioteką komponentów wizualnych często dołącza się vcl.hnajpierw nagłówek, który zawiera większość powszechnie używanych plików nagłówkowych VCL. W ten sposób prekompilowany nagłówek może być współużytkowany we wszystkich modułach projektu, co znacznie skraca czas kompilacji.

Ponadto C++Builder można zinstrumentować, aby używać określonego pliku nagłówkowego jako prekompilowanego nagłówka, podobnego do mechanizmu zapewnianego przez Visual C++.

C++Builder 2009 wprowadza "Kreatora prekompilowanych nagłówków", który analizuje wszystkie moduły źródłowe projektu pod kątem dołączonych plików nagłówkowych, klasyfikuje je (tj. wyklucza pliki nagłówkowe, jeśli są częścią projektu lub nie mają zabezpieczenia Include ) oraz generuje i automatycznie testuje prekompilowany nagłówek dla określonych plików.

Pretokenizowany nagłówek

Pretokenized header (PTH) jest nagłówek pliku przechowywane w formie, która została prowadzonym przez analizy leksykalnej , ale żadne operacje semantyczne zostały wykonane na nim. PTH jest obecny w Clang, zanim obsługiwał PCH, a także został wypróbowany w oddziale GCC.

W porównaniu z pełnym mechanizmem PCH, PTH ma zalety niezależności języka (i dialektu), ponieważ analiza leksykalna jest podobna dla języków z rodziny C, oraz niezależności architektury, ponieważ ten sam strumień tokenów może być użyty podczas kompilacji dla różnych architektur docelowych . Ma jednak tę wadę, że nie idzie dalej niż prosta analiza leksykalna, wymagając, aby analiza składniowa i semantyczna strumienia tokenów była wykonywana przy każdej kompilacji. Ponadto czas na kompilację skalowania liniowego z rozmiarem, w leksykalnych tokenach, pliku pretokenizowanego, co niekoniecznie ma miejsce w przypadku w pełni rozwiniętego mechanizmu prekompilacji (PCH w clang umożliwia dostęp losowy).

Mechanizm pretokenizacji Clang zawiera kilka pomniejszych mechanizmów wspomagających preprocesor: buforowanie informacji o istnieniu plików i znaczników daty oraz rejestrowanie ochrony włączenia, aby można było szybko pominąć chroniony kod.

Zobacz też

Bibliografia

Linki zewnętrzne