Oldindan tuzilgan sarlavha - Precompiled header

Yilda kompyuter dasturlash, a oldindan tuzilgan sarlavha bu (C yoki C ++ ) sarlavha fayli bu kompilyatsiya qilingan oraliq shakl uchun ishlov berish tezroq kompilyator. Oldindan tuzilgan sarlavhalardan foydalanish sezilarli darajada kamayishi mumkin kompilyatsiya vaqti, ayniqsa, katta sarlavha fayllariga, boshqa ko'plab sarlavha fayllarini o'z ichiga olgan sarlavha fayllariga yoki ularga tegishli sarlavha fayllariga qo'llanilganda kiritilgan ko'pchilikda tarjima birliklari.

Mantiqiy asos

In C va C ++ dasturlash tillari, a sarlavha fayli bu matn, boshqasiga avtomatik ravishda kiritilishi mumkin bo'lgan fayl manba fayli tomonidan C oldingi protsessori a yordamida oldingi protsessor ko'rsatmasi manba faylida.

Sarlavha fayllari ba'zida juda katta miqdordagi manba kodlarini o'z ichiga olishi mumkin (masalan, sarlavha fayllari) Windows.h va Kakao / kakao.h kuni Microsoft Windows va OS X navbati bilan). Bu, ayniqsa, keng foydalanadigan katta "sarlavha" kutubxonalari paydo bo'lishi bilan bog'liq andozalar, kabi O'z matematikasi kutubxonasi va C ++ kutubxonalarini oshiring. Ular deyarli to'liq foydalanuvchi tomonidan sarlavha fayllari sifatida yozilgan # shu jumladans, ish vaqtida bog'lanish o'rniga. Shunday qilib, foydalanuvchi har safar o'z dasturini tuzganda, foydalanuvchi asosan ko'plab sarlavhali kutubxonalarni qayta kompilyatsiya qiladi. (Ular birgalikda ob'ektlarga oldindan tuzilgan yoki dinamik bog'lanish kutubxonalari "header" bo'lmagan kutubxonalarda.)

Kompilyatsiya vaqtlarini qisqartirish uchun ba'zi kompilyatorlar sarlavha fayllarini kompilyatorga tezroq ishlov beriladigan shaklga yig'ishga imkon beradi. Ushbu oraliq shakl a sifatida tanilgan oldindan tuzilgan sarlavha, va odatda kengaytma bilan nomlangan faylda saqlanadi .pch yoki shunga o'xshash, masalan .gch ostida GNU kompilyatori to'plami.

Foydalanish

Masalan, C ++ fayli berilgan source.cpp shu jumladan header.hpp:

//header.hpp...
//source.cpp# shu jumladan "header.hpp"...

Tuzishda source.cpp birinchi marta oldindan tuzilgan sarlavha xususiyati yoqilganda, kompilyator oldindan tuzilgan sarlavha yaratadi, header.pch. Keyingi safar, agar ushbu sarlavhaning vaqt tamg'asi o'zgarmasa, kompilyator kompilyatsiya bosqichini o'tkazib yuborishi mumkin header.hpp va buning o'rniga foydalaning header.pch to'g'ridan-to'g'ri.

Umumiy dasturlar

Microsoft Visual C va C ++

Microsoft Visual C ++ (versiya 6.0 va undan yangi)[iqtibos kerak ]) faqat sarlavhalarni emas, balki har qanday kodni oldindan tuzishi mumkin.[1]Buni ikki yo'l bilan amalga oshirish mumkin: yoki barcha kodlarni nomi bilan mos keladigan faylgacha oldindan kompilyatsiya qilish / YcFayl nomi variant yoki (qachon / Yc hech kimsiz ko'rsatilgan Fayl nomi) birinchi kodgacha barcha kodlarni oldindan tuzish #pragma hdrstop kodda[2][3]Oldindan kompilyatsiya qilingan fayl nomi bilan nomlangan faylda saqlanadi Fayl nomi ga berilgan / Yc variant, a bilan .pch kengaytmasi yoki tomonidan berilgan nomga muvofiq nomlangan faylda / FpFayl nomi variant.[3]The / Yu ga bo'ysunadigan variant / Yc variant birgalikda ishlatilsa, kompilyator bunday fayldan oldindan kompilyatsiya qilingan kodni ishlatishiga olib keladi.[3]

pch.h (nomlangan stdafx.h Visual Studio 2017 oldin[4]) - tomonidan yaratilgan fayl Microsoft Visual Studio IDE sehrgar, bu ham standart tizimni, ham loyihani o'ziga xos xususiyatlarini tavsiflaydi fayllarni o'z ichiga oladi tez-tez ishlatib turiladigan, ammo deyarli o'zgarmasdir.

The afx yilda stdafx.h degan ma'noni anglatadi dastur doirasi kengaytmalari. AFX ning asl qisqartmasi edi Microsoft Foundation sinflari (MFC). MSVC loyihalarida stdafx.h nomi sukut bo'yicha 2017 yilgi versiyadan oldin ishlatilgan bo'lsa, har qanday muqobil nom qo'lda ko'rsatilishi mumkin.

Mos kompilyatorlar umumiy kompilyatsiya vaqtini qisqartirish uchun ushbu faylni oldindan kompilyatsiya qiladi. Visual C ++ dan oldin hech narsa kompilyatsiya qilinmaydi # "pch.h" ni kiriting kompilyatsiya qilish imkoniyati bo'lmasa, manba faylida /Yu'pch.h ' belgilanmagan (sukut bo'yicha); u manbadagi barcha kodlarni o'z ichiga oladi va shu qatorda allaqachon tuzilgan.

jarang

The jarang kompilyator ikkita mexanizmga ega.

Asl mexanizmi sodda va unchalik kuchli bo'lmagan oldindan sarlavhalar bir yoki bir nechta manba fayllaridagi leksik belgilarning oqimi amalda bo'lgan joyda saqlanadigan a token keshi, undan keyingi kompilyatsiyalarda ularni bajarishdan ko'ra tezroq olish mumkin leksik tahlil yana asl manba fayllarida.[5]

To'liq oldindan tuzilgan sarlavha mexanizmi bilan taqqoslaganda, bu til mustaqilligining afzalliklariga ega, chunki leksik tahlil C, C ++, Objective C va Objective C ++ tillari uchun jaranglashda va me'morchilik mustaqilligida, chunki bir xil tokenlar oqimidan foydalanish mumkin. turli xil maqsadli arxitekturalar uchun kompilyatsiya qilishda.[5]Ammo, hech kimga bormaslikning kamchiliklari bor yanada oddiy leksik tahlilga qaraganda, buni talab qiladi sintaktik va semantik tahlil token oqimining har bir kompilyatsiyasi bilan bajarilishi; va oldindan belgilab qo'yilgan faylning leksik belgilarida o'lchamlari bilan chiziqli ravishda masshtabni kompilyatsiya qilish vaqti, bu esa to'liq ishlab chiqilgan prekompilyatsiya mexanizmi uchun shart emas.[5]

Pretokenizatsiya mexanizmi oldingi protsessorga yordam berish uchun bir nechta kichik mexanizmlarni o'z ichiga oladi: fayllar mavjudligini va ma'lumotlar tamg'asi ma'lumotlarini keshlash va yozib olish inklyuziya qo'riqchilari himoyalangan kod tezda o'tkazib yuborilishi uchun.[5]

Keyinchalik jarohatlarning rivojlanishi to'liq to'liq oldindan tuzilgan sarlavha mexanizmini joriy qildi.[6]Bu kirish manba kodini tokenizatsiya qiladi va uning sintaktik va semantik tahlillarini amalga oshiradi, kompilyatorning ichki hosil qilinganligini yozadi mavhum sintaksis daraxti (AST) va belgilar jadvali oldindan tuzilgan sarlavha fayliga.[6]

Oldindan yaratilgan sarlavha mexanizmi bilan taqqoslaganda, bu juda yaxshi tarozida, chunki kompilyatorga oldindan tuzilgan sarlavha faylini o'qiyotganda, kirish faylni (chiziqli belgilar) ketma-ket o'qish uchun oqim bo'lishi bilan cheklanmaydi, ketma-ket I / O.[6]AST oldindan kompilyatsiya qilingan sarlavha fayliga kompilyator uni tasodifiy kirish-chiqarish yordamida o'qiy oladigan tarzda yoziladi, xususan emas oldindan tuzilgan AST qismlarida keyingi kod aslida havola qilinmasligini o'qish, bu katta shablon kutubxonalarini ta'minlovchi sarlavhalar bilan tez-tez uchraydi.[6]Bu kesh faylini oldindan kompilyatsiya qilingan kirish hajmi bilan chiziqli ravishda o'qish muammosini yo'q qiladi.[6]

Salbiy tomoni, ammo prekokenizatsiya mexanizmiga nisbatan umumiylikni yo'qotishdir.[5][6]Oldindan tuzilgan sarlavha ishlatilayotgan til shevasi haqidagi ma'lumotlarni C ++ uslubi kabi darajaga qadar saqlashi kerak. // sharhlar C ++ tilidan tashqarida, maqsadli arxitektura, kompilyator versiyasi (aniqrog'i, kompilyator foydalanadigan ichki AST ma'lumotlar tuzilmasi versiyasi) va oldindan belgilangan protsessor makroslari ro'yxatida yoqilgan; Shunday qilib, oldindan tuzilgan sarlavha faylini qayta o'qiyotganda, kompilyator uning qo'lidagi kompilyatsiya uchun yaroqli bo'lgan oldindan tayyorlangan sarlavhadan foydalanayotganligini ta'minlashi mumkin.[6]

oldindan tuzilgan sarlavha sxemasi, ba'zi bir yaxshilangan narsalar, masalan, oldindan tuzilgan sarlavhaning boshqasiga murojaat qilish qobiliyati, ichki ishlatilgan, oldindan tuzilgan sarlavha, shuningdek uning modullari mexanizmi uchun asos bo'lib xizmat qiladi.[6]U xuddi shu narsani ishlatadi bit kodi tomonidan ishlaydigan fayl formati LLVM, ichida jarangga xos bo'limlarda joylashgan Umumiy ob'ekt fayllari formati yoki Kengaytiriladigan bog'lanish formati fayllar.[6]

GCC

Oldindan tuzilgan sarlavhalar qo'llab-quvvatlanadi GCC (3.4 va undan yangi). GCC yondashuvi VC va mos kompilyatorlarnikiga o'xshaydi. GCC "" yordamida sarlavha fayllarining oldindan tuzilgan versiyalarini saqlaydi..gch"suffiksi. Dastlabki faylni kompilyatsiya qilishda kompilyator ushbu fayl bir xil katalogda mavjudligini tekshiradi va iloji bo'lsa undan foydalanadi.

GCC faqat oldingi kompilyatsiya qilingan versiyadan foydalanishi mumkin, agar bir xil kompilyator kalitlari sarlavha tuzilgan paytdagidek o'rnatilsa va u ko'pi bilan ishlatsa. Bundan tashqari, oldindan tuzilgan sarlavha oldida faqat protsessor ko'rsatmalari joylashtirilishi mumkin (chunki u har qanday kompilyatsiya qilinadigan koddan oldin to'g'ridan-to'g'ri yoki bilvosita boshqa oddiy sarlavha orqali kiritilishi kerak).

GCC avtomatik ravishda ko'pgina sarlavha fayllarini kengaytmasi bo'yicha aniqlaydi. Ammo, agar bu bajarilmasa (masalan, nostandart sarlavha kengaytmalari tufayli), -x switch GCC faylni sarlavha sifatida ko'rib chiqilishini ta'minlash uchun ishlatilishi mumkin.

C ++ Builder

Standart loyiha konfiguratsiyasida C ++ Builder kompilyator chiziqqa qadar manba moduli tomonidan kiritilgan barcha sarlavhalar uchun oldindan tuzilgan sarlavhalarni yaratadi #pragma hdrstop topildi.[7] Iloji bo'lsa, oldindan tuzilgan sarlavhalar loyihaning barcha modullari uchun taqsimlanadi. Masalan,. Bilan ishlashda Vizual komponentlar kutubxonasi, qo'shilishi odatiy holdir vcl.h birinchi bo'lib tez-tez ishlatiladigan VCL sarlavha fayllarining aksariyati mavjud. Shunday qilib, oldindan tuzilgan sarlavha barcha loyiha modullari bo'yicha taqsimlanishi mumkin, bu esa qurilish vaqtini keskin qisqartiradi.

Bundan tashqari, C ++ Builder-ga Visual C ++ tomonidan taqdim etilgan mexanizmga o'xshash aniq sarlavha faylini oldindan kompilyatsiya qilingan sarlavha sifatida ishlatish uchun vosita bo'lishi mumkin.

C ++ Builder 2009 "Oldindan kompilyatsiya qilingan ustalar ustozi" ni taqdim etadi, unda kiritilgan sarlavha fayllari uchun loyihaning barcha manba modullarini tahlil qiladi, ularni tasniflaydi (ya'ni, agar ular loyihaning bir qismi bo'lsa yoki yo'q bo'lsa, sarlavha fayllarini chiqarib tashlaydi). Qo'riqchini qo'shing ) va belgilangan fayllar uchun oldindan tuzilgan sarlavhani avtomatik ravishda yaratadi va sinab ko'radi.

Shuningdek qarang

Adabiyotlar

  1. ^ MSDN 2015a.
  2. ^ MSDN 2015b.
  3. ^ a b v MSDN 2015c.
  4. ^ "Visual Studio C ++ dagi prekompilyatsiya sarlavhasi sifatida #include" stdafx.h "o'rniga #include" pch.h "dan foydalansam bo'ladimi?". Stack overflow.
  5. ^ a b v d e jingalak 2018a.
  6. ^ a b v d e f g h men jarang 2018b.
  7. ^ Swart 2003 yil, p. 76

Manbalar

Tashqi havolalar