بناء الوحدة
في هندسة البرمجيات، بناء الوحدة (المعروف أيضًا باسم البناء الموحد أو بناء الجامبو) هي طريقة مستخدمة في تطوير برامج سي وسي++ لتسريع تجميع المشاريع من خلال الجمع بين وحدات الترجمة المتعددة في وحدة واحدة، وعادة ما يتم تحقيقها باستخدام توجيهات التضمين لتجميع ملفات مصدر متعددة في ملف واحد أكبر.
تنفيذ
عدل
إذا كانت هناك وحدتان ترجمة مختلفتان file_a.cc
#include "header.h"
// content of source file A ...
وfile_b.cc
#include "header.h"
// content of source file B ...
في نفس المشروع كلاهما يشمل عنوانheader.h
، ستتم معالجة هذا العنوان مرتين بواسطة سلسلة المترجم، مرة واحدة لكل مهمة بناء. إذا تم دمج وحدتي الترجمة في ملف مصدر واحد jumbo_file.cc
#include "file_a.cc"
#include "file_b.cc"
ثم سيتم معالجة header.h
مرة واحدة فقط (بفضل تضمين الحراس) عند تجميع jumbo_file.cc
.[1]
تأثيرات
عدلتتمثل الفائدة الرئيسية لبناء الوحدات في تقليل الجهد المكرر في تحليل وتجميع محتوى العناوين التي يتم تضمينها في أكثر من ملف مصدر واحد. عادة ما يمثل محتوى العنوان غالبية التعليمات البرمجية في ملف مصدر بعد المعالجة المسبقة. تعمل وحدات البناء أيضًا على التخفيف من التكلفة غير المباشرة الزائدة نظرًا لوجود عدد كبير من الملفات ذات المصدر الصغير عن طريق تقليل عدد ملفات الكائنات التي تم إنشاؤها ومعالجتها بواسطة سلسلة التجميع، وتسمح بالتحليل التعبيري والتحسين عبر الملفات التي تشكل مهمة بناء الوحدة (على غرار آثار تحسين وقت الارتباط). إنها تسهل أيضًا اكتشاف انتهاكات قاعدة التعريف الواحد، لأنه إذا تم تعريف الرمز مرتين في ملفات مصدر مختلفة في نفس بنية الوحدة، فسيكون المترجم قادرًا على تحديد إعادة التعريف وانبعاث تحذير أو خطأ.
من عيوب بناء الوحدة وجود ذاكرة أكبر بسبب وحدات الترجمة الأكبر. يمكن أن تؤثر وحدات الترجمة الأكبر أيضًا بشكل سلبي على البنى المتوازية، نظرًا لأن عددًا صغيرًا من وظائف الترجمة الكبيرة يكون من الصعب أو المستحيل جدولة إشباع جميع موارد الحوسبة المتوازية المتاحة بشكل فعال. يمكن لبنيات الوحدة أيضًا أن تنكر جزءًا من مزايا البنيات الإضافية، التي تعتمد على إعادة بناء أقل قدر ممكن من التعليمات البرمجية، أي وحدات الترجمة المتأثرة بالتغييرات منذ آخر بناء.
إن لبنى الوحدة تأثيرات خطيرة محتملة على دلالات البرامج. قد تفشل بعض تراكيب سي++ الصالحة التي تعتمد على الارتباط الداخلي في بناء الوحدة، على سبيل المثال، اشتباكات الرموز الثابتة والرموز المحددة في مساحات أسماء مجهولة الهوية مع نفس المعرف في ملفات مختلفة. إذا حددت ملفات سي++ مختلفة وظائف مختلفة بنفس الاسم، فقد يحل المترجم بشكل غير متوقع التحميل الزائد عن طريق تحديد وظيفة خاطئة، بطريقة غير ممكنة عند تصميم البرنامج مع الملفات كوحدات ترجمة مختلفة. التأثير السلبي الآخر هو التسرب المحتمل لتعريفات الماكرو عبر ملفات المصدر المختلفة.[2]
بناء دعم النظام
عدلتوفر بعض أنظمة البناء دعمًا مدمجًا لبناء الوحدات المؤتمت، بما في ذلك مايكروسوفت فيجوال ستوديو،[3] وMeson،[4] وCMake.[5]
مراجع
عدل- ^ Kubota et al. (2019)
- ^ Viktor Kirilov (7 يوليو 2018). "A guide to unity builds". مؤرشف من الأصل في 2020-01-17.
- ^ Olga Arkhipova (2 يوليو 2018). "Support for Unity (Jumbo) Files in Visual Studio 2017 15.8 (Experimental)". Microsoft. مؤرشف من الأصل في 2020-05-18.
- ^ "Unity builds". مؤرشف من الأصل في 2020-05-22.
- ^ "UNITY_BUILD - CMake 3.17.0 Documentation". مؤرشف من الأصل في 2020-07-21.
- Kubota، Takafumi؛ Yusuke، Suzuki؛ and، Kenji Kono (2019). "To unify or not to unify: a case study on unified builds (in WebKit).". Proceedings of the 28th International Conference on Compiler Construction.