Кіріспе

Компьютерлік бағдарламалаудағы файлдың оңтайландырылған түрі

Компьютерлік бағдарламалауда, алдын ала компиляцияланған қабырға (PCH) – (C немесе C++) қабырға файлы, ол компилятор үшін өңдеу жылдамдығы жоғары аралық формаға компиляцияланады. Алдын ала компиляцияланған қабырғаларды пайдалану компиляция уақытын айтарлықтай қысқартуы мүмкін, әсіресе үлкен қабырға файлдарына, көптеген басқа қабырға файлдарын қамтитын қабырға файлдарына немесе көптеген аударма бірліктеріне қосылған қабырға файлдарына қолданғанда.

Негізгі себептері

C және C++ бағдарламалау тілдерінде бас файл — мәтіні C препроцессоры арқылы бастапқы файлдағы препроцессор директивасын пайдаланып басқа бастапқы файлға автоматты түрде қоса алатын файл. Бас файлдар кейде өте көп көлемде бастапқы кодты қамтуы мүмкін (мысалы, windows.h және OS X жүйесінде Cocoa/Cocoa.h бас файлдары). Бұл, әсіресе, Eigen математикалық кітапханасы және Boost C++ кітапханалары сияқты үлкен шаблонды қолданатын "бас" кітапханалардың пайда болуымен байланысты. Олар пайдаланушының #include арқылы қосатын, орындалу кезінде байланыстырылатын файлдар түрінде жазылады. Сондықтан пайдаланушы бағдарламасын компиляциялаған сайын, көптеген бас кітапханаларды қайта компиляциялайды. (Бұлар ортақ нысандарға немесе "бас" емес кітапханалардағы динамикалық байланыс кітапханаларына алдын ала компиляцияланады.) Компиляция уақытын қысқарту үшін кейбір компиляторлар бас файлдарды компилятордың тез өңдейтін түріне компиляциялауға мүмкіндік береді. Бұл аралық түр алдын ала компиляцияланған бас файл деп аталады және әдетте pch немесе осыған ұқсас кеңейтіммен аталған файлда сақталады, мысалы GNU Compiler Collection-ның gch файлы сияқты.

Қолданылуы

Мысалы, берілген C++ файл көзі source.cpp бас файлды қамтиды header.hpp:

//header.hpp

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

source.cpp файлын алғаш рет алдын ала компиляцияланған бас функциясы қосылған күйде компиляциялау кезінде компилятор алдын ала компиляцияланған бас файлды header.pch жасайды. Келесі жолы, егер осы бас файлдың уақыт белгісі өзгермесе, компилятор header.hpp-қа қатысты компиляция кезеңін өткізіп жіберіп, орнына header.pch-ты тікелей пайдалана алады.

Microsoft Visual C және C++

Microsoft Visual C++ (6.0 нұсқасы және одан кейінгілер) тек қана тақырып файлдарын ғана емес, кез келген кодты алдын ала компиляциялай алады. Бұл файл Microsoft Visual Studio IDE шеберімен жасалады және жиі қолданылатын, бірақ сирек өзгертілетін стандартты жүйелік және жобаға қатысты кіріктірілген файлдарды сипаттайды. Stdafx.h файлындағы "afx" – қосымша құрылым кеңейтімдерін білдіреді. AFX – Microsoft Foundation Classes (MFC) кітапханасының бастапқы аббревиатурасы болды. Stdafx.h атауы 2017 жылға дейінгі MSVC жобаларында әдепкі бойынша қолданылған, бірақ кез келген балама атау қолмен көрсетілуі мүмкін. Үйлесімді компиляторлар осы файлды алдын ала компиляциялап, жалпы компиляция уақытын қысқартады. Visual C++ көзіндегі #include "pch.h" жолынан бұрынғы ештеңені компиляцияламайды, егер /Yu'pch.h' компиляциялау опциясы қойылмаса (әдепкі бойынша); ол осы жолға дейінгі және оның өзіндегі кодтың барлығы алдын ала компиляцияланған деп есептейді.

GCC

Алдын ала компиляцияланған тақырыптар GCC (3.4 және одан кейінгі нұсқаларында) қолдау көрсетіледі. GCC тәсілі VC және үйлесімді компиляторлардың тәсілдеріне ұқсас. GCC тақырып файлдарының алдын ала компиляцияланған нұсқаларын ".gch" қосымшасымен сақтайды. Көздік файлды компиляциялау кезінде компилятор осы файлдың сол каталогта бар-жоғын тексереді және мүмкін болса пайдаланады. GCC алдын ала компиляцияланған нұсқаны тек компилятор параметрлері тақырып компиляцияланған кездегідей болса ғана қолдана алады және ол ең көп дегенде біреуін пайдалана алады. Бұдан әрі, алдын ала компиляцияланған тақырыптан бұрын тек алдын ала өңдеуші директиваларын орналастыруға болады (өйткені ол кез келген компиляцияланатын кодтан бұрын басқа қалыпты тақырып арқылы тікелей немесе жанама түрде қосылуы керек). GCC көптеген тақырып файлдарын олардың кеңейтілімдері арқылы автоматты түрде анықтайды. Дегенмен, егер бұл сәтсіз болса (мысалы, стандартты емес тақырып кеңейтімдері болса), GCC файлды тақырып ретінде қарастыруын қамтамасыз ету үшін "x" параметрін пайдалануға болады.

дыбыс

Clang компиляторы 2009 жылғы Clang 2.5 / LLVM 2.5 нұсқасында PCH қолдауын қосты. Компилятор кіріс кодты талдайды және хэдерлердің синтаксистік және семантикалық талдауын жүргізеді, содан кейін компилятордың ішкі абстрактілік синтаксистік ағашын (AST) және символдар кестесін алдын ала компиляцияланған хэдер файлына жазады. Алдын ала компиляцияланған хэдерлер жобаның барлық модульдарымен ортақ пайдаланылады, мүмкіндігі болса. Мысалы, Visual Component Library-мен жұмыс істегенде, көбінесе vcl.h хэдерін бірінші болып қосу қалыпты жағдай, себебі ол көптеген қолданылатын VCL хэдер файлдарын қамтиды. Осылайша, алдын ала компиляцияланған хэдер жобаның барлық модульдарымен бөлісіледі, бұл құрастыру уақытын едәуір қысқартады. Сонымен қатар, C++Builder Visual C++ ұсынатын механизмге ұқсас, алдын ала компиляцияланған хэдер ретінде пайдалану үшін нақты хэдер файлын таңдауға мүмкіндік береді. C++Builder 2009 "Алдын ала компиляцияланған хэдер шебері" (Precompiled Header Wizard) енгізді, ол жобаның барлық бастапқы модульдерін кіріктірілген хэдер файлдары үшін талдайды, оларды жіктейді (яғни, егер олар жобаның бөлігі болса немесе Include guard болмаса, хэдер файлдарын шығарып тастайды) және көрсетілген файлдар үшін алдын ала компиляцияланған хэдерді автоматты түрде жасайды және тексереді.

Токенді бастығы

Претокендік бас файл (PTH) – лексикалық талдаудан өткен, бірақ семантикалық операциялар жасалмаған формада сақталатын бас файл. PTH, PCH қолдаудан бұрын Clang-та болған, сондай-ақ GCC-нің бір тармағында да сынақтан өткен. Толық PCH механизмімен салыстырғанда, PTH тіл (және диалект) тәуелсіздігінің, себебі лексикалық талдау C тілдері отбасы үшін ұқсас, және архитектура тәуелсіздігінің артықшылықтарына ие, өйткені әртүрлі мақсатты архитектуралар үшін компиляциялау кезінде бірдей токендер ағынын пайдалануға болады.