سر تیترهای از پیش کامپایل شده
در برنامه نویسی کامپیوتر ، یک سرتیتر از پیش کامپایل شده (C یا C ++ ) سرتیتر فایل است که به یک شکل متوسط کامپایل شده است که عمل تجزیه برای کامپایلر را سرعت می بخشد . استفاده از سرتیتر از پیش کامپایل شده ممکن است به طور قابل توجهی باعث کاهش زمان کامپایل شود ، به ویژه هنگامی که به سرتیتر فایل های بزرگ، سرتیتر فایلی که شامل بسیاری از سرتیتر فایل های دیگر، و یا سرتیتر فایل های شامل در بسیاری از واحد ترجمه هستند ، اضافه می کنیم .
بنیاد[ویرایش]
در زبانهای برنامه نویسی C و C ++ ، یک سرتیتر فایل ، فایلی است که متن آن ممکن است در فایل منبع دیگری به وسیله ی پیش پردازنده ی C شامل شود ، یا با استفاده از یک دستورالعمل پیش پردازنده در فایل منبع درج شود.
سرتیتر فایل ها گاهی اوقات می تواند حاوی مقادیر بسیار زیادی از کد منبع (به عنوان مثال، سرتیتر فایل ها windows.h
و Cocoa/Cocoa.h
به ترتیب در مایکروسافت ویندوز و OS X ). این امر به ویژه با ظهور كتابخانه های بزرگ "سر تیتر" كه از الگوهای كلی استفاده می کنند ، مانند كتابخانه ریاضی ایگن و کتابخانه های Boost C ++ ،صحت یافت . آنها تقریباً به طور کامل به عنوان سرتیتر فایل هایی نوشته شده اند که کاربر #include
استفاده میکند تا اینکه در زمان اجرا به آن متصل و لینک شود. بنابراین ، هر بار که کاربر برنامه خود را کامپایل می کند ، در واقع مجدداً کتابخانه های سرتیتر بسیاری را دوباره کامپایل می کند. (اینها می توانند در اشیاء یا كتابخانه های پیوند پویا در كتابخانه های غیر "سرتیتر" از پیش کامپایل شوند. )
برای کاهش زمان کامپایل ، بعضی از کامپایلرها اجازه می دهند تا سرتیتر فایل هایشان به شکلی کامپایل شوند که برای پردازش سریعتر کامپایلر باشد. این فرم میانی به عنوان یکسرتیتر های از پیش کامپایل شده معروف است و معمولاً در فایلی که پسوند .pch یا .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[ویرایش]
ماکروسافت Visual C ++ (نسخه 6.0 و جدیدتر) [نیازمند منبع] نه تنها می تواند سرتیتر ها از قبل کامپایل کند، را بلکه قادر است هر کدی را از پیش کامپایل کند. [۱] که این کار را از دو راه انجام دهد: یا تمام کد ها را در فایلی که نامش با Ycfilename\ مطابقت دارد از پیش کامپایل می کند ، یا (هنگامی که Yc\ بدون هیچ filename مشخص شده است) تمام کد ها را در اولین وقوع #pragma hdrstop در کد [۲] [۳]از پیش کامپایل می کند. خروجی در یک فایلی که نامش از filename برگرفته شده است و به گزینه Yc/، با پسوند pch. ختم می شود، و یا در یک فایل که نامش با توجه به نام های ارائه شده توسط گزینه های Fpfilename/ بود ، ذخیره می شود. [۳] گزینه Yu/ ، مطابق با گزینه Yc/ در صورتی که با هم استفاده شود، باعث می شود کامپایلر از کدهای قبلاً کامپایل شده اش از چنین فایلی استفاده کند. [۳]
pch.h( نام گذتری شده stdafx.h قبل از ویژوال استودیو 2017 [۴] ) یک فایل تولید شده توسط ویژوال استودیو مایکروسافت IDE است ، هر دو سیستم استاندارد و خاص پروژه شامل فایل های آن که به طور مکرر استفاده می شود اما به ندرت تغییر می کند را توصیف می کند.
afx در stdafx.h مخفف بسط های چارچوب کاربردی است. AFX مخفف اصلی برای کلاس های بنیادی ماکروسافت است. در حالی که نام stdafx.h به صورت پیش فرض در پروژه های MSVC تا نسخه ی 2017 استفاده می شده و هر نام دیگری به صورت دستی متمایز شده است.
کامپایلر های سازگار این فایل را از قبل کامپایل می کنند تا تعداد دفعات کلی کامپایل را کاهش دهند. visual ++ c هیچ چیزی قبل از "include "pch.h # را در فایل منبع کامپایل نمی کند مگر اینکه گزینه ی کامپایل تیک نخورده باشد یعنی انتخاب نشده باشد (پیش فرض) ؛ این فرضیه تمام کد های موجود در منبع را شامل می شود و نیز شامل آن خطی که کامپایل شده است.
Clang[ویرایش]
کامپایلر clang دارای دو ساز و کار است.
ساز و کار اصلی و ساده و خفیف" از پیش نشانه گذاری کردن سرتیتر ها "بود که در آن دنباله ای از توکن های لغوی در یک یا چند فایل منبع ذخیره می شودکه در آن در واقع یک حافظه نهان است، از این طریق می توان آنها را با سرعت بیشتری در کامپایل های بعدی نسبت به انجام تحلیل لغوی دوباره روی فایل های منبع اصلی بازیابی کرد. [۵]
در مقایسه با یک ساز و کار سرتیتر هایی که به صورت کامل از پیش کامپایل شده اند، مزایای استقلال زبان وجود دارد ، زیرا تجزیه و تحلیل واژگانی برای زبانهای C ، C ++ ، Objective C و Objective C ++ و معماری مستقل دیگر به صورت یکسان در استنتاج مشابه است زیرا می توان از همان دنباله ای از این نشانه ها هنگام کامپایل کردن برای معماری های مختلف استفاده کرد . [۵] با این حال ، مضرات فراتر نرفتن از تحلیل لغات و کلمات ساده را دارد ، و نیازمند آن است که تجزیه و تحلیل نحوی (گرامری) و معنایی دنباله ی نشانه ها با هر عمل کامپایل کردنی انجام دهد. و زمان کامپایل مقیاس گذاری بصورت خطی با اندازه ، در نشانه های لغات، فایل پیش فرض ، که لزوماً برای ساز و کار از پیش کامپایل کردن کاملاً مورد استفاده قرار نمی گیرد. [۵]
مکانیزم از پیش نشانه گذاری کردن شامل چندین ساز و کار جزئی برای کمک به کار به پیش پردازنده است: حافظه نهان از وجود فایل و اطلاعات پایگاه داده، و ضبط نگهبان های شمول به دستگاه به گونه ای که از کد محافظت شده می توان به سرعت پرش کرد. [۵]
توسعه Clang باعث معرفی يك مكانيسم از پیش کامپایل سرتیتر کاملاً پرتقاطع شده است. [۶] این هم کد منبع ورودی را نشانه گذاری می کند و تجزیه و تحلیل نحوی و معنایی از آن را انجام می دهد ،و هم درخت نحوی انتزاعی تولید شده داخلی کامپایلر (AST) و جدول نمادها را برای یک فایل سرتیتر از پیش کامپایل شده ارسال می کند. [۶]
در مقایسه با ساز و کار از پیش نشانه گذاری کردن سر تیتر ، این مقیاس بهتر است ، به این علت که هنگام خواندن سرتیتر فایل های از پیش کامپایل شده در کامپایلر این اجبار وجود ندارد که ورودی یک دنباله ای (از نشانه های واژگانی) برای خواندن فایل به صورت خطی باشد، با استفاده از دنباله ای I / O. [۶] AST به سرتیتر فایل از پیش کامپایل شده نوشته شده است به گونه ای که کامپایلر بتواند آن را با استفاده از I / O با دسترسی تصادفی بخواند ، به ویژه عدم خواندن در قسمت هایی از AST که از قبل کامپایل شده است که کد بعدی در واقع مرجع آن نیست. این یک اتفاق معمول با سرتیتر هایی است که کتابخانه های الگوی بزرگ را ارائه می دهند. [۶] این مسئله مشکل خواندن مقیاس بندی فایل کش را بصورت خطی با اندازه ورودی از پیش کامپایل شده ،از بین می برد. [۶]
با این وجود ، روند در مقایسه با مکانیسم پیش فرض نشانه گذاری کردن عمومی نزولی است. [۵] [۶] سرتیتر از پیش کامپایل شده باید از اطلاعات مربوط به گویش زبان مورد استفاده ، تا مواردی مانند سبک کامنت ها ذر ++C //
نسبت به زبانهای غیر C ++ ، معماری هدف ، نسخه کامپایلر و (به طور خاص ، نسخه ساختار داده AST داخلی که کامپایلر از آن استفاده می کند) ، و لیست ماکروهای از پیش پردازنده را ذخیره کند. پس کامپایلر از خواندن مجدد سرتیتر فایل از قبل کامپایل شده می تواند اطمینان حاصل کند که از یک سرتیتر از پیش کامپایلر شده استفاده شده است که برای کامپایل کردن آن ، معتبر است. [۶]
طرح سرتیتر از پیش کامپایل شده ی clang ، با برخی پیشرفت هایی از جمله توانایی ارجاع دادن یک سرتیتر از پیش کامپایل شده به دیگری که به صورت داخلی استفاده شده ، همچنین پایه ای برای مکانیسم ماژول های آن است. [۶] از همان فرمت فایل بیت کد استفاده می کند که توسط LLVM به کار گرفته شده است ، در بخش های خاص Clang در پرونده های Common Object File یا پرونده های پیوند دهنده توسعه یافته محصور شده است. [۶]
GCC[ویرایش]
سرتیتر های از پیش کامپایل شده در GCC پشتیبانی می شوند (نسخه ی 3.4 و جدیدتر). رویکرد GCC شبیه به VC و کامپایلرهای سازگار است. GCC با استفاده از پسوند "gch." نسخه های از پیش کامپایل شده فایلهای سرتیتر را حفظ می کند. هنگام کامپایل کردن یک فایل منبع ، کامپایلر بررسی می کند که آیا این فایل در همان فهرست موجود است و در صورت امکان از آن استفاده می کند.
GCC فقط می تواند از نسخه از پیش کامپایل شده استفاده کند در صورتی که همان سوئیچ کامپایلر همانند سر تیتر کامپایلر تنظیم شده باشد و ممکن است از حداکثر یکی از آنها استفاده کند. علاوه بر این ، فقط دستورالعمل های پیش پردازنده قبل از سرتیتر از پیش کامپایل شده می تواند قرار داده شود (زیرا باید مستقیماً یا غیرمستقیما از طریق سر تیتر عادی دیگری ، قبل از هر کد قابل تکمیل) درج شود.
GCC بطور خودکار بیشتر سرتیتر فایل ها را با پسوند آنها مشخص می کند. اما اگر این کار انجام نشود (مثلاً به دلیل پسوندهای غیر استاندارد سر تیتر) ، از سوئیچ -x می توان برای اطمینان از اینکه GCC با فایل به عنوان سرتیتر درست رفتار می کند ، استفاده کرد.
سازنده C ++[ویرایش]
در پیکربندی پیش فرض پروژه ، کامپایلر C ++ Builder بطور ضمنی سرتیتر های از پیش کامپایل شده را برای همه سرتیتر ها موجود توسط یک ماژول منبع ایجاد می کند تا اینکه خط pragma hdrstop# پیدا شود. [۷] در صورت امکان سرتیتر های از پیش کامپایل شده برای همه ماژول های پروژه به اشتراک گذاشته می شوند. به عنوان مثال ، هنگام کار با کتابخانه ویژوال کامپوننت ، معمول است که ابتدا سرتیتر vcl.h که حاوی بیشتر فایل های سرتیتر رایج VCL است را اضافه کنیم. بنابراین ، سرتیتر از پیش کامپایل شده را می توان در تمام ماژول های پروژه به اشتراک گذاشت ، که باعث کاهش چشمگیر زمان ساخت می شود.
علاوه بر این ، C ++ سازنده ی می تواند ابزاری برای استفاده از یک سرتیتر فایل مشخص به عنوان سرتیتر از پیش کامپایل شده مانند ساز و کاری که در Visual C ++ ،ارائه شده ، ایجاد شود.
زبان سازنده ی ++C در سال 2009 یک "سرتیتر از پیش کامپایل شده " را معرفی می کند که تجزیه تمام ماژول های منبع این پروژه را برای شامل شدن در سرتیتر فایل های گنجانده ، طبقه بندی آنها (یعنی مانع فایل های هدر صورتی که بخشی از این پروژه می باشد و یا لازم نیست شامل گارد ) و تولید یک سرتیتر از پیش کامپایل شده برای فایل های مشخص شده را بطور خودکار مورد آزمایش قبلی قرار می کند.
همچنین ببینید[ویرایش]
- واحد کامپایل کننده تکی
- سر تیتر پیشوند
منابع[ویرایش]
- ↑ MSDN 2015a.
- ↑ MSDN 2015b.
- ↑ ۳٫۰ ۳٫۱ ۳٫۲ MSDN 2015c.
- ↑ "Can I use #include "pch.h" instead of #include "stdafx.h" as my precompile header in Visual Studio C++?". Stack Overflow.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ ۵٫۰ ۵٫۱ ۵٫۲ ۵٫۳ ۵٫۴ clang 2018a.
- ↑ ۶٫۰ ۶٫۱ ۶٫۲ ۶٫۳ ۶٫۴ ۶٫۵ ۶٫۶ ۶٫۷ ۶٫۸ clang 2018b.
- ↑ Swart 2003
منابع[ویرایش]
- Swart, Bob (2003). Borland C++ Builder 6 Developer's Guide. Sams Publishing. ISBN 9780672324802.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- "Creating Precompiled Header Files". MSDN. Microsoft. 2015. Retrieved 2018-03-28.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- "Two Choices for Precompiling Code". MSDN. Microsoft. 2015. Retrieved 2018-03-28.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- "/Yc (Create Precompiled Header File)". MSDN. Microsoft. 2015. Retrieved 2018-03-28.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- The Clang Team (2018). "Pretokenized Headers (PTH)". Clang 7 documentation. Retrieved 2018-03-28.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- The Clang Team (2018). "Precompiled Header and Modules Internals". Clang 7 documentation. Retrieved 2018-03-28.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
لینک های خارجی[ویرایش]
- مراقبت و تغذیه سربرگهای از قبل کامپایل شده
- هدرهای پیش ساخته شده با GCC
- Fractal eXtreme: هدرهای precompiled
This article "سر تیترهای از پیش کامپایل شده" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:سر تیترهای از پیش کامپایل شده. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.