جدول الإرسال

في علوم الحاسوب ، يُعدّ جدول الإرسال بنية بيانات تربط سلسلة من الإجراءات المعروفة برموزها البرمجية المقابلة، والتي يمكن استرجاعها لاحقًا بشكل ديناميكي. تُنفَّذ هذه البنية عادةً إما باستخدام مصفوفة ترابطية لربط أسماء الدوال مباشرةً بمؤشرات الدوال المقابلة ، أو باستخدام مصفوفة بسيطة من مؤشرات الدوال ذات الفهارس المعروفة.

تشمل حالات الاستخدام الشائعة تنفيذ الربط المتأخر والتعدد الشكلي الافتراضي في البرمجة الموجهة للكائنات وتنفيذ استدعاءات النظام . [ 1 ]

حالات الاستخدام

الأساليب الافتراضية

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

استدعاءات النظام

في تصميم نواة نظام التشغيل ، تُنفَّذ استدعاءات النظام عادةً باستخدام جدول توجيه للفهارس التي تُشير إلى إجراءات النظام ذات الامتيازات المقابلة. على سبيل المثال، في لينكس ، sys_exitيكون لاستدعاء النظام فهرس 60، ويمكن استدعاؤه بتمرير 60 إلى سجل المعالج المناسب وإطلاق مقاطعة البرنامج . [ 4 ]

يستدعي sys_exit برمز خروج 0، ثم يُنفذ الأمر mov rax , 60، ثم mov rdi , 0، ثم syscall.

بما أن استدعاءات النظام لا تتطلب سوى رقم للإشارة إلى إجراء النواة الأساسي، فإنه يمكن استدعاؤها من مساحة المستخدم بينما تقوم في الواقع بتشغيل التعليمات البرمجية في مساحة النواة . وهذا يُحسّن أمان النظام من خلال ضمان عدم إمكانية تشغيل التعليمات البرمجية ذات الامتيازات إلا من خلال الواجهة المحدودة التي يوفرها كل استدعاء. [ 5 ]

أمثلة على التطبيقات

بيرل

يوضح ما يلي إحدى طرق تنفيذ جدول الإرسال في لغة بيرل ، باستخدام تجزئة لتخزين مراجع التعليمات البرمجية (المعروفة أيضًا باسم مؤشرات الدوال ). [ 6 ]

# تعريف الجدول باستخدام مرجع رمز مجهول ومرجع رمز مُسمى my %dispatch = ( "-h" => sub { return "hello\n" ; }, "-g" => \& say_goodbye ); sub say_goodbye { return "goodbye\n" ; } # جلب مرجع الرمز من الجدول، واستدعاؤه my $sub = $dispatch { $ARGV [ 0 ]}; print $sub ? $sub -> () : "unknown argument\n" ;

تشغيل برنامج Perl هذا perl greet -hسينتج "hello"، وتشغيله perl greet -gسينتج "goodbye".

جافا سكريبت

يمكن تنفيذ جدول الإرسال في جافا سكريبت باستخدام كائن لتخزين تعريفات الدوال المجهولة. [ 7 ]

// جدول إرسال الإجراءات بالإضافة إلى خيار احتياطي const actions = { action1 () { console . log ( "تم استدعاء الإجراء 1" ); }, action2 () { console . log ( "تم استدعاء الإجراء 2" ); }, action3 () { console . log ( "تم استدعاء الإجراء 3" ); }, fallback () { console . log ( "تم استدعاء الخيار الاحتياطي" ); } };دالة تنفيذ الإجراء ( المفتاح ) { const action = Object.hasOwn ( actions , key ) ? key : "fallback" ; return actions [ action ]( ) ; }performAction ( "action1" ); // يُخرج "تم استدعاء الإجراء 1" performAction ( "action3" ); // يُخرج "تم استدعاء الإجراء 3" performAction ( "action5" ); // يُخرج "تم استدعاء الإجراء الاحتياطي"

لغة لوا

في لغة لوا ، يمكن للجداول تخزين أي قيمة، بما في ذلك الدوال، مما يجعل تنفيذ جدول إرسال بسيط أمرًا سهلاً. [ 8 ] [ 9 ]

-- جدول إرسال الإجراءات بالإضافة إلى إجراءات احتياطية محلية = { action1 = function () print ( 'تم استدعاء الإجراء 1' ) end , action2 = function () print ( 'تم استدعاء الإجراء 2' ) end , action3 = function () print ( 'تم استدعاء الإجراء 3' ) end , fallback = function () print ( 'تم استدعاء الإجراء الاحتياطي' ) end }دالة `perform_action ( key )` : إذا كانت `actions [ key ] ` غير فارغة، فأرجع `actions [ key ]()` . وإلا ، فأرجع ` actions.fallback () ` .perform_action ( 'action1' ) -- يُخرج "تم استدعاء الإجراء 1" perform_action ( 'action3' ) -- يُخرج "تم استدعاء الإجراء 3" perform_action ( 'action5' ) -- يُخرج "تم استدعاء الإجراء الاحتياطي"

انظر أيضاً

مراجع

  1. غولدفس، أليس. "جداول إرسال الدوال في لغة سي" . alicegoldfuss.com . تم الاطلاع عليه بتاريخ 23 يناير 2021 .
  2. فيتيك، جان (1996). "جداول الإرسال المضغوطة للغات البرمجة الكائنية ذات الكتابة الديناميكية" (ملف PDF) . تم الاطلاع عليه بتاريخ 21-07-2026 .{{cite web}}: CS1 maint: url-status ( link )
  3. زيغالوفا، إليزافيتا (30 أبريل 2026). "عدو صامت أم حليف هادئ: دليل موجز للمحاذاة في لغة C++. الجزء 3" . PVS-Studio . تاريخ الاسترجاع: 22 يوليو 2026 .
  4. "استدعاءات النظام - وثائق نواة لينكس" . linux-kernel-labs.github.io . مؤرشف من الأصل بتاريخ 26 أغسطس 2019. تم الاطلاع عليه بتاريخ 22 يوليو 2026 .
  5. هاين، كياو سو (2025-09-01). "مساحة النواة، مساحة المستخدم، واستدعاءات النظام" . ميديوم . تم الاسترجاع في 2026-07-22 .
  6. فاريل، ديفيد (2013-07-07). "إعادة استخدام الكود مع الدوال المجهولة في بيرل" . Perl.com . تم الاطلاع عليه بتاريخ 22-07-2026 .
  7. "الدوال - جافا سكريبت | MDN" . وثائق MDN على الويب . 2025-07-08 . تم الاطلاع عليه بتاريخ 2026-07-22 .
  8. "البرمجة بلغة لوا : 2.5" . www.lua.org . تاريخ الاسترجاع: 22-07-2026 . 
  9. "دوال لوا في الجداول" . البرمجة . 27-08-2023 . تم الاسترجاع في 22-07-2026 .