Esikäännetyt otsikot

Esikäännetyt otsikot ( eng.  pre-compiled headers ) - ohjelmointiympäristöissä C ja C ++  - tapa nopeuttaa ohjelmien kääntämistä esiprosessoimalla ns header-tiedostot , jotka sisältävät moduulirajapintoja ja näiden normien mukaisesti ohjelmointikielet, yhdistetään ohjelmaan lisäämällä niiden tekstit suoraan pääohjelman runkoon erityisellä esiprosessoridirektiivillä #include . Esikäännetyt otsikot tallennetaan levylle kääntäjän sisäisessä muodossa tiedostoina, ja kun projekti käännetään uudelleen, niiden käsittelyyn ja yhdistämiseen kuluva aika lyhenee merkittävästi.

Tausta

C - ohjelmointikieli käytti otsikkotiedostoja ulkoisen moduulin liittämiseen . Tämä yksinkertaistaa kääntäjää ja antaa jonkin verran joustavuutta - ja se toimi 20 vuotta, kunhan otsikot olivat pieniä ja projektin tiedostoja oli vähän. Ohjelmistoprojektien laajenemisen myötä käännösaika alkoi kasvaa neliöllisesti [1]  - sekä käännösyksiköiden määrä että kuhunkin tiettyyn yksikköön kytkettyjen otsikoiden määrä lisääntyy. Erityisen suurissa projekteissa täydellinen uudelleenkäännös kestää kymmeniä minuutteja ja se tehdään useammin iltaremontin aikana kuin ohjelmoijien työpaikoilla.

Lisäksi C-ohjelmointikieli kuuluu LR(1)-perheeseen ja siksi C-kääntäjät ovat hitaampia, esimerkiksi Pascal (joka on LL(1) ) .

Kääntämisajan lyhentämiseksi kehitettiin esikäännetyt otsikot. Koska otsikkotiedostot vaihtuvat paljon harvemmin kuin ohjelmakoodin sisältävät tiedostot (ja kirjastotiedostot lähes koskaan), se osoittautui järkeväksi optimointityökaluksi otsikoiden esikäsittelyyn ja muuntamiseen erikoistiedostoiksi, jotka voidaan sisällyttää käännösohjelmaan. ohjelmaa ohittaen kääntämisen ensimmäiset vaiheet. Otsikoiden esikäännöksen vuoksi kääntäjä käsittelee kokonaan vain ohjelman muuttuneet osat. Otsikon esikääntäminen ei kuitenkaan aina auta:

  1. Minkä tahansa esikäännetyn otsikon muuttaminen kääntää koko joukon uudelleen.
  2. Täydellisellä uudelleenkäännöksellä aikavahvistus saadaan, kun samaa joukkoa käytetään vähintään kahdessa käännösyksikössä.

Siksi esikäännettyyn joukkoon sisältyy yleensä kaikenlaisia ​​kirjaston otsikoita, suuria ja samalla harvoin muuttuvia.

Toteutukset

Embarcadero C++ Builder

Kaikki, mikä tulee ennen direktiiviä, on esikäännetty #pragma hdrstop.

// main.cpp ///// Esikäännetyt otsikot // C++ # sisältää <cstdio> // STL # sisältää <merkkijono> # sisältää <vektori> # sisältää <kartan> # sisältää <algoritmi> // Käyttöjärjestelmäkohtainen # sisältää <windows.h> ///// Esikäännös päättyy tähän # pragma hdrstop ///// Muut otsikot # sisältävät "yksikkö1.h" int main () { doUnit1 (); paluu 0 ; }

GCC

Käännettäessä h-tiedostoja GCC olettaa automaattisesti, että esikäännetty otsikko vaaditaan (tai se voidaan määrittää komentorivillä, switch -x). Useimmat ohjelmointikuoret (kuten Code::Blocks ) antavat sinun määrittää esikäännettävät tiedostot. Vakioratkaisuna on "dumpata" eniten käytetyt, mutta harvoin muuttuvat otsikot yhdeksi htiedostoksi ja sisällyttää se ensimmäiseksi.

// pch.h - esikääntää se (asetettu makefile- tai projektissa). // C++ # sisältää <cstdio> # sisältää <cmath> // STL # sisältää <merkkijono> # sisältää <vektori> # sisältää <kartan> # sisältää <algoritmi> // Käyttöjärjestelmäkohtainen # sisältää <windows.h> // unit1.cpp // esikäännetty ensin! # sisältää "pch.h" // muut otsikot # sisältävät "yksikkö1.h" tyhjä doUnit1 () { } // main.cpp // esikäännetty ensin! # sisältää "pch.h" // muut otsikot # sisältävät "yksikkö1.h" int main () { doUnit1 (); paluu 0 ; }

Microsoft Visual C++

Tilanne on samanlainen kuin GCC. Visual C++ -versio 6.0 ja uudemmat esikääntää otsikon vakionimellä - stdafx.h(tätä nimeä voidaan muuttaa kääntäjävaihtoehdolla).

IDE:n ohjatun uuden projektin avulla voit valita, käytetäänkö esikäännettyjä otsikoita. Niiden käyttö lisää automaattisesti kääntäjävaihtoehdon /Yu'stdafx.h', ja minkä tahansa tiedoston, joka ei sisällä, kääntäminen epäonnistuu virheen vuoksi. #include "stdafx.h"

Muistiinpanot

  1. Large-scale C++ Software Design Arkistoitu 14. joulukuuta 2014 Wayback Machinessa John Lakos, 1996, s. 334 "...vähennä kääntämisen kustannuksia eliminoimalla C++-esiprosessorin käyttämän ajan neliöllisen käyttäytymisen."

Linkit