الربط المتأخر

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

تاريخ

يعود مصطلح "الربط المتأخر" إلى ستينيات القرن العشرين على الأقل، حيث ورد في مجلة "اتصالات رابطة آلات الحوسبة" . وقد استُخدم المصطلح على نطاق واسع لوصف اصطلاحات الاستدعاء في لغات مثل لغة ليسب، وإن كان ذلك عادةً ما يحمل دلالات سلبية تتعلق بالأداء. [ 3 ]

في ثمانينيات القرن العشرين، ساهمت لغة سمول توك في نشر البرمجة كائنية التوجه (OOP) وما صاحبها من ربط متأخر. قال آلان كاي ذات مرة: "بالنسبة لي، البرمجة كائنية التوجه تعني فقط المراسلة، والاحتفاظ المحلي، وحماية وإخفاء حالة العملية، والربط المتأخر للغاية لجميع العناصر. يمكن تطبيق ذلك في سمول توك وليسب. ربما توجد أنظمة أخرى تسمح بذلك، لكنني لست على دراية بها." [ 4 ]

في التسعينيات، كان استخدام COM شائعًا. وقد وفر ربطًا ثنائيًا مبكرًا بالإضافة إلى ربط متأخر يعتمد على البحث عن الاسم.

في عام 2000، صاغ أليكس مارتيلي مصطلح " الكتابة الديناميكية" للإشارة إلى شكل من أشكال تعدد الأشكال الذي يستفيد من نفس نوع البحث عن الأسماء المستخدم في الربط المتأخر لـ COM. يدعم وقت التشغيل الكتابة الديناميكية إذا كان مُفسَّرًا أو إذا كان يدعم استبطان النوع .

أمثلة

في لغة C++

في لغة C++، يشير الربط المتأخر (أو ما يُسمى أيضًا "الربط الديناميكي") إلى ما يحدث عادةً عند virtualاستخدام الكلمة المفتاحية في تعريف دالة. يتطلب استدعاء الدالة عادةً البحث عبر جدول افتراضي .

في COM

في نموذج كائنات المكونات (COM)، يتم استدعاء الدوال المرتبطة لاحقًا عبر واجهة IDispatch . ويتم ذلك عن طريق البحث GetIDsOfNames()عن دالة بالاسم ثم Invokeتنفيذها. توفر بعض السياقات دعمًا سهل الاستخدام لاستدعاء هذه الواجهة. [ 5 ] على سبيل المثال، في Visual Basic 6 ، تُستدعى الدوال مرتبطة لاحقًا لمتغير مُعلن عنه كـ . في المقابل، مع الربط المبكرObject ، يُحدد المُصرّف أنواع المتغيرات والتعبيرات . [ 6 ]

تتمثل الميزة الأساسية لاستخدام الربط المتأخر في برمجة COM في عدم الحاجة إلى الإشارة إلى المكتبة الموفرة أثناء وقت الترجمة . وهذا يجعل عملية الترجمة أكثر مقاومة لتعارضات الإصدارات، حيث قد يتم تعديل جدول الدوال الافتراضية (v-table) للفئة عن طريق الخطأ. لا يمثل هذا مشكلة في بيئات التشغيل التي تعتمد على الترجمة الفورية مثل .NET وجافا ، لأن جدول الدوال الافتراضية يُنشأ أثناء وقت التشغيل. [ 7 ]

في .NET

في بيئة .NET، يشير الربط المتأخر إلى تجاوز دالة virtualكما في لغة C++ أو تطبيق واجهة. يقوم المترجم بإنشاء جداول افتراضية لكل استدعاء دالة افتراضية أو دالة واجهة، وتُستخدم هذه الجداول أثناء التشغيل لتحديد التنفيذ المطلوب.

وكما هو الحال في COM و Java، توفر بيئة تشغيل اللغة المشتركة واجهات برمجة تطبيقات انعكاسية يمكنها إجراء استدعاءات ربط متأخرة. ويختلف استخدام هذه الاستدعاءات باختلاف اللغة.

مع إصدار C# 4، أُضيف نوع البيانات الزائف "dynamic". يُستخدم هذا النوع بدلاً من نوع Object للإشارة إلى الرغبة في الربط المتأخر. تُحدد آلية الربط المتأخر المطلوبة أثناء التشغيل باستخدام بيئة تشغيل اللغة الديناميكية كنقطة انطلاق.

يستخدم Visual Basic هذه الميزة عندما يكون نوع المتغير كائنًا (Object) ويكون توجيه المُصرّف "Option Strict Off" مُفعّلاً. هذا هو الإعداد الافتراضي لمشروع VB جديد. قبل الإصدار 9، كان الربط المتأخر مقتصرًا على كائنات .NET وCOM. مع VB 10، تم توسيع نطاق الربط ليشمل الكائنات المستندة إلى DLR.

في لغة جافا

توجد ثلاثة تعريفات للربط المتأخر في لغة جافا.

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

يشيع حاليًا استخدام مصطلح "الربط المتأخر" في برمجة جافا كمرادف لمصطلح " الإرسال الديناميكي" . ويشير هذا المصطلح تحديدًا إلى آلية الإرسال الفردي في جافا المستخدمة مع الدوال الافتراضية.

في اللغات ذات الكتابة الديناميكية

في معظم اللغات ذات الكتابة الديناميكية (مثل جافا سكريبت)، يمكن تغيير قائمة الطرق الخاصة بكائن ما أثناء وقت التشغيل. وهذا يتطلب الربط المتأخر.

في لغة ليسب

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

مثال باستخدام جلسة تفاعلية بلغة Common Lisp من Clozure :

في لغة PL/SQL ولغة Ada

عند استخدام الربط المبكر بين لغة Ada وإجراء مخزن في قاعدة البيانات، يتم التحقق من الطابع الزمني للتأكد من عدم تغيير الإجراء المخزن منذ تجميع الكود. وهذا يسمح بتنفيذ أسرع ويمنع تشغيل التطبيق على إصدار خاطئ من الإجراء المخزن. [ 8 ]

عند استخدام الربط المتأخر، لا يتم إجراء فحص الطابع الزمني، ويتم تنفيذ الإجراء المخزن عبر كتلة PL/SQL مجهولة . على الرغم من أن هذا قد يكون أبطأ، إلا أنه يُغني عن إعادة تجميع جميع تطبيقات العميل عند تغيير الإجراء المخزن.

يبدو أن هذا التمييز خاص بلغة PL/SQL ولغة Ada. أما اللغات الأخرى التي يمكنها استدعاء إجراءات PL/SQL، بالإضافة إلى محركات قواعد البيانات الأخرى، فتستخدم فقط الربط المتأخر.

الربط الديناميكي

الربط الديناميكي (والربط الديناميكي ذي الصلة) هو شكل من أشكال الربط المتأخر لاستيراد مكتبة التعليمات البرمجية .

نقد

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

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

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

انظر أيضاً

مراجع

  1. ^ شراينر ، أكسل توبياس (1994). البرمجة الشيئية باستخدام ANSI-C (PDF) . ميونيخ: هانسر. ص.  15. رقم ISBN 3-446-17426-5.
  2. بوش، جرادي. التحليل والتصميم الموجه للكائنات. أديسون-ويسلي، 1994. ص 71
  3. تقنيات هندسة البرمجيات، جيه إن بوكستون، برايان راندل ، لجنة العلوم التابعة لحلف الناتو، لجنة العلوم التابعة لحلف الناتو، 1970
  4. "الدكتور آلان كاي يتحدث عن معنى "البرمجة الموجهة للكائنات""" . Purl.org. 23 يوليو 2003. تم الاطلاع عليه بتاريخ 16 أغسطس 2013 .
  5. "استخدام الربط المبكر والربط المتأخر في التشغيل الآلي" . Support.microsoft.com . تم الاطلاع عليه بتاريخ 15 يناير 2011 .
  6. "استخدام الربط المبكر والربط المتأخر في الأتمتة" . مايكروسوفت . 2003-09-06. مؤرشف من الأصل في 2014-06-27 . تم الاسترجاع في 2014-06-27 .
  7. "بنية آلة جافا الافتراضية: الربط الديناميكي" . صن مايكروسيستمز . 1999. القسم 3.6.3 . تم الاطلاع عليه بتاريخ 21-09-2013 .
  8. "الربط المبكر والمتأخر، دليل مبرمج Oracle SQL لوحدة Ada" . Download.oracle.com . تم الاطلاع عليه بتاريخ 15 يناير 2011 .
  9. كاثلين دولارد (15 سبتمبر 2021). "الربط المبكر والمتأخر - فيجوال بيسك" . learn.microsoft.com . تم الاطلاع عليه بتاريخ 12 أبريل 2023 .