سؤال

ما هو الفرق بين الربط المبكر والمتأخر؟

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

في اللغات المجمعة، الفرق صارخ.

جافا:

//early binding:
public create_a_foo(*args) {
 return new Foo(args)
}
my_foo = create_a_foo();

//late binding:
public create_something(Class klass, *args) {
  klass.new_instance(args)
}
my_foo = create_something(Foo);

في المثال الأول، يمكن للمترجم القيام بجميع أنواع الأشياء الرائعة في وقت الترجمة.وفي الحالة الثانية، عليك فقط أن تأمل أن كل من يستخدم الطريقة يفعل ذلك بطريقة مسؤولة.(بالطبع، تدعم أجهزة JVM الأحدث Class<? extends Foo> klass الهيكل، والذي يمكن أن يقلل بشكل كبير من هذا الخطر.)

فائدة أخرى هي أن IDEs يمكن أن ترتبط بتعريف الفئة، حيث أنه تم الإعلان عنها هناك في الطريقة.قد تكون الدعوة إلى create_something(Foo). جداً بعيدًا عن تعريف الطريقة، وإذا كنت تنظر إلى تعريف الطريقة، فقد يكون من الجيد رؤية التنفيذ.

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

مأخوذة مباشرة من http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htm

هناك طريقتان لاستخدام الأتمتة (أو OLE Automation) للتحكم برنامجيا في تطبيق آخر.

يستخدم الربط المتأخر CreateObject لإنشاء ومثيل كائن التطبيق ، والذي يمكنك التحكم فيه بعد ذلك.على سبيل المثال ، لإنشاء مثيل جديد من Excel باستخدام الربط المتأخر:

 Dim oXL As Object
 Set oXL = CreateObject("Excel.Application")

من ناحية أخرى ، لمعالجة مثيل موجود من Excel (إذا كان Excel مفتوحًا بالفعل) ، فسوف تستخدم GetObject (بغض النظر عما إذا كنت تستخدم الربط المبكر أو المتأخر):

 Dim oXL As Object
 Set oXL = GetObject(, "Excel.Application")

لاستخدام الربط المبكر ، تحتاج أولاً إلى تعيين مرجع في مشروعك إلى التطبيق الذي تريد معالجته.في محرر VB لأي تطبيق Office ، أو في VB نفسه ، يمكنك القيام بذلك عن طريق تحديد أدوات + مراجع ، واختيار التطبيق الذي تريده من القائمة (على سبيل المثال"مكتبة كائنات Microsoft Excel 8.0").

لإنشاء مثيل جديد لبرنامج Excel باستخدام الربط المبكر:

 Dim oXL As Excel.Application
 Set oXL = New Excel.Application

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

إجابة مماثلة ولكن أكثر تفصيلاً من كتاب هربرت شيلدت C++: -

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

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

في اللغات المترجمة، يكون الفرق أكثر دقة قليلاً.

روبي:

# early binding:
def create_a_foo(*args)
  Foo.new(*args)
end
my_foo = create_a_foo

# late binding:
def create_something(klass, *args)
  klass.new(*args)
end
my_foo = create_something(Foo)

نظرًا لأن روبي (بشكل عام) لم يتم تجميعه، فلا يوجد مترجم للقيام بالأشياء الرائعة المقدمة.إن نمو JRuby يعني أنه يتم تجميع المزيد من Ruby هذه الأيام، مما يجعلها تتصرف مثل Java، أعلاه.

لا تزال مشكلة IDEs قائمة:يمكن لمنصة مثل Eclipse البحث عن تعريفات الفئة إذا قمت بترميزها، ولكن لا يمكنها ذلك إذا تركتها للمتصل.

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

public class child()
{    public void method1()
     {     System.out.println("child1");
     }
    public void method2()
     {     System.out.println("child2");
     }

}
public class teenager extends child()
{    public void method3()
     {      System.out.println("teenager3");
     }
}
public class adult extends teenager()
{     
    public void method1()
    {    System.out.println("adult1);
         super.method1();
     }
}


//In java
public static void main(String []args)
{    ((teenager)var).method1();
}

سيتم طباعة هذا

adult1
child1

في الربط المبكر ، سيتمكن المترجم للوصول إلى جميع الطرق في الأطفال والمراهقين ولكن في الربط المتأخر (في وقت التشغيل) ، سيتحقق من الطرق التي يتم تجاوزها في وقت التشغيل.

وبالتالي ، سيتم تجاوز الطريقة 1 (من الطفل - الربط المبكر) بواسطة الطريقة 1 من البالغين في وقت التشغيل (الربط المتأخر) ثم ستنفذ الطريقة 1 من الطفل نظرًا لعدم وجود طريقة 1 في Method1 في المراهق.

لاحظ أنه إذا لم يكن لدى الطفل طريقة 1 فلن يتم تجميع الكود الموجود في الملف الرئيسي.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top