Antete precompilate

Anteturi precompilate ( eng.  anteturi precompilate ) - în mediile de programare în C și C++  - o modalitate de a accelera compilarea programelor prin preprocesarea așa-numitelor fișiere de antet care conțin interfețe de module și, conform normelor acestora limbajele de programare, sunt conectate la program prin inserarea directă a textelor lor în corpul programului principal folosind o directivă specială de preprocesor #include . Antetele precompilate sunt salvate pe disc ca fișiere în formatul intern al compilatorului, iar atunci când proiectul este recompilat, timpul de procesare și conectare a acestora este redus semnificativ.

Fundal

Limbajul de programare C a folosit fișiere antet pentru a conecta un modul extern . Acest lucru simplifică compilatorul și oferă o oarecare flexibilitate - și a funcționat timp de 20 de ani, atâta timp cât anteturile erau mici și fișierele din proiect erau puține. Odată cu extinderea proiectelor software, timpul de compilare a început să crească pătratic [1]  - atât numărul de unități de compilare, cât și numărul de anteturi conectate la fiecare unitate specifică cresc. În proiectele deosebit de mari, o recompilare completă durează zeci de minute și este mai des efectuată în timpul unei build nocturne decât la locurile de muncă ale programatorilor.

În plus, limbajul de programare C aparține familiei LR(1) și, prin urmare, compilatoarele C sunt mai lente, de exemplu, Pascal (care este LL(1) ) .

Pentru a reduce timpul de compilare, au fost dezvoltate antete precompilate. Deoarece fișierele antet se schimbă mult mai rar decât fișierele care conțin codul programului (și fișierele de bibliotecă aproape niciodată), s-a dovedit a fi un instrument de optimizare rezonabil pentru a preprocesa antetele și a le converti în fișiere de tip special care pot fi incluse la compilarea unui program, ocolind primele etape de compilare. Datorită precompilării antetelor, doar părțile modificate ale programului sunt procesate complet de compilator. Cu toate acestea, precompilarea antetului nu ajută întotdeauna:

  1. Schimbarea oricăruia dintre anteturile precompilate recompilează întregul set.
  2. Cu o recompilare completă, câștigul de timp se obține atunci când același set este utilizat în cel puțin două unități de compilare.

Prin urmare, de regulă, în setul precompilat sunt incluse tot felul de anteturi de bibliotecă, mari și în același timp rareori în schimbare.

Implementări

Embarcadero C++ Builder

Tot ceea ce vine înaintea directivei este precompilat #pragma hdrstop.

// main.cpp ///// Anteturi precompilate // C++ # include <cstdio> // STL # include <șir> # include <vector> # include <harta> # include <algoritm> // Specific OS # include <windows.h> ///// Precompilarea se termină aici # pragma hdrstop ///// Alte antete # includ „unit1.h” int main () { doUnit1 (); returnează 0 ; }

GCC

La compilarea hfișierelor -, GCC presupune automat că este necesar un antet precompilat (sau poate fi specificat prin linia de comandă, switch -x). Majoritatea shell-urilor de programare (cum ar fi Code::Blocks ) vă permit să specificați ce fișiere să precompilați. Soluția standard este să „dump” cele mai utilizate, dar rareori schimbarea antetelor într-un singur hfișier și includerea lui foarte întâi.

// pch.h - precompilați-l (setat în makefile sau proiect). // C++ # include <cstdio> # include <cmath> // STL # include <șir> # include <vector> # include <harta> # include <algoritm> // Specific OS # include <windows.h> // unit1.cpp // precompilat mai întâi! # include „pch.h” // alte anteturi # includ „unit1.h” void doUnit1 () { } // main.cpp // precompilat mai întâi! # include „pch.h” // alte anteturi # includ „unit1.h” int main () { doUnit1 (); returnează 0 ; }

Microsoft Visual C++

Situația este similară cu GCC. Visual C++ versiunea 6.0 și o versiune ulterioară precompilează antetul cu numele standard - stdafx.h(acest nume poate fi schimbat cu o opțiune de compilator).

Expertul pentru proiect nou al IDE vă permite să alegeți dacă să utilizați anteturi precompilate. Folosirea acestora va adăuga automat opțiunea de compilare /Yu'stdafx.h', iar compilarea oricărui fișier care nu conține va eșua cu o eroare. #include "stdafx.h"

Note

  1. Design software C++ la scară largă Arhivat 14 decembrie 2014 la Wayback Machine John Lakos, 1996, p. 334 „...reduceți costul compilării prin eliminarea comportamentului pătratic pe care l-am observat în timpul petrecut de preprocesorul C++”.

Link -uri