نموذج التنفيذ

في مجال الحوسبة ، تتكون لغة البرمجة من بنية نحوية ونموذج تنفيذ . يحدد نموذج التنفيذ سلوك عناصر اللغة. بتطبيق هذا النموذج، يمكن استنتاج سلوك برنامج مكتوب بتلك اللغة. على سبيل المثال، عندما يقرأ المبرمج شيفرة برمجية، فإنه يتخيل وظيفة كل سطر منها، محاكياً بذلك سلوك البرنامج في ذهنه. ما يفعله المبرمج هو تطبيق نموذج التنفيذ على الشيفرة، مما ينتج عنه سلوكها.

لكل لغة برمجة نموذج تنفيذ خاص بها، يحدد كيفية جدولة وحدات العمل (المشار إليها بصيغة البرنامج) للتنفيذ . تتضمن الأمثلة التفصيلية لمواصفات نماذج التنفيذ لبعض اللغات الشائعة ما يلي: نموذج تنفيذ لغة بايثون [ 1 ] ، ونموذج تنفيذ لغة البرمجة Unified Parallel C (UPC) [ 2 ] ، ومناقشة لأنواع مختلفة من نماذج التنفيذ، مثل نماذج تنفيذ اللغات الإجرائية مقابل اللغات الوظيفية [ 3 ] ، ومقال يناقش نماذج تنفيذ لغات البرمجة المضمنة في الوقت الحقيقي [ 4 ] .

تفاصيل نموذج التنفيذ

تُعدّ الدلالات التشغيلية إحدى طرق تحديد نموذج تنفيذ اللغة. يجب أن يتطابق السلوك الملاحظ للبرنامج قيد التشغيل مع السلوك المستمد من الدلالات التشغيلية (التي تُحدد نموذج تنفيذ اللغة).

يشمل نموذج التنفيذ أمورًا مثل تعريف وحدة العمل غير القابلة للتجزئة، والقيود المفروضة على ترتيب تنفيذ هذه الوحدات. على سبيل المثال، تُعد عملية الجمع وحدة عمل غير قابلة للتجزئة في العديد من لغات البرمجة، وفي اللغات التسلسلية، تُقيد هذه الوحدات بتنفيذها واحدة تلو الأخرى.

لتوضيح ذلك، لنأخذ لغة البرمجة C ، كما ورد وصفها في كتاب كيرنيغان وريتشي. [ 5 ] تحتوي لغة C على مفهوم يُسمى "التعليمات البرمجية". يُعرّف تعريف اللغة التعليمات البرمجية بأنها جزء من بنية اللغة ينتهي بفاصلة منقوطة (;). وينص تعريف اللغة على أن "تنفيذ البرنامج يتم بتتابع التعليمات البرمجية". تُعدّ عبارة "تنفيذ البرنامج يتم بتتابع التعليمات البرمجية" جزءًا من نموذج تنفيذ لغة C. تُشير هذه العبارة إلى أن التعليمات البرمجية وحدات عمل غير قابلة للتجزئة، وأنها تُنفّذ بنفس ترتيب ظهورها في بنية الكود (باستثناء الحالات التي تُغيّر فيها تعليمات التحكم، مثل IF أو FOR، الترتيب). من خلال النص على أن "تنفيذ البرنامج يتم بتتابع التعليمات البرمجية"، يفرض نموذج البرمجة قيودًا على ترتيب تنفيذ وحدات العمل.

تتضمن لغة C مستوىً إضافيًا في نموذج تنفيذها، وهو ترتيب الأسبقية. يحدد ترتيب الأسبقية قواعد ترتيب العمليات داخل كل عبارة. ويمكن اعتباره بمثابة تحديد للقيود المفروضة على تنفيذ وحدات العمل داخل كل عبارة. لذا، فإنّ عبارات ";" و"IF" و"WHILE" تُغطي قيود ترتيب العبارات، بينما يُغطي ترتيب الأسبقية قيود العمل داخل العبارة الواحدة. وبالتالي، تُعدّ هذه الأجزاء من مواصفات لغة C جزءًا من نموذج تنفيذها.

يمكن أن توجد نماذج التنفيذ بشكل مستقل عن لغات البرمجة، ومن أمثلتها مكتبة POSIX Threads ونموذج برمجة MapReduce الخاص بـ Hadoop . ويمكن تنفيذ نموذج التنفيذ عبر مُصرّف أو مُفسّر ، وغالبًا ما يتضمن نظام تشغيل .

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

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

مع ذلك، يمكن إنشاء مترجم فوري لأي لغة، وفي هذه الحالة تكون جميع قرارات ترتيب التنفيذ ديناميكية. ويمكن اعتبار المترجم الفوري مزيجًا من مترجم لغة ونموذج تنفيذ.

نموذج تنفيذ لغة التجميع مقابل التنفيذ بواسطة البنى الدقيقة

تحتوي لغات التجميع أيضًا على نماذج تنفيذ، تمامًا مثل أي لغة أخرى. يُنفَّذ نموذج التنفيذ هذا بواسطة بنية المعالج الدقيقة. على سبيل المثال، يُنفِّذ كلٌّ من خط أنابيب ذي خمس مراحل متسلسل ومعالج كبير غير متسلسل نفس نموذج تنفيذ لغة التجميع. نموذج التنفيذ هو تعريف السلوك، لذا يجب أن تُعطي جميع التطبيقات، سواء كانت متسلسلة أو غير متسلسلة أو مُفسَّرة أو مُترجمة في الوقت الفعلي، إلخ، نفس النتيجة تمامًا، وتُحدَّد هذه النتيجة بواسطة نموذج التنفيذ.

نماذج التنفيذ المتوازي

في العصر الحديث، باتت البرمجة المتوازية موضوعًا ذا أهمية متزايدة. تميل نماذج التنفيذ المتوازي إلى أن تكون معقدة نظرًا لاحتوائها على مسارات زمنية متعددة. تتضمن هذه النماذج بالضرورة سلوك بنى التزامن ، التي تُحدد ترتيب الأنشطة في مسار زمني معين بالنسبة للأنشطة في مسار زمني آخر.

على سبيل المثال، يُعد القفل أحد بنى التزامن الشائعة. لنفترض وجود خط زمني. يحتوي هذا الخط الزمني على نقطة يُنفذ عندها بنية التزامن "الاستحواذ على القفل". في سلاسل POSIX، تكون هذه النقطة هي ` pthread_mutex_lock(&myMutex). في Java، تكون ` lock.lock(). في كلتا الحالتين، يُسمى الخط الزمني `خيطًا`. نماذج التنفيذ في لغتي C و Java متسلسلة، وتنص على أن الخط الزمني يتضمن أنشطة تسبق استدعاء "الاستحواذ على القفل"، وأنشطة تلي هذا الاستدعاء. وبالمثل، توجد عملية "التخلي عن القفل". في لغة C، تكون هذه العملية هي ` pthread_mutex_unlock(&myMutex). في Java، تكون ` lock.unlock(). مرة أخرى، تُحدد نماذج التنفيذ في لغتي C و Java أن مجموعة من التعليمات تُنفذ قبل التخلي عن القفل، ومجموعة أخرى تُنفذ بعد التخلي عنه.

لنفترض الآن وجود خطين زمنيين، أو ما يُعرف بخيطين. يقوم أحد الخيطين، ولنسمّه الخيط A، بتنفيذ بعض التعليمات، ولنسمّها A-pre-gain-lockتعليمات. ثم ينفّذ الخيط A تعليمة "الاستحواذ على القفل"، ثم ينفّذ تعليمات "ما بعد الاستحواذ على القفل"، والتي تأتي بعد أن يستحوذ الخيط A على القفل. وأخيرًا، ينفّذ الخيط A تعليمة "التخلي عن القفل". ثم ينفّذ الخيط A A-post-giveup-lockتعليمات أخرى.

يقوم خيط ثانٍ، لنسميه الخيط B، بتنفيذ بعض التعليمات، ولنسميها B-pre-lockتعليمات. ثم يقوم الخيط B بتنفيذ "الحصول على ملكية القفل"، ثم يقوم الخيط B بتنفيذ تعليمات ما بعد القفل، والتي تأتي بعد أن يحصل B على ملكية القفل.

الآن، يمكننا القول إن نموذج التنفيذ المتوازي لبنية التزامن "اكتساب ملكية القفل" و"التخلي عن ملكية القفل" هو كالتالي:

"في حالة انتقال ملكية القفل من الخيط أ إلى الخيط ب، A-post-gain-lockتأتي البيانات قبل B-post-gain-lockالبيانات."

تكمن المشكلة في أن نموذج التنفيذ لا يتيح أي وسيلة لتنفيذ أمر "التخلي عن ملكية القفل" للتأثير على تنفيذ أمر "اكتساب ملكية القفل" الذي يليه في مسار زمني (خيط) آخر. في كثير من الأحيان، لا تُعطي سوى عمليات تسليم معينة نتائج صحيحة. لذا، يجب على المبرمج التفكير في جميع الاحتمالات الممكنة لتخلي خيط عن القفل واكتسابه من قبل خيط آخر، والتأكد من أن الكود الخاص به لا يسمح إلا بالاحتمالات الصحيحة.

التأثير الوحيد هو أن A-post-gain-lockالتعليمات تسبق B-post-gain-lockالتعليمات الأخرى. لا يوجد أي تأثير آخر، ولا يمكن الاعتماد على أي ترتيب نسبي آخر. على وجه التحديد، A-post-give-up-lockلا B-post-gain-lockيوجد ترتيب نسبي محدد للتعليمات، وهو ما يُفاجئ الكثيرين. ولكن قد يتم استبدال الخيط A بعد التخلي عن ملكيته، لذا A-post-give-up-lockقد تحدث التعليمات بعد فترة طويلة من B-post-gain-lockانتهاء العديد من التعليمات الأخرى. هذا أحد الاحتمالات التي يجب مراعاتها عند تصميم الأقفال، ويُوضح سبب صعوبة البرمجة متعددة الخيوط.

تتميز لغات البرمجة المتوازية الحديثة بنماذج تنفيذ أسهل استخدامًا. كان نموذج الخيوط أحد نماذج التنفيذ المتوازية الأصلية، وهو ما قد يفسر استمراره رغم صعوبة استخدامه.

انظر أيضاً

مراجع

  1. "وثائق بايثون: نموذج التنفيذ" .
  2. "ميزات لغة رمز المنتج العالمي" .
  3. كاردوسو، جيه إم بي؛ دينيز، بي سي (2011). لغات البرمجة ونماذج التنفيذ . سبرينغر الولايات المتحدة. ISBN 9780387096711.
  4. بيليزوني، ر.؛ بيتي، إ.؛ باك، س.؛ ياو، ج.؛ كريسويل، ج.؛ كاكامو، م.؛ وكيجلي، ر. (2011). "نموذج تنفيذ قابل للتنبؤ للأنظمة المدمجة القائمة على مكونات جاهزة للاستخدام" (ملف PDF) . ندوة تطبيقات وتقنيات الأنظمة المدمجة والوقت الحقيقي . معهد مهندسي الكهرباء والإلكترونيات. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 12 أغسطس 2017. تم الاطلاع عليه بتاريخ 20 مايو 2015 .
  5. كيرنيغان، برايان دبليودينيس إم. ريتشي (فبراير 1978). لغة البرمجة سي ( الطبعة الأولى). إنجلوود كليفس، نيوجيرسي : برنتيس هول . ISBN  0-13-110163-3.