Antet precompilat - Precompiled header

În programarea computerului , un antet precompilat (PCH) este un fișier de antet ( C sau C ++ ) care este compilat într-o formă intermediară care este mai rapid de procesat pentru compilator . Utilizarea antetelor precompilate poate reduce semnificativ timpul de compilare , mai ales atunci când este aplicat fișierelor antet mari, fișierelor antet care includ multe alte fișiere antet sau fișierelor antet care sunt incluse în multe unități de traducere .

Justificare

În limbajele de programare C și C ++ , un fișier antet este un fișier al cărui text poate fi inclus automat într-un alt fișier sursă de către preprocesorul C prin utilizarea unei directive de preprocesare în fișierul sursă.

Fișierele antet pot conține uneori cantități foarte mari de cod sursă (de exemplu, fișierele header windows.hși Cocoa/Cocoa.hon Microsoft Windows și OS X , respectiv). Acest lucru este valabil mai ales cu apariția bibliotecilor mari „antet” care utilizează pe scară largă șabloanele , cum ar fi biblioteca matematică Eigen și bibliotecile Boost C ++ . Acestea sunt scrise aproape în întregime ca fișiere antet pe care le utilizează utilizatorii #include, mai degrabă decât să fie conectate la runtime. Astfel, de fiecare dată când utilizatorul își compilează programul, utilizatorul recompilează, de asemenea, numeroase biblioteci de antet. (Acestea ar fi precompilate în obiecte partajate sau biblioteci de legături dinamice în biblioteci care nu sunt „antet”.)

Pentru a reduce timpul de compilare, unii compilatori permit compilarea fișierelor antet într-un formular care este mai rapid pentru procesarea compilatorului. Această formă intermediară este cunoscută sub numele de antet precompilat și este de obicei păstrată într-un fișier numit cu extensia .pchsau similar, cum ar fi .gchîn colecția GNU Compiler .

Utilizare

De exemplu, dat un fișier C ++ source.cppcare include header.hpp:

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

Când compilați source.cpppentru prima dată cu caracteristica antet precompilată activată, compilatorul va genera un antet precompilat header.pch,. Data viitoare, dacă marca temporală a acestui antet nu s-a schimbat, compilatorul poate sări peste faza de compilare referitoare la header.hppși în schimb să o folosească header.pchdirect.

Implementări comune

Microsoft Visual C și C ++

Microsoft Visual C ++ (versiunea 6.0 și mai recentă) poate precompila orice cod, nu doar anteturi. Poate face acest lucru în două moduri: fie precompilarea întregului cod până la un fișier al cărui nume se potrivește cu opțiunea sau (când este specificat fără niciunul ) precompilarea tuturor codurilor până la prima apariție a codului Ieșirea precompilată este salvată într-un fișier numit după opțiunea dată , cu o extensie sau într-un fișier denumit în funcție de numele furnizat de opțiune. Opțiunea, subordonată opțiunea dacă este utilizat împreună, determină compilatorul să facă uz de cod deja precompilate de la un astfel de dosar. /Ycfilename/Ycfilename#pragma hdrstopfilename/Yc.pch/Fpfilename/Yu/Yc

pch.h(denumit stdafx.hînainte de Visual Studio 2017) este un fișier generat de vrăjitorul Microsoft Visual Studio IDE , care descrie atât fișierele standard, cât și cele specifice proiectului , care sunt folosite frecvent, dar care nu se schimbă niciodată.

AFX în stdafx.h reprezintă extensii cadru de aplicare . AFX a fost abrevierea originală pentru Microsoft Foundation Classes (MFC). În timp ce numele stdafx.h a fost utilizat în mod implicit în proiectele MSVC înainte de versiunea 2017, orice nume alternativ poate fi specificat manual.

Compilatoarele compatibile vor precompila acest fișier pentru a reduce timpul total de compilare. Visual C ++ nu va compila nimic înainte de #include "pch.h"în fișierul sursă, cu excepția cazului în care opțiunea de compilare /Yu'pch.h'nu este bifată (implicit); presupune că tot codul din sursă până la inclusiv linia respectivă este deja compilat.

GCC

Anteturile precompilate sunt acceptate în GCC (3.4 și mai noi). Abordarea GCC este similară cu cea a VC și a compilatoarelor compatibile. GCC salvează versiunile precompilate ale fișierelor antet folosind un .gchsufix. La compilarea unui fișier sursă, compilatorul verifică dacă acest fișier este prezent în același director și îl folosește dacă este posibil.

GCC poate utiliza versiunea precompilată numai dacă sunt setate aceleași comutatoare de compilare ca atunci când antetul a fost compilat și poate utiliza cel mult unul. În plus, numai instrucțiunile preprocesorului pot fi plasate înaintea antetului precompilat (deoarece trebuie inclus direct sau indirect printr-un alt antet normal, înainte de orice cod compilabil).

GCC identifică automat majoritatea fișierelor antet după extensia lor. Cu toate acestea, dacă acest lucru eșuează (de exemplu din cauza extensiilor de antet non-standard), -xcomutatorul poate fi utilizat pentru a se asigura că GCC tratează fișierul ca un antet.

zăngăni

Zăngăni compilator adăugat suport pentru PCH în zăngănit 2.5 / LLVM 2.5 din 2009. Compilatorul ambele tokenizes la intrare de cod sursă și efectuează analizele sintactice și semantice antete, scriind generat compilatorului intern arbore de sintaxă abstractă (AST) și tabela de simboluri la o fișier antet precompilat.

Schema de antet precompilat clang, cu unele îmbunătățiri, cum ar fi capacitatea unui antet precompilat de a face referire la altul, antet precompilat utilizat intern, formează, de asemenea, baza mecanismului modulelor sale. Folosește același format de fișier cod de biți folosit de LLVM , încapsulat în secțiuni specifice clangului în fișierele Common Object File Format sau Extensible Linking Format .

C ++ Builder

În configurația implicită a proiectului, compilatorul C ++ Builder generează implicit anteturi precompilate pentru toate antetele incluse de un modul sursă până când linia #pragma hdrstopeste găsită. Anteturile precompilate sunt partajate pentru toate modulele proiectului, dacă este posibil. De exemplu, atunci când lucrați cu Biblioteca de componente vizuale , este obișnuit să includeți mai vcl.hîntâi antetul care conține majoritatea fișierelor antet VCL utilizate în mod obișnuit. Astfel, antetul precompilat poate fi partajat între toate modulele proiectului, ceea ce reduce dramatic timpul de construire.

În plus, C ++ Builder poate fi instrumentat pentru a utiliza un fișier de antet specific ca antet precompilat, similar mecanismului furnizat de Visual C ++.

C ++ Builder 2009 introduce un „Vrăjitor de antet precompilat” care analizează toate modulele sursă ale proiectului pentru fișierele de antet incluse, le clasifică (adică exclude fișierele de antet dacă fac parte din proiect sau nu au un pachet de includere ) și generează și testează automat un antet precompilat pentru fișierele specificate.

Antet pretokenizat

Un antet pretokenizat (PTH) este un fișier de antet stocat într-o formă care a fost rulată prin analiză lexicală , dar nu s-au efectuat operații semantice pe acesta. PTH este prezent în Clang înainte de a suporta PCH și a fost încercat și într-o ramură a GCC.

În comparație cu un mecanism PCH complet, PTH are avantajele independenței de limbă (și dialect), deoarece analiza lexicală este similară pentru limbile familiei C și independența arhitecturii, deoarece același flux de jetoane poate fi utilizat atunci când se compilează pentru diferite arhitecturi țintă. . Cu toate acestea, are dezavantajul de a nu merge mai departe decât simpla analiză lexicală, necesitând ca analiza sintactică și semantică a fluxului de jetoane să fie efectuată cu fiecare compilație. În plus, timpul pentru a compila scalarea liniar cu mărimea, în jetoane lexicale, a fișierului pretokenizat, ceea ce nu este neapărat cazul unui mecanism complet de precompilare (PCH în clang permite accesul aleatoriu).

Mecanismul de pretokenizare al lui Clang include mai multe mecanisme minore pentru asistarea pre-procesorului: stocarea în cache a informațiilor privind existența fișierului și a mărcii de date și înregistrarea gărzilor de includere, astfel încât codul păzit să poată fi trecut rapid peste.

Vezi si

Referințe

linkuri externe