صوت ارتطام
في برمجة الحاسوب ، يُعرف "الثنك" بأنه روتين فرعي يُستخدم لإدخال عملية حسابية في روتين فرعي آخر. تُستخدم الثنك بشكل أساسي لتأخير العملية الحسابية حتى الحاجة إلى نتيجتها، أو لإدراج عمليات في بداية أو نهاية الروتين الفرعي الآخر. ولها تطبيقات أخرى عديدة في توليد شيفرة المترجم والبرمجة المعيارية .
نشأ المصطلح كصيغة شاذة غريبة من الفعل " think " . ويشير إلى الاستخدام الأصلي لـ "thunks" في مترجمات لغة ALGOL 60 ، والتي كانت تتطلب تحليلاً خاصاً (تفكيراً) لتحديد نوع الروتين المطلوب توليده. [ 1 ] [ 2 ]
خلفية
شهدت السنوات الأولى لأبحاث المترجمات تجارب واسعة النطاق على استراتيجيات تقييم مختلفة . وكان السؤال الرئيسي هو كيفية ترجمة استدعاء روتين فرعي إذا كانت الوسائط عبارة عن تعابير رياضية عشوائية وليست ثوابت. أحد الأساليب، المعروف باسم " الاستدعاء بالقيمة "، يحسب جميع الوسائط قبل الاستدعاء ثم يمرر القيم الناتجة إلى الروتين الفرعي. أما في أسلوب " الاستدعاء بالاسم " المنافس، فيتلقى الروتين الفرعي تعبير الوسيط غير المُقيَّم ويجب عليه تقييمه.
قد يؤدي تطبيق بسيط لتقنية "الاستدعاء بالاسم" إلى استبدال رمز تعبير الوسيط بكل ظهور للمعامل المقابل في الروتين الفرعي، لكن هذا قد ينتج عنه نسخ متعددة من الروتين الفرعي ونسخ متعددة من رمز التعبير. ولتحسين هذه التقنية، يمكن للمترجم إنشاء روتين فرعي مساعد، يُسمى " ثونك" ، يقوم بحساب قيمة الوسيط. ثم يتم تمرير عنوان وبيئة [ a ] هذا الروتين المساعد إلى الروتين الفرعي الأصلي بدلاً من الوسيط الأصلي، حيث يمكن استدعاؤه عدة مرات حسب الحاجة. وقد وصف بيتر إنجرمان تقنية "الثونك" لأول مرة في سياق لغة البرمجة ALGOL 60، التي تدعم التقييم بالاستدعاء بالاسم. [ 4 ]
التطبيقات
البرمجة الوظيفية
على الرغم من أن صناعة البرمجيات اعتمدت إلى حد كبير على التقييم بالقيمة والتقييم بالمرجع ، [ 5 ] إلا أن دراسة التقييم بالاسم استمرت في مجتمع البرمجة الوظيفية . وقد أسفر هذا البحث عن سلسلة من لغات البرمجة ذات التقييم الكسول ، حيث يُعدّ أحد أشكال التقييم بالاسم استراتيجية التقييم القياسية. وقد اعتمدت مُجمِّعات هذه اللغات، مثل مُجمِّع غلاسكو هاسكل ، بشكل كبير على الدوال المؤقتة (thunks)، مع ميزة إضافية تتمثل في حفظ هذه الدوال لنتائجها الأولية لتجنب إعادة حسابها؛ [ 6 ] ويُعرف هذا باسم التخزين المؤقت أو التقييم عند الحاجة .
أتاحت لغات البرمجة الوظيفية للمبرمجين إمكانية إنشاء دوال وسيطة (thunks) بشكل صريح. ويتم ذلك في الشيفرة المصدرية عن طريق تغليف تعبير وسيط بدالة مجهولة لا تحتوي على أي معلمات خاصة بها. يمنع هذا التعبير من التقييم حتى تستدعي دالة أخرى الدالة المجهولة، محققًا بذلك نفس تأثير الاستدعاء بالاسم. [ 7 ] وقد ساهم اعتماد الدوال المجهولة في لغات برمجة أخرى في إتاحة هذه الإمكانية على نطاق واسع.
البرمجة الكائنية التوجه
تُعدّ الدوال المساعدة (Thunks) مفيدة في منصات البرمجة كائنية التوجه ، حيث تسمح للفئة بتوريث واجهات متعددة ، مما يؤدي إلى حالات يمكن فيها استدعاء نفس الدالة عبر أي من هذه الواجهات. يوضح الكود التالي مثل هذه الحالة في لغة C++ .
class A { public : virtual int Access () const { return value_ ; }خاص : قيمة عددية _ ؛ };class B { public : virtual int Access () const { return value_ ; }خاص : قيمة عددية _ ؛ };class C : public A , public B { public : int Access () const override { return better_value_ ; }خاص : عدد صحيح better_value_ ؛ };int use ( B * b ) { return b -> Access (); }int main () { // ... B some_b ; use ( & some_b ); C some_c ; use ( & some_c ); }في هذا المثال، سيحتوي الكود المُولّد لكل من الفئات A وB وC على جدول توجيه يُمكن استخدامه لاستدعاء Accessكائن من ذلك النوع، عبر مرجع من نفس النوع. تحتوي الفئة C على جدول توجيه إضافي، يُستخدم لاستدعاء Accessكائن من النوع C عبر مرجع من النوع B. سيستخدم التعبير جدول b->Access()التوجيه الخاص بالفئة B أو جدول C الإضافي، اعتمادًا على نوع الكائن الذي يُشير إليه b. إذا كان يُشير إلى كائن من النوع C، فيجب على المُصرّف التأكد من أن Accessتنفيذ الفئة C يتلقى عنوان مثيل للكائن C بأكمله، بدلاً من الجزء B الموروث من ذلك الكائن. [ 8 ]
كحل مباشر لمشكلة تعديل المؤشر هذه، يمكن للمترجم تضمين إزاحة عددية صحيحة في كل مدخل من مداخل جدول التوزيع. هذه الإزاحة هي الفرق بين عنوان المرجع والعنوان المطلوب لتنفيذ الدالة. يجب على الكود المُولّد لكل استدعاء عبر جداول التوزيع هذه استرجاع الإزاحة واستخدامها لتعديل عنوان الكائن قبل استدعاء الدالة.
يُعاني الحل الموصوف آنفًا من مشاكل مشابهة للتنفيذ البسيط لتقنية الاستدعاء بالاسم المذكورة سابقًا: إذ يُنشئ المُصرّف نسخًا متعددة من التعليمات البرمجية لحساب وسيط (عنوان الكائن)، مع زيادة أحجام جداول التوزيع لاستيعاب الإزاحات. وكبديل، يُمكن للمُصرّف إنشاء دالة وسيطة (thunk) مع تنفيذ لغة C، Accessتُعدّل عنوان الكائن بالمقدار المطلوب ثم تستدعي الدالة. يُمكن أن تظهر هذه الدالة الوسيطة في جدول توزيع C للدالة B، مما يُغني المُستدعين عن تعديل العنوان بأنفسهم. [ 9 ]
قابلية التشغيل البيني
تُستخدم الدوال الوسيطة (Thunks) على نطاق واسع لتوفير التوافق بين وحدات البرامج التي لا تستطيع إجراءاتها استدعاء بعضها البعض مباشرةً. قد يحدث هذا بسبب اختلاف اصطلاحات الاستدعاء ، أو تشغيلها في أوضاع معالجة مركزية أو مساحات عناوين مختلفة ، أو تشغيل إحداها على الأقل في آلة افتراضية . يمكن للمترجم (أو أي أداة أخرى) حل هذه المشكلة عن طريق إنشاء دالة وسيطة تُؤتمت الخطوات الإضافية اللازمة لاستدعاء الإجراء المستهدف، سواءً كان ذلك تحويل الوسائط، أو نسخها إلى موقع آخر، أو تغيير وضع المعالجة المركزية. تُقلل الدالة الوسيطة الناجحة من العمل الإضافي الذي يجب على المُستدعي القيام به مقارنةً بالاستدعاء العادي.
تتعلق معظم الدراسات المنشورة حول تقنيات التوافق التشغيلي (Thunks) بمنصات ويندوز المختلفة ، بما في ذلك MS -DOS و OS/2 [ 10 ] وويندوز [ 11 ] [ 12 ] [ 13 ] [ 14 ] و .NET ، وبالانتقال من عنونة الذاكرة 16 بت إلى 32 بت . ومع انتقال المستخدمين من منصة إلى أخرى، أصبحت تقنيات التوافق التشغيلي ضرورية لدعم البرامج القديمة المصممة للمنصات الأقدم. ويُعد UEFI CSM مثالًا آخر على استخدام تقنيات التوافق التشغيلي مع برامج الإقلاع القديمة .
يستخدم الانتقال من التعليمات البرمجية 32 بت إلى 64 بت على معالجات x86 أيضًا نوعًا من تقنية الربط ( WoW64 ). مع ذلك، ولأن مساحة عناوين x86-64 أكبر من تلك المتاحة للتعليمات البرمجية 32 بت، لم يكن بالإمكان استخدام آلية "الربط العام" القديمة لاستدعاء التعليمات البرمجية 64 بت من التعليمات البرمجية 32 بت. [ 15 ] الحالة الوحيدة لاستدعاء التعليمات البرمجية 32 بت للتعليمات البرمجية 64 بت هي في تقنية الربط التي تستخدمها WoW64 لواجهات برمجة تطبيقات Windows إلى 32 بت.
التراكبات والربط الديناميكي
في الأنظمة التي تفتقر إلى أجهزة ذاكرة افتراضية تلقائية ، يمكن لـ thunks تنفيذ شكل محدود من الذاكرة الافتراضية يُعرف باسم overlays . باستخدام overlays، يقسم المطور كود البرنامج إلى أجزاء يمكن تحميلها وتفريغها بشكل مستقل، ويحدد نقاط الدخول إلى كل جزء. يجب على أي جزء يستدعي جزءًا آخر أن يفعل ذلك بشكل غير مباشر عبر جدول التفرع . عندما يكون جزء ما في الذاكرة، تنتقل إدخالات جدول التفرع الخاصة به إلى ذلك الجزء. عند تفريغ جزء ما، تُستبدل إدخالاته بـ "وحدات إعادة تحميل thunks" التي يمكنها إعادة تحميله عند الطلب. [ 16 ]
وبالمثل، يمكن للأنظمة التي تربط وحدات البرنامج ديناميكيًا أثناء التشغيل استخدام الدوال الوسيطة (thunks) لربط هذه الوحدات. إذ يمكن لكل وحدة استدعاء الوحدات الأخرى من خلال جدول الدوال الوسيطة الذي يملأه الرابط عند تحميل الوحدة. وبهذه الطريقة، يمكن للوحدات التفاعل دون معرفة مسبقة بمواقعها في الذاكرة. [ 17 ]
انظر أيضاً
تقنيات ثانك
- واجهة الوضع المحمي لنظام التشغيل DOS (DPMI)
- خدمات الوضع المحمي لنظام DOS (DPMS)
- J/Direct
- طبقة مايكروسوفت لليونيكود
- خدمات استدعاء المنصة
- Win32s
- ويندوز على ويندوز
- وحدة دعم التوافق
- WoW64
- libffi
- Wine (منذ الإصدار 9.0) [ 18 ]
مفاهيم ذات صلة
ملحوظات
مراجع
- يرفض إريك ريموند "بعض الخرافات الصوتية المتداولة حول أصل هذا المصطلح"، ويستشهد بمخترعي مصطلح "thunk" الذين يذكرون أن المصطلح "صِيغَ بعد أن أدركوا (في ساعات متأخرة من الليل بعد ساعات من النقاش) أنه يمكن تحديد نوع الحجة في لغة Algol-60 مسبقًا بقليل من التفكير أثناء وقت الترجمة [...] بعبارة أخرى، لقد "تم التفكير فيه بالفعل"؛ ومن هنا جاء اسم " thunk" ، وهو "الماضي من كلمة "think" في الساعة الثانية صباحًا". انظر: ريموند، إريك س. (1996). ريموند، إريك س. (محرر). قاموس المخترق الجديد . مطبعة معهد ماساتشوستس للتكنولوجيا. ص 445. ISBN 9780262680929تم الاطلاع عليه بتاريخ 25-05-2015 .
- ↑ انظر إنجرمان (1961): "يعرف المترجم نوع الدالة التي يجب إنشاؤها من خلال النظر في تكوين المعلمة الفعلية والتصريحات التي تم مسحها مسبقًا. ... [و]عندما يتم تجميع تصريح إجراء، يعرف المترجم، مرة أخرى من خلال مراقبة بناء الجملة، نوع العنوان الذي يتوقعه من الدالة."
- ↑ إي تي آيرونز (1961-01-01). "تعليقات على تنفيذ الإجراءات والكتل التكرارية في لغة ALGOL" . مجلة اتصالات ACM . 4 (1). رابطة آلات الحوسبة (ACM): 65-69 . doi : 10.1145/366062.366090 . ISSN 0001-0782 . S2CID 42778823 .
- ↑ إنجرمان، ب.ز. (1961-01-01). "العبارات الجزئية: طريقة لتجميع عبارات الإجراءات مع بعض التعليقات على تعريفات الإجراءات" . اتصالات رابطة آلات الحوسبة . 4 (1). رابطة آلات الحوسبة (ACM): 55-58 . doi : 10.1145/366062.366084 . ISSN 0001-0782 . S2CID 14646332 .
- ↑ سكوت، مايكل (2009). براغماتية لغات البرمجة . ص 395.
- ↑ مارلو، سيمون (2013). البرمجة المتوازية والمتزامنة في لغة هاسكل . ص 10.
- ↑ كوينيك، كريستيان (2003). التأتأة في أجزاء صغيرة . ص 176.
- ↑ ستروستروب، بيارن (خريف 1989). "الوراثة المتعددة للغة C++" (ملف PDF) . أنظمة الحوسبة . 1 (4). USENIX . تاريخ الاسترجاع: 4 أغسطس 2014 .
- ↑ دريسن، كاريل؛ هولزلي، أورس (1996). "التكلفة المباشرة لاستدعاءات الدوال الافتراضية في لغة C++" (ملف PDF) . وقائع مؤتمر ACM SIGPLAN لعام 1996 حول أنظمة ولغات وتطبيقات البرمجة كائنية التوجه، OOPSLA 1996، سان خوسيه، كاليفورنيا، الولايات المتحدة الأمريكية، 6-10 أكتوبر 1996. المؤتمر الحادي عشر لـ OOPSLA 1996: سان خوسيه، كاليفورنيا، الولايات المتحدة الأمريكية. ACM . ISBN 0-89791-788-Xأُرشف من النسخة الأصلية (PDF) بتاريخ 29-12-2019 . تم الاطلاع عليه بتاريخ 24-02-2011 .
- ↑ كالكوت، جون (مايو 1995). "البرمجة التقريبية: استخدام مكتبات 16 بت في نظام التشغيل OS/2 2.0" . مجلة مطوري نظام التشغيل OS/2 . 7 (3): 48-56 .
- ↑ كينغ، أدريان (1994). داخل نظام التشغيل مايكروسوفت ويندوز 95 ( الطبعة الثانية). ريدموند، واشنطن، الولايات المتحدة الأمريكية: مطبعة مايكروسوفت . رقم ISBN 1-55615-626-X.
- ↑ دليل المبرمج لنظام التشغيل مايكروسوفت ويندوز 95: مواضيع رئيسية في برمجة ويندوز من فريق تطوير مايكروسوفت ويندوز (الطبعة الأولى ). ريدموند، واشنطن، الولايات المتحدة الأمريكية: مطبعة مايكروسوفت . 1995-07-01. ISBN 1-55615-834-3تم الاطلاع عليه بتاريخ 26-05-2016 .
{{cite book}}تم|work=تجاهله ( مساعدة ) - ↑ حزاه، كارين (1997). كتابة برامج تشغيل الأجهزة الافتراضية لنظام ويندوز - أسرار برمجة برامج تشغيل الأجهزة الافتراضية (الطبعة الثانية، الإصدار الثاني). لورانس، كانساس، الولايات المتحدة الأمريكية: دار نشر R&D Books / Miller Freeman, Inc. رقم ISBN 0-87930-438-3.
- ↑ كاولر، باري (أغسطس 1997). لغة التجميع وأنظمة برمجة ويندوز - البرمجة منخفضة المستوى 16 و32 بت لأجهزة الكمبيوتر الشخصية وويندوز (الطبعة الثانية ). لورانس، كانساس، الولايات المتحدة الأمريكية: كتب البحث والتطوير / ميلر فريمان، المحدودة. ISBN 0-87930-474-X.
- ↑ "لماذا لا يمكنك التفكير بين نظامي ويندوز 32 بت و64 بت؟" . The Old New Thing . 2008-10-20.
- ↑ برايت، والتر (1990-07-01). "الذاكرة الافتراضية لنظام DOS بسعة 640 كيلوبايت" . مجلة دكتور دوب . تم الاطلاع عليه بتاريخ 2014-03-06 .
- ↑ ليفين، جون ر. (2000) [أكتوبر 1999]. الروابط والمحملات . سلسلة مورغان كوفمان في هندسة البرمجيات والبرمجة ( الطبعة الأولى). سان فرانسيسكو، الولايات المتحدة الأمريكية: مورغان كوفمان . ISBN 1-55860-496-0. OCLC 42413382 . تم الاسترجاع في 12 يناير 2020 .
{{cite book}}: CS1 maint: deprecated archiveal service ( link ) Code:تصحيحات: - ↑ جوليارد، ألكسندر. "النبيذ 9.0" . WineHQ Gitlab . تم الاسترجاع في 10 مارس 2025 .
- مصطلحات الحوسبة
- البرمجة الوظيفية
