قفل المترجم العالمي

قفل المفسر العام ( GIL ) هو آلية تُستخدم في مترجمات لغات البرمجة لمزامنة تنفيذ الخيوط ، بحيث لا يمكن إلا لخيط أصلي واحد (لكل عملية) تنفيذ العمليات الأساسية (مثل تخصيص الذاكرة وحساب المراجع ) في كل مرة. [ 1 ] وكقاعدة عامة، لن يرى المفسر الذي يستخدم GIL سوى خيط واحد للتنفيذ في كل مرة، حتى لو كان يعمل على معالج متعدد النوى ، على الرغم من أن بعض التطبيقات توفر تعليمات برمجية مكثفة لوحدة المعالجة المركزية لتحرير GIL، مما يسمح لخيوط متعددة باستخدام نوى متعددة. ومن أشهر المفسرات التي تستخدم GIL: CPython و Ruby MRI .
مفاهيم الخلفية التقنية
قفل المفسر العام (GIL) هو قفل استبعاد متبادل يحتفظ به خيط مترجم لغة البرمجة لتجنب مشاركة التعليمات البرمجية غير الآمنة للاستخدام المتزامن مع خيوط أخرى. في التطبيقات التي تستخدم قفل المفسر العام، يوجد دائمًا قفل مفسر عام واحد لكل عملية مترجم .
يمكن تصميم التطبيقات التي تعمل على أنظمة مزودة بقفل المفسر العام (GIL) بحيث تستخدم عمليات منفصلة لتحقيق التوازي الكامل، حيث تمتلك كل عملية مترجمها الخاص، وبالتالي قفل المفسر العام الخاص بها. وإلا، فقد يشكل قفل المفسر العام عائقًا كبيرًا أمام التوازي.
المزايا
تشمل أسباب استخدام قفل المترجم العالمي ما يلي:
- زيادة سرعة البرامج أحادية الخيوط (لا حاجة للحصول على أو تحرير الأقفال على جميع هياكل البيانات بشكل منفصل)،
- سهولة دمج مكتبات لغة C التي عادة ما تكون غير آمنة للاستخدام المتزامن،
- سهولة التنفيذ (إن وجود GIL واحد أسهل بكثير في التنفيذ من مترجم خالٍ من الأقفال أو مترجم يستخدم أقفالًا دقيقة).
إحدى طرق التغلب على GIL هي إنشاء مترجم منفصل لكل سلسلة عمليات، وهو أمر مكلف للغاية مع معظم اللغات.
العيوب
يُحدّ استخدام قفل المفسر العام في لغة برمجة من مستوى التوازي الذي يُمكن تحقيقه من خلال تزامن عملية المفسر الواحد مع عدة خيوط. إذا كانت العملية تتكون بشكل شبه كامل من شيفرة مُفسَّرة ولا تُجري استدعاءات خارج المفسر تُؤدي إلى حظر العمليات لفترات طويلة (مما يسمح للخيط بتحرير قفل المفسر العام أثناء معالجته)، فمن المرجح أن يكون هناك تحسن طفيف جدًا في السرعة عند تشغيل العملية على جهاز متعدد المعالجات . ونظرًا للإشارة مع خيط مُقيَّد بوحدة المعالجة المركزية، فقد يُسبب ذلك تباطؤًا ملحوظًا، حتى على المعالجات أحادية النواة. [ 2 ] والأخطر من ذلك، عندما يستدعي الخيط الأصلي الوحيد عملية نظام تشغيل مُعطِّلة (مثل الوصول إلى القرص)، فإن العملية بأكملها تُحظر، حتى لو كانت خيوط التطبيق الأخرى تنتظر.
أمثلة
بعض تطبيقات اللغة التي تنفذ قفل المفسر العالمي هي CPython ، وهو التطبيق الأكثر استخدامًا على نطاق واسع للغة Python ، [ 3 ] [ 4 ] و Ruby MRI ، وهو التطبيق المرجعي للغة Ruby (حيث يسمى قفل الآلة الافتراضية العالمي).
لا تستخدم النسخ المكافئة لهذه اللغات والمبنية على JVM ( مثل Jython و JRuby ) أقفال المفسر العام. كما أن IronPython و IronRuby مبنيتان على بيئة تشغيل اللغات الديناميكية من مايكروسوفت، وتتجنبان استخدام قفل المفسر العام. [ 5 ]
ومن الأمثلة على اللغات المفسرة التي لا تحتوي على GIL لغة Tcl ، والتي تستخدم في أداة قياس الأداء HammerDB . [ 6 ]
مثال على التعليمات البرمجية
مثال على كود مكتوب بلغة بايثون . لاحظ كيف يتم الحصول على القفل وتحريره بين كل استدعاء للتعليمات. يستخدم هذا المثال كائن القفل من وحدة الخيوط . [ 7 ]
من مكتبة threading استورد Lockجدول التعليمات = { ... }دالة execute ( bytecode : list ) -> None : """تنفيذ البايت كود.""" lock = Lock () for ( opcode , args ) in bytecode : lock . acquire () INSTRUCTION_TABLE [ opcode ]( args ) lock . release ()التطورات الأخيرة
إصدار بدون خيوط (بايثون 3.13 والإصدارات الأحدث)
في بايثون 3.13، تم تقديم نسخة تجريبية من CPython تدعم الخيوط الحرة كجزء من اقتراح تحسين بايثون رقم 703 (PEP 703) - جعل قفل المفسر العام اختياريًا في CPython . تتيح هذه النسخة للمطورين تجميع بايثون بدون قفل المفسر العام (GIL)، مما يُمكّن من التنفيذ المتوازي الحقيقي لرمز بايثون البرمجي عبر أنوية معالجة متعددة. لا تزال هذه الميزة تجريبية، لكنها تُمثل خطوة هامة نحو تحسين التزامن في إصدارات بايثون المستقبلية. [ 8 ]
انظر أيضاً
مراجع
- ↑ "GlobalInterpreterLock" . ويكي بايثون . تم الاطلاع عليه بتاريخ 30 نوفمبر 2015 .
- ↑ ديفيد بيزلي (11 يونيو 2009). "داخل مُفسِّر قفل المفسر العام في بايثون" (ملف PDF) . شيكاغو: مجموعة مستخدمي بايثون في شيكاغو . تاريخ الاسترجاع : 7 أكتوبر 2009 .
- ↑ شانون - جي جي بيرنز (2008-02-03). "التزامن وبايثون" . مجلة دكتور دوبز . ص 2. تاريخ الاسترجاع 2008-07-12 .
يُعدّ قفل المفسر العام (GIL) آلية قفل تُستخدم لحماية جميع الأقسام الحرجة في بايثون. وبالتالي، حتى في حال وجود وحدات معالجة مركزية متعددة، لا يمكن إلا لخيط واحد تنفيذ مهام بايثون في وقت واحد.
- ↑ "دليل مرجع واجهة برمجة تطبيقات بايثون/سي: حالة الخيط وقفل المفسر العام" . مؤرشف من الأصل بتاريخ 14-09-2008 . تم الاطلاع عليه بتاريخ 15-08-2014 .
- ↑ "IronPython at python.org" . python.org . تم الاطلاع عليه بتاريخ 4 أبريل 2011.
لا يحتوي IronPython على GIL ويمكن للتعليمات البرمجية متعددة الخيوط استخدام معالجات متعددة النوى.
- ↑ "مفاهيم وبنية HammerDB" . HammerDB. 30-11-2018 . تم الاطلاع عليه بتاريخ 10-05-2020 .
من المهم أن نفهم منذ البداية أن HammerDB مكتوب بلغة TCL نظرًا لإمكانيات الترابط الفريدة التي توفرها هذه اللغة.
- ↑ "الترابط - التوازي القائم على الخيوط" . وثائق بايثون . تم الاطلاع عليه بتاريخ 16 أبريل 2025 .
- ↑ "PEP 703 - جعل قفل المفسر العام اختياريًا في CPython | peps.python.org" . مقترحات تحسين بايثون (PEPs) . تم الاطلاع عليه بتاريخ 13 نوفمبر 2025 .
- بايثون (لغة برمجة)
- التحكم في التزامن
