جدول التحكم

جدول التحكم هو بنية بيانات جدولية (أي مصفوفة من السجلات ) تُستخدم لتوجيه مسار التحكم في برنامج حاسوبي . يُطلق على البرامج التي تستخدم جدول تحكم اسم البرامج المُدارة بالجداول . [ 1 ] [ 2 ] يُشفّر جدول التحكم كلاً من المعاملات في تعبير شرطي ومرجع دالة . يُعالج المُفسّر الجدول بتقييم التعبير الشرطي لبيانات الإدخال واستدعاء الدالة المُختارة. يُمكن أن يُقلل استخدام جدول التحكم من الحاجة إلى كتابة تعليمات برمجية مُكررة تُنفذ نفس المنطق.
بشكل عام، يمكن ربط معلمات الإدخال بأي بنية بيانات. من بنى البيانات الشائعة البحث ، الذي يوفر أداءً عاليًا نسبيًا ولكنه يستهلك ذاكرة كبيرة نسبيًا. يمكن للمصفوفة الترابطية تقليل استخدام الذاكرة على حساب زيادة وقت البحث.
تختلف طريقة الإشارة إلى السلوك المرتبط. توفر بعض اللغات مرجعًا مباشرًا للدالة (أي مؤشرًا ) يمكن استخدامه لاستدعاء دالة مباشرةً، بينما لا توفره لغات أخرى. كما توفر بعض اللغات إمكانية الانتقال إلى موقع محدد (أي تسمية ). وكحل بديل، تسمح جميع اللغات بربط المدخلات بفهرس يمكن استخدامه للانتقال إلى جزء معين من الكود.
يُستخدم جدول التحكم غالبًا كجزء من خوارزمية عالية المستوى. فهو يتحكم في الحلقة الرئيسية لبرنامج يعتمد على الأحداث . ومن الاستخدامات المتقدمة نسبيًا له تعليمات الآلة الافتراضية ، وهو مشابه للرمز البايتي، ولكن عادةً ما تكون العمليات مُضمنة في بنية الجدول نفسه بدلًا من أن تكون مُشفّرة في بيانات الجدول.
بنية البيانات
يمكن تنظيم الجدول بطرق متنوعة. قد يكون له بُعد واحد أو عدة أبعاد، وقد يكون طوله ثابتًا أو متغيرًا . قد يكون هيكل الجدول مشابهًا لمصفوفة ترابطية متعددة الخرائط ، حيث تُربط قيمة بيانات (أو مجموعة من قيم البيانات) بوظيفة واحدة أو أكثر. غالبًا ما يسمح هذا الهيكل بنقل البيانات الجدولية بين منصات الحوسبة المختلفة طالما وُجد مُفسِّر متوافق على كل منصة.
دالة تجزئة بسيطة
يتألف التنفيذ البسيط نسبيًا من مصفوفة أحادية البعد متفرقة من القيم. تغطي المصفوفة مساحة الفهرس بالكامل، بحيث يتضمن البحث الوصول إلى عناصر المصفوفة باستخدام قيمة الإدخال، ويتم العثور على القيمة حتى للفهرس غير المُستخدم؛ مما يمنع حدوث خطأ قد يحدث لولا ذلك. يتم البحث في وقت ثابت ، دون الحاجة إلى البحث الفعلي. في معظم البنى ، يمكن إنجاز ذلك في تعليمتين أو ثلاث تعليمات حاسوبية . تُعرف هذه التقنية باسم " دالة التجزئة البسيطة "، أو " الإرسال المزدوج " عند استخدامها تحديدًا مع جداول التفرع .
لكي يكون ذلك عمليًا، يجب أن يكون نطاق قيم الفهرس صغيرًا نسبيًا. في المثال أدناه، يتم فهرسة جدول التحكم حسب قيمة ASCII، لذا يحتوي على 256 مدخلًا (مدخل لكل قيمة ASCII)؛ وتُعرض المدخلات المحذوفة على شكل '...'. القيم المهمة هي فقط تلك الخاصة بالأحرف A وD وM وS. أما باقي القيم فهي غير مهمة وتُعيّن إلى 0. يتطلب فهرس ثنائي البايت 65,536 مدخلًا على الأقل للتعامل مع جميع احتمالات الإدخال ، وهو ما قد يستهلك ذاكرة أكبر من القيمة التي يوفرها.
| فهرس (ASCII) | المصفوفة |
|---|---|
| 0 | 0 |
| ... | 0 |
| 65 (أ) | 1 |
| ... | 0 |
| 68 (د) | 4 |
| ... | 0 |
| 77 (م) | 3 |
| ... | 0 |
| 83 (جنوب) | 2 |
| ... | 0 |
| 255 | 0 |
في البرمجة القائمة على الأتمتة ومعالجة المعاملات شبه الحوارية ، إذا كان عدد حالات البرنامج المتميزة صغيرًا، فيمكن استخدام متغير تحكم "التسلسل الكثيف" لإملاء التدفق الكامل لحلقة البرنامج الرئيسية بكفاءة.
جدول التفرع
جدول التفرع هو مصفوفة أحادية البعد من تعليمات التفرع/القفز في لغة الآلة ، تُستخدم لتنفيذ تفرع متعدد الاتجاهات إلى عنوان البرنامج عند التفرع إليه بواسطة تفرع سابق مُفهرس. يُنشئه أحيانًا مُترجم مُحسِّن لتنفيذ عبارة switch ، بشرط أن يكون نطاق الإدخال صغيرًا وكثيفًا، مع وجود فجوات قليلة. [ 3 ] (كما هو مُوضح في مثال المصفوفة السابق)
على الرغم من صغر حجمها نسبيًا - مقارنةً Ifبالعبارات المتكافئة المتعددة - فإن تعليمات التفرع لا تزال تحمل بعض التكرار، حيث يتكرر رمز عملية التفرع وقناع رمز الشرط جنبًا إلى جنب مع إزاحات التفرع. يمكن إنشاء جداول تحكم تحتوي فقط على إزاحات تسميات البرنامج للتغلب على هذا التكرار (على الأقل في لغات التجميع)، ومع ذلك لا تتطلب سوى زيادة طفيفة في وقت التنفيذ مقارنةً بجدول التفرع التقليدي.
جدول القرار
في كثير من الأحيان، يقوم جدول التحكم بتنفيذ جدول القرار ، والذي يحتوي مثله على مقترحات (غالباً ضمنية) ، وإجراء واحد أو أكثر مرتبط بها.
يمكن لجدول التحكم أن يعمل كعبارة تبديل، أو بشكل أعم، كبنية شرطية متداخلة من نوع if-then-else تتضمن شروطًا منطقية (باستخدام شروط AND / OR المنطقية ) لكل حالة. يوفر هذا الجدول تنفيذًا مستقلًا عن لغة البرمجة لما هو في الأصل بنية تعتمد على لغة البرمجة. يجسد الجدول جوهر البرنامج ، مجردًا من قواعد لغة البرمجة وجوانبها المتعلقة بالمنصة، ومختصرًا إلى بيانات ومنطق ضمني. يتضمن معنى الجدول عمليات ضمنية بدلًا من أن يكون صريحًا كما هو الحال في نموذج البرمجة التقليدي .
عادةً، يحتوي جدول التحكم ثنائي الأبعاد على أزواج من القيم والإجراءات، وقد يحتوي أيضًا على عوامل تشغيل ومعلومات عن أنواع البيانات، مثل موقع وحجم وتنسيق بيانات الإدخال أو الإخراج، وما إذا كان تحويل البيانات مطلوبًا. قد يحتوي الجدول على فهارس أو مؤشرات نسبية أو مطلقة لعناصر أو دوال عامة أو مخصصة يتم تنفيذها بناءً على قيم أخرى في الصف.
يعتمد نوع القيم المستخدمة في جدول التحكم على لغة البرمجة المستخدمة في المفسر. توفر لغة التجميع أوسع نطاق لأنواع البيانات ، بما في ذلك رمز الآلة لقيم البحث. عادةً، يحتوي جدول التحكم على قيم لكل فئة مطابقة محتملة للمدخلات، بالإضافة إلى مؤشر مطابق لدالة الإجراء. بالنسبة للغات التي لا تدعم المؤشرات ، يمكن للجدول ترميز فهرس، والذي قد يشير إلى قيمة إزاحة يمكن استخدامها لتحقيق نفس وظيفة المؤشر.
تخزين
يمكن تخزين جدول التحكم بطرق متنوعة. يمكن تخزينه كجزء من البرنامج، كمتغير ثابت مثلاً . كما يمكن تخزينه في نظام الملفات ، كملف نصي أو في قاعدة بيانات مثلاً . ويمكن للبرنامج إنشاؤه ديناميكياً. ولتحقيق الكفاءة، يُفضل أن يكون الجدول موجوداً في ذاكرة البرنامج عند استخدامه من قِبل المفسر.
مترجم
يقوم مُفسِّر جدول التحكم بتنفيذ العمليات وفقًا لمعلمات الإدخال المُحدَّدة. يُمكن تعديل الجدول وسلوك وقت التشغيل الناتج دون تعديل المُفسِّر. قد يتطلب تغيير سلوك المُفسِّر صيانةً ، ولكن من المُفترض أن يكون مُصمَّمًا لدعم الوظائف المُستقبلية عبر تغييرات الجدول.
غالبًا ما تُكتب دوال المعالجة بنفس لغة المفسر، ولكن يمكن كتابتها بلغة أخرى شريطة وجود آلية ربط استدعاءات مناسبة بين اللغات. يعتمد اختيار لغة المفسر ودوال المعالجة عادةً على مدى الحاجة إلى قابلية نقلها عبر مختلف المنصات . قد توجد عدة إصدارات من المفسر لدعم قابلية النقل . يمكن استبدال مؤشر الدالة في عمود الإجراء بمؤشر جدول تحكم فرعي اختياريًا إذا كان المفسر يدعم هذا التركيب. يمثل هذا انتقالًا مشروطًا إلى مستوى منطقي أدنى، محاكيًا البرمجة الهيكلية .
اعتبارات الأداء
على الرغم من أن استخدام جدول تحكم يستلزم تكلفة تطوير وحجم نشر مُفسِّر، إلا أنه بفصل (تغليف) التعليمات البرمجية القابلة للتنفيذ عن المنطق، كما هو مُعبَّر عنه في الجدول، يُمكن توجيهها بسهولة أكبر لأداء وظيفتها. يُمكن ملاحظة ذلك في تطبيق جداول البيانات حيث يقوم برنامج جداول البيانات الأساسي بتحويل الصيغ المنطقية المعقدة بشفافية وبأكثر الطرق كفاءةً لعرض نتائجه.
تم اختيار الأمثلة أدناه جزئيًا لتوضيح التحسينات المحتملة في الأداء، والتي قد لا تعوض فقط عن مستوى التجريد الإضافي، بل تُحسّن أيضًا من كفاءة الكود الذي كان سيصبح أقل كفاءة وأصعب صيانة وأطول. على الرغم من أن الأمثلة المذكورة خاصة بلغة التجميع "منخفضة المستوى" ولغة C ، إلا أنه يتضح في كلتا الحالتين أن عددًا قليلًا جدًا من أسطر الكود مطلوب لتطبيق أسلوب جدول التحكم، ومع ذلك يمكن تحقيق تحسينات كبيرة في الأداء في وقت ثابت ، وتقليل تكرار كتابة الكود المصدري، وتعزيز وضوح الكود، مقارنةً ببنى لغات البرمجة التقليدية المطولة .
أمثلة
عام
CT1 هو جدول تحكم عبارة عن جدول بحث بسيط . يُمثل العمود الأول قيمة الإدخال المراد اختبارها (باستخدام شرط ضمني "إذا كان الإدخال = x")، وإذا تحققت هذه القيمة، يتم استدعاء الإجراء الموجود في العمود الثاني المقابل. يشبه هذا التفرع متعدد المسارات مع إمكانية العودة، وهو شكل من أشكال التوزيع الديناميكي .
CT1 مدخل فعل أ يضيف S طرح م ضاعف د قسّم
يوضح المثال التالي كيفية تحقيق تأثير مماثل في لغة لا تدعم تعريفات المؤشرات في هياكل البيانات، ولكنها تدعم التفرع المفهرس إلى دالة - موجودة داخل مصفوفة ( تبدأ من الصفر ) من مؤشرات الدوال. يُستخدم الجدول (CT2) لاستخراج الفهرس (من العمود الثاني) إلى مصفوفة المؤشرات (CT2P). في حال عدم دعم مصفوفات المؤشرات، يمكن استخدام عبارة SWITCH أو ما يعادلها لتغيير مسار التحكم إلى أحد تسلسل تسميات البرنامج (مثل: case0، case1، case2، case3، case4)، والتي بدورها إما تعالج المدخلات مباشرةً، أو تستدعي الدالة المناسبة (مع إرجاع قيمة).
CT2 مدخل فرعي # أ 1 S 2 م 3 د 4
كما هو الحال في الأمثلة أعلاه، من الممكن ترجمة قيم إدخال ASCII المحتملة (A، S، M، D) بكفاءة إلى فهرس مصفوفة مؤشر دون استخدام البحث في جدول فعليًا، ولكن يتم عرضها هنا كجدول من أجل الاتساق مع المثال الأول.
CT2P فِهرِس مصفوفة 1 يضيف 2 طرح 3 ضاعف 4 قسّم
يمكن استخدام جدول تحكم ثنائي الأبعاد لدعم اختبار شروط متعددة أو تنفيذ أكثر من إجراء. يمكن أن يتضمن الإجراء مؤشرًا إلى جدول تحكم فرعي آخر. في المثال البسيط أدناه، تم دمج شرط "أو" ضمنيًا كعمود إضافي (للتعامل مع إدخال الأحرف الصغيرة، ولكن في هذه الحالة، كان من الممكن التعامل مع ذلك بإضافة مدخل إضافي لكل حرف صغير مع تحديد نفس مُعرّف الدالة المستخدم للأحرف الكبيرة). كما تم تضمين عمود إضافي لحساب أحداث وقت التشغيل الفعلية لكل مُدخل عند حدوثها.
CT3 المدخل 1 البديل فرعي # عدد أ أ 1 0 S s 2 0 م م 3 0 د د 4 0
تكون إدخالات جدول التحكم بعد ذلك أكثر شبهاً بالعبارات الشرطية في اللغات الإجرائية ، ولكن الأهم من ذلك، بدون وجود العبارات الشرطية الفعلية (التي تعتمد على اللغة) (أي التعليمات) (يوجد الكود العام فعلياً في المفسر الذي يعالج إدخالات الجدول، وليس في الجدول نفسه - الذي يجسد ببساطة منطق البرنامج من خلال بنيته وقيمه).
في جداول كهذه، حيث تُحدد سلسلة من إدخالات الجدول المتشابهة المنطقَ بأكمله، قد يحل رقم إدخال الجدول أو مؤشره محل عداد البرنامج في البرامج التقليدية، ويمكن إعادة ضبطه في "إجراء" مُحدد أيضًا في إدخال الجدول. يُبين المثال أدناه (CT4) كيف يُمكن لتوسيع الجدول السابق، ليشمل إدخال "التالي" (أو تضمين دالة "تغيير التدفق" ( القفز ))، إنشاء حلقة تكرارية . (في الواقع، لا يُعد هذا المثال الطريقة الأمثل لإنشاء جدول تحكم كهذا، ولكنه يُوضح، من خلال إظهار "تطور" تدريجي من الأمثلة السابقة، كيفية استخدام أعمدة إضافية لتعديل السلوك). يُوضح العمود الخامس إمكانية بدء أكثر من إجراء واحد بإدخال جدول واحد - في هذه الحالة، إجراء يُنفذ بعد المعالجة العادية لكل إدخال (القيم السالبة تعني "لا شروط" أو "لا إجراء").
يمكن أيضًا استيعاب البرمجة المهيكلة أو التعليمات البرمجية "بدون Goto" (التي تتضمن ما يعادل بنية " do-while " أو " for loop ") من خلال هياكل جداول التحكم المصممة والمُنسقة بشكل مناسب.
|
|
لغة سي
يستخدم المثال التالي المكتوب بلغة C مصفوفتين تشكلان معًا بنية بيانات جدولية. المصفوفة الأولى هي مصفوفة بحث خطيops بسيطة أحادية البعد ، تُستخدم للحصول على فهرس العنصر المطابق للمدخل . تحتوي المصفوفة الثانية على عناوين التصنيفات التي سيتم الانتقال إليها. تختبر الحلقة كل عنصر مقابل التصنيف الموجود في نفس فهرس العنصر المُدخل ، وإذا تطابقا، تستدعي الدالة للحصول على التصنيف الموجود في نفس فهرس العنصر المُدخل.ophandler_labelsopsopgotoops
static const char ops [ 4 ] = { "A" , "S" , "M" , "D" };static const void * handler_labels [ 4 ] = { && Add , && Subtract , && Multiply , && Divide };for ( int i = 0 ; i < sizeof ( ops ); i ++ ) {إذا كان ( op == ops [ i ]) {انتقل إلى * handler_labels [ i ];}}سيُنفَّذ هذا بشكل أسرع إذا استُخدم جدول بحجم 256 بايت لترجمة مُدخلات ASCII opإلى فهرس دون الحاجة إلى البحث. وسيُنفَّذ في وقت ثابت لجميع قيم op. إذا handler_labelsاحتوى عنصر ما على اسم دالة بدلاً من تسمية، فيمكن استبدال القفزة باستدعاء دالة ديناميكي، مما يُلغي الحاجة إلى استخدام عبارة switch gotoولكنه يُقلل من أداء وقت التشغيل.
static const void * handler_labels [] = { && Default , && Add , && Subtract , && Multiply , && Divide };static const char handler_label_index_by_op [ 256 ] = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 ، 1 ، 0 ، 0 ، 4 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 3 ، 0 ، 0 ،0 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0};size_t i = handler_label_index_by_op ( x );انتقل إلى * handler_labels [ i ];التقييم القائم على الجداول
في مجال تحديد أسعار خدمات الاتصالات (المعني بتحديد تكلفة مكالمة معينة)، تُوضح تقنيات تحديد الأسعار القائمة على الجداول استخدام جداول التحكم في التطبيقات التي قد تتغير فيها القواعد بشكل متكرر نتيجة لقوى السوق. وفي كثير من الحالات، قد يقوم غير المبرمجين بتغيير الجداول التي تحدد الرسوم في غضون مهلة قصيرة. [ 4 ] [ 5 ]
إذا لم تكن الخوارزميات مدمجة مسبقًا في المفسر (وبالتالي تتطلب تفسيرًا إضافيًا في وقت التشغيل للتعبير الموجود في الجدول)، فإنها تُعرف باسم "التصنيف القائم على القواعد" بدلاً من التصنيف القائم على الجدول (وبالتالي تستهلك المزيد من النفقات العامة).
جداول البيانات
يمكن استخدام جدول البيانات كجدول تحكم ثنائي الأبعاد، حيث تمثل الخلايا غير الفارغة بيانات لبرنامج جدول البيانات الأساسي (المفسر). عادةً ما تُسبق الخلايا التي تحتوي على صيغ بعلامة يساوي، وهي ببساطة تُشير إلى نوع خاص من مدخلات البيانات التي تُحدد معالجة الخلايا الأخرى المشار إليها - عن طريق تغيير مسار التحكم داخل المفسر. إن إخراج الصيغ من المفسر الأساسي هو ما يُميز جداول البيانات، ومثال "التقييم القائم على القواعد" المذكور أعلاه، كأمثلة واضحة لاستخدام جداول التحكم من قِبل غير المبرمجين.
نموذج البرمجة
إذا أمكن تصنيف تقنية جداول التحكم ضمن أي نموذج برمجي محدد ، فإن أقرب تشبيه لها قد يكون البرمجة القائمة على الأوتوماتا أو البرمجة "الانعكاسية" (وهي شكل من أشكال البرمجة الوصفية ، حيث يمكن القول إن مدخلات الجدول "تُعدِّل" سلوك المفسر). مع ذلك، يمكن برمجة المفسر نفسه، والدوال، باستخدام أي من النماذج المتاحة أو حتى مزيج منها. يمكن أن يكون الجدول في جوهره مجموعة من قيم " البيانات الأولية " التي لا تحتاج حتى إلى تجميع، ويمكن قراءتها من مصدر خارجي (باستثناء تطبيقات محددة تعتمد على النظام الأساسي وتستخدم مؤشرات الذاكرة مباشرةً لزيادة الكفاءة).
آلة افتراضية
A two-dimensional control table is similar to intermediate executable code (i.e. bytecode) running on a virtual machine, in that a platform-dependentinterpreter is required to perform execution that is largely determined by table content. There are also similarities to Common Intermediate Language (CIL) in the aim of creating a common intermediate instruction set that is independent of platform but unlike CIL, no pretensions to be used as a common resource for other languages. P-code can also be considered a similar but earlier implementation with origins as far back as 1966.
Instruction fetch
When a two-dimensional control table is used to determine program flow, the normal "hardware" program counter function is effectively simulated with either a pointer to the first (or next) table entry or else an index to it. "Fetching" the instruction involves decoding the data in that table entry – without necessarily copying all or some of the data within the entry first. Programming languages that are able to use pointers have the dual advantage that less overhead is involved, both in accessing the contents and also advancing the counter to point to the next table entry after execution. Calculating the next 'instruction' address (i.e. table entry) can even be performed as an optional additional action of every individual table entry allowing loops and or jump instructions at any stage.
Monitoring control table execution
The interpreter program can optionally save the program counter (and other relevant details depending upon instruction type) at each stage to record a full or partial trace of the actual program flow for debugging purposes, hot spot detection, code coverage analysis and performance analysis (see examples CT3 & CT4 above).
Advantages
- Clarity
- information tables are ubiquitous and mostly inherently understood even by the general public (especially fault diagnostic tables in product guides)
- Portability
- can be designed to be language and platform independent – except for the interpreter
- Flexibility
- ability to execute either primitives or functions transparently and be custom designed to suit the problem
- Compactness
- يعرض الجدول عادةً أزواج الشروط/الإجراءات جنبًا إلى جنب (بدون تبعيات التنفيذ المعتادة للمنصة/اللغة)، مما يؤدي غالبًا إلى تقليل حجم الملف الثنائي نظرًا لقلة تكرار التعليمات، وتقليل حجم التعليمات البرمجية المصدرية نتيجةً لإزالة العبارات الشرطية، وتقليل سرعات تحميل البرنامج (أو تنزيله).
- قابلية الصيانة
- غالباً ما تقلل الجداول من عدد أسطر المصدر التي يجب صيانتها مقارنةً بالمقارنات المتعددة
- موقع مرجعي
- تؤدي هياكل الجداول المدمجة إلى بقاء الجداول في ذاكرة التخزين المؤقت
- إعادة استخدام الكود
- عادةً ما يكون المترجم قابلاً لإعادة الاستخدام. في كثير من الأحيان، يمكن تكييفه مع مهام برمجة جديدة باستخدام نفس الأسلوب، ويمكن أن ينمو بشكل طبيعي، ليصبح في الواقع مكتبة قياسية من الوظائف المجربة والمختبرة، يتم التحكم فيها بواسطة تعريفات الجدول.
- كفاءة
- يمكن تحسين النظام بأكمله. أي تحسين لأداء المفسر عادة ما يحسن أداء جميع التطبيقات التي تستخدمه (انظر الأمثلة في "CT1" أعلاه).
- قابل للتمديد
- new instructions can be added by extending the interpreter
اختياري:
- يمكن للمفسر أن يكون استبطانيًا ويُحسّن أداءه ذاتيًا باستخدام مقاييس وقت التشغيل المُجمّعة داخل الجدول نفسه (انظر CT3 وCT4 - مع إدخالات يُمكن فرزها دوريًا حسب العدد التنازلي). كما يُمكن للمفسر اختياريًا اختيار تقنية البحث الأكثر كفاءة ديناميكيًا من المقاييس المُجمّعة في وقت التشغيل (مثل حجم المصفوفة، ونطاق القيم، وما إذا كانت مُرتّبة أم لا).
- التوزيع الديناميكي : يمكن تحميل الدوال الشائعة مسبقًا، واستدعاء الدوال الأقل شيوعًا عند أول استخدام لها فقط لتقليل استهلاك الذاكرة . ويمكن استخدام التخزين المؤقت داخل الجدول لتحقيق ذلك.
- يمكن أن يحتوي المترجم على ميزات تصحيح الأخطاء والتتبع والمراقبة المدمجة - والتي يمكن تشغيلها أو إيقافها حسب الرغبة وفقًا لوضع الاختبار أو الوضع "المباشر".
- يمكن إنشاء جداول التحكم "أثناء التشغيل" (وفقًا لبعض مدخلات المستخدم أو من المعلمات) ثم يتم تنفيذها بواسطة المفسر (دون بناء التعليمات البرمجية حرفيًا).
العيوب
- تمرين
- لا يتم تدريب مبرمجي التطبيقات عادةً على إنتاج حلول عامة
- العبء الحسابي
- بعض الزيادة بسبب مستوى إضافي من التوجيه غير المباشر الناتج عن ضرورة "تفسير" التعليمات الافتراضية (ومع ذلك، يمكن عادةً تعويض ذلك بشكل كامل من خلال مترجم عام مصمم جيدًا يستفيد استفادة كاملة من تقنيات الترجمة المباشرة الفعالة والبحث والاختبار الشرطي التي ربما لم يتم استخدامها لولا ذلك).
- تعقيد
- لا يمكن دائمًا استخدام التعبيرات المعقدة مباشرةً في إدخالات جداول البيانات لأغراض المقارنة. مع ذلك، يمكن حساب هذه القيم الوسيطة مسبقًا داخل دالة، والإشارة إلى قيمها في إدخالات الجدول الشرطية. بدلاً من ذلك، يمكن لدالة إجراء الاختبار الشرطي المعقد بالكامل (كإجراء غير مشروط)، ومن خلال تعيين علامة منطقية كنتيجة، يمكن اختبارها في إدخال الجدول التالي. انظر نظرية البرمجة المهيكلة
اقتباسات
يُعدّ التفرّع متعدد الاتجاهات أسلوبًا برمجيًا هامًا، غالبًا ما يُستبدل بسلسلة غير فعّالة من اختبارات if. وقد راسلني بيتر نور مؤخرًا مُشيرًا إلى أنه يعتبر استخدام الجداول للتحكم في تدفق البرنامج فكرةً أساسيةً في علوم الحاسوب كادت تُنسى، لكنه يتوقع أن تُعاد اكتشافها قريبًا. إنها مفتاح الكفاءة في أفضل المُترجمات التي درستها.
— دونالد كنوث ، البرمجة الهيكلية باستخدام عبارات الانتقال
هناك طريقة أخرى للنظر إلى برنامج مكتوب بلغة تفسيرية. يمكن اعتباره سلسلة من استدعاءات الإجراءات الفرعية، واحدة تلو الأخرى. في الواقع، يمكن توسيع هذا البرنامج إلى سلسلة طويلة من استدعاءات الإجراءات الفرعية، وعلى العكس، يمكن عادةً ضغط هذه السلسلة في شكل مشفر يسهل تفسيره. تتمثل ميزة التقنيات التفسيرية في إيجاز التمثيل، واستقلاليته عن الجهاز، وزيادة القدرة التشخيصية. غالبًا ما يمكن كتابة المفسر بحيث يكون الوقت المستغرق في تفسير الكود نفسه والتفرع إلى الإجراء المناسب ضئيلاً.
— دونالد كنوث ، فن برمجة الحاسوب، المجلد الأول، 1997، الصفحة 202
يمكن تقليل المساحة المطلوبة لتمثيل برنامج ما غالبًا باستخدام مترجمات تُعرض فيها تسلسلات العمليات الشائعة بشكل مضغوط. ومن الأمثلة النموذجية على ذلك استخدام آلة الحالة المحدودة لترميز بروتوكول معقد أو تنسيق معجمي في جدول صغير.
— جون بنتلي ، كتابة برامج فعالة
تُصبح جداول القفز فعّالة للغاية إذا أمكن الاستغناء عن اختبارات النطاق. على سبيل المثال، إذا كانت قيمة التحكم من نوع مُعدّد (أو حرفًا)، فلا يمكن أن تحتوي إلا على نطاق صغير وثابت من القيم، وبالتالي يكون اختبار النطاق غير ضروري شريطة أن يكون جدول القفز كبيرًا بما يكفي لاستيعاب جميع القيم الممكنة.
— ديفيد أ. سبولر، توليد كود المترجم لعبارات التفرع متعددة الاتجاهات كمشكلة بحث ثابت
يجب كتابة البرامج ليقرأها الناس، وليس فقط لتنفذها الآلات.
— "بنية وتفسير برامج الحاسوب"، مقدمة الطبعة الأولى، أبيلسون وسوسمان
أرني مخططك الانسيابي وأخفِ جداولك، وسأظل في حيرة من أمري. أرني جداولك، ولن أحتاج عادةً إلى مخططك الانسيابي؛ فسيكون الأمر واضحًا.
— "الشهر الأسطوري للرجل: مقالات في هندسة البرمجيات"، فريد بروكس
انظر أيضاً
- بنية تركز على قواعد البيانات - بنية البرمجيات
- اختبار البرمجيات القائم على البيانات – أسلوب اختبار البرمجيات
- اختبار البرمجيات باستخدام الكلمات المفتاحية – منهجية اختبار البرمجيات
- الكود المترابط – برنامج يتكون كود مصدره بالكامل من استدعاءات للدوال
- جدول الحقيقة – جدول رياضي يُستخدم في المنطق
ملحوظات
- ↑ برامج من جداول القرار ، همبي، إي.، 2007، ماكدونالد، 1973 ... بيغرستاف، تيد ج.، إنجلوود كليفس، نيوجيرسي : برنتيس هول، رقم ISBN 0-444-19569-6
- ↑ "نسخة مؤرشفة" (PDF) . مؤرشفة من النسخة الأصلية (PDF) بتاريخ 10 يونيو 2016. تم الاطلاع عليها بتاريخ 17 مايو 2016 .
{{cite web}}: CS1 maint: archived copy as title ( link ) - ↑ http://www.netrino.com/node/137
- ↑ كارل رايت، مؤسسة مستوى الخدمة (2002) التقييم القائم على رمز البرنامج مقابل التقييم القائم على الجداول مقابل التقييم القائم على القواعد ، مجلة Rating Matters، العدد 12، 13 نوفمبر 2002، الرقم الدولي الموحد للدوريات 1532-1886
- ↑ برايان إي. كلاوزر، ميليسا جيه. مارغوليس، ستيفن جي. كلايمان، لينيت بي. روس (1997) تطوير خوارزميات التقييم الآلي لتقييمات الأداء المعقدة: مقارنة بين منهجين، مجلة القياس التربوي، المجلد 34، العدد 2 (صيف 1997)، الصفحات 141-161
مراجع
- منهجية قائمة على جداول القرار
- البرمجة الهيكلية باستخدام عبارات "انتقل إلى" لدونالد كنوث
- توليد كود المترجم لعبارات التفرع متعددة الاتجاهات كمشكلة بحث ثابت ، 1994، بقلم ديفيد أ. سبولر
روابط خارجية
- تصف عبارة التبديل في Windows PowerShell امتدادات لعبارة التبديل القياسية (مما يوفر بعض الميزات المشابهة لجداول التحكم).
- مثال على جدول تحكم بلغة "C" باستخدام المؤشرات ، بقلم كريستوفر سوتيل، 1993، قسم علوم الحاسوب، جامعة أوكلاند
- تصميم قائم على الجداول. مؤرشف بتاريخ 10 يونيو 2016 في أرشيف الإنترنت (Wayback Machine) بواسطة واين كونيورث من شركة داتا كينيتكس.
- من المتطلبات إلى الجداول إلى التعليمات البرمجية والاختبارات، بقلم جورج بروك
- بعض التعليقات حول استخدام جداول القرار الغامضة وتحويلها إلى برامج حاسوبية، بقلم بي جيه إتش كينج وآر جي جونسون، جامعة لندن، لندن، المملكة المتحدة
- الغموض في جداول قرارات الدخول المحدود بقلم بي جيه إتش كينج
- تحويل جداول القرار إلى برامج حاسوبية باستخدام تقنيات قناع القاعدة، بقلم بي جيه إتش كينج
- تحليل مُحسِّن فائق لتوليد كود الفروع متعددة المسارات، مؤرشف بتاريخ 27 فبراير 2012 في أرشيف الإنترنت (Wayback Machine)، القسم 3.9، الصفحة 16، فهرس الخرائط
- جداول القفز عبر مصفوفات مؤشرات الدوال في لغة C/C++، جونز، نايجل. "مصفوفات من مؤشرات الدوال""برمجة الأنظمة المدمجة، مايو 1999".
- إحصائيات مشاهدات الصفحة لهذه المقالة لشهر ديسمبر 2009
- نمذجة البرمجيات باستخدام آلات الحالة المحدودة - نهج عملي
- جداول الحالات المحدودة لتطبيقات برمجة الحاسوب العامة، يناير 1988، بقلم مارك لينينجر
- MSDN: معالجة الأحداث القائمة على المشغلات
- جدول التحكم في c2.com
- تدفق التحكم
- بناء المترجم
- هياكل المترجم
