رأس مُجمَّع مسبقًا

في برمجة الحاسوب ، يُعدّ ملف الرأس المُجمّع مسبقًا ( PCH ) ملف رأس ( C أو C++ ) يُجمّع إلى صيغة وسيطة أسرع في المعالجة بالنسبة للمُجمّع . يُمكن أن يُقلّل استخدام ملفات الرأس المُجمّعة مسبقًا وقت التجميع بشكلٍ ملحوظ ، خاصةً عند تطبيقه على ملفات الرأس الكبيرة، أو ملفات الرأس التي تتضمن العديد من ملفات الرأس الأخرى، أو ملفات الرأس المُضمّنة في العديد من وحدات الترجمة . كانت فكرة ملفات الرأس المُجمّعة مسبقًا أساسيةً في تطوير وحدات C++ .

الأساس المنطقي

في لغتي البرمجة C و C++ ، ملف الرأس هو ملف يمكن تضمين نصه تلقائيًا في ملف مصدر آخر بواسطة معالج C المسبق باستخدام توجيه المعالج المسبق في ملف المصدر.

قد تحتوي ملفات الرأس أحيانًا على كميات كبيرة جدًا من التعليمات البرمجية المصدرية (على سبيل المثال، ملفات الرأس windows.hفي Cocoa/Cocoa.hنظامي التشغيل مايكروسوفت ويندوز وماك أو إس إكس على التوالي). يزداد هذا الأمر وضوحًا مع ظهور مكتبات "الرأس" الضخمة التي تستخدم القوالب بشكل مكثف ، مثل Eigen و Boost و POCO . تُكتب هذه المكتبات بالكامل تقريبًا كملفات رأس يقوم المستخدم #includeبتجميعها، بدلًا من ربطها أثناء التشغيل. وبالتالي، في كل مرة يُجمّع فيها المستخدم برنامجه، فإنه يُعيد تجميع العديد من مكتبات الرأس أيضًا. (في المكتبات غير "الرأسية"، تُجمّع هذه المكتبات مسبقًا في كائنات مشتركة أو مكتبات ارتباط ديناميكي ).

لتقليل أوقات التجميع، تسمح بعض المترجمات بتجميع ملفات الرأس إلى شكل أسرع في المعالجة. يُعرف هذا الشكل الوسيط باسم ملف رأس مُجمَّع مسبقًا ، ويُحفظ عادةً في ملف يحمل الامتداد .gm .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++ (الإصدار 6.0 والإصدارات الأحدث ) تجميع أي كود مسبقًا، وليس فقط ملفات الرأس. [ 1 ] ويمكنه القيام بذلك بطريقتين: إما تجميع جميع الأكواد مسبقًا حتى ملف يتطابق اسمه مع الخيار المحدد، أو (عند تحديد الخيار بدون أي خيار آخر ) تجميع جميع الأكواد مسبقًا حتى أول ظهور للرمز في الكود. [ 2 ] [ 3 ] يتم حفظ الناتج المُجمَّع مسبقًا في ملف يحمل اسم الرمز المحدد للخيار ، مع إضافة امتداد، أو في ملف يحمل الاسم المحدد بواسطة الخيار. [ 3 ] يؤدي استخدام الخيار ، التابع للخيار الآخر عند استخدامهما معًا، إلى استخدام المُجمِّع للكود المُجمَّع مسبقًا من هذا الملف. [ 3 ]/Ycfilename/Ycfilename#pragma hdrstopfilename/Yc.pch/Fpfilename/Yu/Yc

pch.h(المسمى stdafx.hقبل Visual Studio 2017 [ 4 ] ) هو ملف تم إنشاؤه بواسطة معالج Microsoft Visual Studio IDE ، والذي يصف كلاً من ملفات النظام القياسية وملفات المشروع الخاصة التي يتم استخدامها بشكل متكرر ولكن نادرًا ما تتغير.

يشير اختصار afx إلى stdafx.hملحقات إطار عمل التطبيق . وكان AFX هو الاختصار الأصلي لـ Microsoft Foundation Classes (MFC). بينما كان اسم الملف stdafx.h يُستخدم افتراضيًا في مشاريع MSVC قبل الإصدار 2017، يُمكن تحديد أي اسم بديل يدويًا.

ستقوم المترجمات المتوافقة بتجميع هذا الملف مسبقًا لتقليل أوقات التجميع الإجمالية. لن يقوم Visual C++ بتجميع أي شيء قبل السطر #include "pch.h"`<code>` في ملف المصدر، إلا إذا تم إلغاء تحديد خيار التجميع /Yu'pch.h'(وهو الخيار الافتراضي)؛ إذ يفترض أن جميع التعليمات البرمجية في المصدر حتى ذلك السطر مُجمّعة بالفعل.

مجلس التعاون الخليجي

يدعم مُجمِّع GCC (الإصدار 3.4 والإصدارات الأحدث) ملفات الرأس المُجمَّعة مسبقًا. ويتشابه أسلوب GCC في ذلك مع أسلوب مُجمِّع VC والمُجمِّعات المُتوافقة معه. يحفظ GCC نسخًا مُجمَّعة مسبقًا من ملفات الرأس باستخدام .gchلاحقة " ". عند تجميع ملف مصدر، يتحقق المُجمِّع مما إذا كان هذا الملف موجودًا في نفس المجلد، ويستخدمه إن أمكن.

لا يمكن لمترجم GCC استخدام النسخة المُجمّعة مسبقًا إلا إذا تم ضبط نفس خيارات المُترجم كما في وقت تجميع ملف الرأس، ولا يمكنه استخدام أكثر من خيار واحد. علاوة على ذلك، لا يمكن وضع سوى تعليمات المعالج المسبق قبل ملف الرأس المُجمّع مسبقًا (لأنه يجب تضمينه بشكل مباشر أو غير مباشر من خلال ملف رأس عادي آخر، قبل أي كود قابل للتجميع).

يتعرف برنامج GCC تلقائيًا على معظم ملفات الرأس من خلال امتدادها. مع ذلك، إذا فشل ذلك (على سبيل المثال بسبب امتدادات غير قياسية لملفات الرأس)، -xيمكن استخدام الخيار لضمان تعامل GCC مع الملف كملف رأس.

كلانغ

أضاف مُصرّف clang دعمًا لملفات الرأس المُجمّعة مسبقًا (PCH) في الإصدار Clang 2.5 / LLVM 2.5 لعام 2009. [ 5 ] يقوم المُصرّف بتقسيم كود المصدر المُدخل إلى رموز، ويُجري تحليلات نحوية ودلالية لملفات الرأس، ويكتب شجرة بناء الجملة المجردة (AST) وجدول الرموز المُولّدين داخليًا بواسطة المُصرّف إلى ملف رأس مُجمّع مسبقًا. [ 6 ]

يشكل نظام الترويسات المُجمَّعة مسبقًا في clang، مع بعض التحسينات مثل إمكانية إشارة ترويسة مُجمَّعة مسبقًا إلى ترويسة أخرى مُجمَّعة مسبقًا تُستخدم داخليًا، أساس آلية الوحدات النمطية الخاصة به. [ 6 ] ويستخدم نفس تنسيق ملف البت كود الذي يستخدمه LLVM ، مُغلَّفًا في أقسام خاصة بـ clang ضمن ملفات تنسيق ملف الكائن المشترك ( COMF) أو تنسيق الربط القابل للتوسيع (EXTIN) . [ 6 ]

C++Builder

في إعدادات المشروع الافتراضية، يقوم مُصرّف C++Builder تلقائيًا بإنشاء ملفات رأس مُجمّعة مسبقًا لجميع ملفات الرأس المُضمّنة في وحدة المصدر حتى #pragma hdrstopيتم العثور على السطر المطلوب. [ 7 ] : 76 يتم مشاركة ملفات الرأس المُجمّعة مسبقًا بين جميع وحدات المشروع إن أمكن. على سبيل المثال، عند العمل مع مكتبة المكونات المرئية ( VCL )، من الشائع تضمين vcl.hملف الرأس أولًا، والذي يحتوي على معظم ملفات رأس VCL شائعة الاستخدام. وبالتالي، يمكن مشاركة ملف الرأس المُجمّع مسبقًا بين جميع وحدات المشروع، مما يُقلّل بشكل كبير من أوقات الإنشاء.

بالإضافة إلى ذلك، يمكن تجهيز C++Builder لاستخدام ملف رأس معين كرأس مُجمَّع مسبقًا، على غرار الآلية التي يوفرها Visual C++.

يقدم C++Builder 2009 "معالج الرؤوس المضمنة مسبقًا" الذي يقوم بتحليل جميع وحدات المصدر الخاصة بالمشروع بحثًا عن ملفات الرأس المضمنة، ويصنفها (أي يستبعد ملفات الرأس إذا كانت جزءًا من المشروع أو لا تحتوي على حارس تضمين ) ويقوم بإنشاء واختبار رأس مضمن مسبقًا للملفات المحددة تلقائيًا.

رؤوس مُجزأة مسبقًا

ملف رأس مُعَدَّل مسبقًا (PTH) هو ملف رأس مُخزَّن بصيغة خضعت لتحليل معجمي ، ولكن لم تُجرَ عليه أي عمليات دلالية. كان ملف PTH موجودًا في Clang قبل أن يدعم PCH، كما جُرِّب أيضًا في فرع من GCC. [ 8 ]

بالمقارنة مع آلية PCH الكاملة، تتميز PTH بميزتي استقلال اللغة (واللهجة)، حيث يكون التحليل المعجمي متشابهًا في لغات عائلة C، واستقلال البنية، إذ يمكن استخدام نفس سلسلة الرموز عند الترجمة لبنى مستهدفة مختلفة. [ 9 ] مع ذلك، يعيبها أنها لا تتجاوز التحليل المعجمي البسيط، مما يتطلب إجراء تحليل نحوي ودلالي لسلسلة الرموز مع كل عملية ترجمة. إضافةً إلى ذلك، يتناسب وقت الترجمة طرديًا مع حجم الملف المُجزأ مسبقًا بالرموز المعجمية، وهو ما لا ينطبق بالضرورة على آلية الترجمة المسبقة الكاملة (تسمح PCH في clang بالوصول العشوائي). [ 9 ]

تتضمن آلية التجزئة المسبقة في Clang عدة آليات ثانوية لمساعدة المعالج المسبق: تخزين معلومات وجود الملف وتاريخه مؤقتًا، وتسجيل حراس التضمين بحيث يمكن تخطي التعليمات البرمجية المحمية بسرعة. [ 9 ]

الوحدات

تُشبه الوحدات البرمجية، التي تم تقديمها في C++20 ، وظيفة ملفات الرأس المُجمّعة مسبقًا، حيث تُجمّع إلى ملفات بامتداد .pcm (ملفات الوحدات المُجمّعة مسبقًا)، على غرار ملفات .pch لملفات الرأس المُجمّعة مسبقًا. تُتيح الوحدات البرمجية تغليفًا وتحكمًا أكبر في الرموز المُصدّرة، ومثل ملفات الرأس المُجمّعة مسبقًا، تُسرّع عملية التجميع. [ 10 ] يتولى المُجمّع معالجة الوحدات البرمجية بالكامل، وليس المُعالج المُسبق، وبالتالي، على عكس ملفات الرأس المُجمّعة مسبقًا، لا يُمكنها تصدير وحدات الماكرو نظرًا لمعالجتها بعد خطوة المعالجة المُسبقة.

منذ إصدار C++23 ، يتم توفير مكتبة C++ القياسية كوحدة نمطية. [ 11 ]

انظر أيضاً

ملحوظات

مراجع

  1. "إنشاء ملفات رأسية مُجمّعة مسبقًا" . MSDN . مايكروسوفت. 2015. مؤرشف من الأصل بتاريخ 28-03-2018 . تم الاطلاع عليه بتاريخ 28-03-2018 .
  2. "خياران لتجميع التعليمات البرمجية مسبقًا" . MSDN . مايكروسوفت. 2015. تم الاطلاع عليه بتاريخ 28-03-2018 .
  3. 1 2 3 "/Yc (إنشاء ملف رأس مُجمَّع مسبقًا)" . MSDN . مايكروسوفت. 2015. تم الاسترجاع في 28-03-2018 .
  4. "هل يمكنني استخدام #include "pch.h" بدلاً من #include "stdafx.h" كملفات رأسية قبل التجميع في Visual Studio C++؟" . Stack Overflow .
  5. "ملاحظات إصدار LLVM 2.5" . releases.llvm.org .
  6. 1 2 3 فريق Clang (2018). "التفاصيل الداخلية للملفات الرأسية والوحدات النمطية المُجمَّعة مسبقًا" . وثائق Clang 7. تم الاطلاع بتاريخ 28-03-2018 .
  7. سوارت، بوب (2003). دليل مطوري Borland C++ Builder 6. دار نشر Sams. رقم ISBN 9780672324802.
  8. "pph - GCC Wiki" . gcc.gnu.org .
  9. ١ ٢ ٣ فريق Clang (٢٠١٨). "الرؤوس المُعَلَّمة مسبقًا (PTH)" . وثائق Clang 7. مؤرشف من الأصل بتاريخ ٢٠١٨-٠٣-٢٢ . تم الاطلاع عليه بتاريخ ٢٠١٨-٠٣-٢٨ .
  10. cppreference.com (2025). "الوحدات (منذ C++20)" . تم الاطلاع عليه بتاريخ 2025-02-20 .
  11. cppreference.com (2025). "مكتبة C++ القياسية" . تم الاطلاع عليه بتاريخ 20 فبراير 2025 .