البرمجة الكتلية
في برمجة الحاسوب ، تُعرف كتلة الشيفرة المصدرية بأنها مجموعة من التعليمات البرمجية التي تُنفذ بالتسلسل من الأعلى إلى الأسفل. يُعدّ هيكل الكتلة أساسيًا في البرمجة الهيكلية ، حيث تُشكّل هياكل التحكم باستخدام الكتل. من الناحية التركيبية ، تعمل الكتلة بشكل مشابه للتعليمات البرمجية المفردة، إذ يعمل هيكل التحكم عادةً إما على تعليمة مفردة أو على كتلة.
تختلف طبيعة الكتلة البرمجية باختلاف لغات البرمجة ، ولكن توجد سمات مشتركة. عادةً ما توفر الكتلة البرمجية نطاق رؤية بحيث لا يكون المعرّف المُعرَّف داخلها مرئيًا في الكتل الخارجية المُحتوية، ولكنه يكون مرئيًا في الكتل الداخلية المُتداخلة ما لم يُخفى بواسطة معرّف آخر يحمل نفس الاسم. كما توفر الكتلة البرمجية عادةً نطاق عمر بحيث تُحرَّر الموارد المرتبطة بالمعرّف جزئيًا أو كليًا عند وصول تدفق التحكم إلى نهاية الكتلة البرمجية التي عُرِّف فيها المعرّف.
تاريخ
طُوِّر مفهوم الكتلة في خمسينيات القرن العشرين خلال تطوير أولى لغات البرمجة التلقائية ، وتمّت صياغته رسميًا في تقريري Algol 58 و Algol 60. قدّم Algol 58 مفهوم "العبارة المركبة"، التي كانت مرتبطة حصريًا بتدفق التحكم . [ 1 ] أما التقرير المنقح اللاحق ، الذي وصف بناء الجملة ودلالات Algol 60، فقد قدّم مفهوم الكتلة ونطاق الكتلة ، حيث تتكون الكتلة من "سلسلة من التصريحات متبوعة بسلسلة من التعليمات ومحاطة بين begin وend..."، حيث "يظهر كل تصريح في كتلة بهذه الطريقة ويكون صالحًا فقط لتلك الكتلة". [ 2 ]
بناء الجملة
يُحدد الجزء البرمجي كوحدة منفصلة، لكن صيغة ذلك تختلف باختلاف لغة البرمجة. ومن الأمثلة البارزة على ذلك:
- تقويم الأسنان المعقوف
- تستخدم لغة C والعديد من اللغات المشابهة الأقواس المعقوفة لتحديد كتلة التعليمات
{البرمجية}. في الواقع، هذه هي السمة المميزة للغات التي تستخدم الأقواس المعقوفة .
- المسافة البادئة
- تستخدم لغتا بايثون وهاسكل المسافة البادئة لتحديد كتلة بدلاً من المحددات كما تفعل معظم اللغات.
- الأقواس
- يستخدم بناء جملة ملف الدفعات
(و).
- بداية/نهاية
- تستخدم عائلة ALGOL بشكل عام الكلمات المفتاحية لتحديد كتلة ؛
beginبينما تستخدم ALGOL 68 الأقواس.end
- عكس فعل التحكم
- مع ALGOL 68 ، ثم في لغة الأوامر المحمية لإدسكار دبليو ديجكسترا عام 1974، يتم إنهاء كتلة التعليمات البرمجية الشرطية والتكرارية بالتناوب مع عكس الكلمة المحجوزة للكتلة : على سبيل المثال ، و .
if ~ then ~ elif ~ else ~ ficase ~ in ~ out ~ esacfor ~ while ~ do ~ od
القيود
بعض اللغات التي تدعم التصريحات داخل كتلة برمجية لا تدعم جميع أنواع التصريحات. على سبيل المثال، لا تسمح العديد من اللغات المشابهة للغة C بتعريف دالة داخل كتلة برمجية . وعلى عكس لغة Algol، لا تدعم لغة Pascal استخدام الكتل البرمجية ذات التصريحات الخاصة بها داخل بداية ونهاية كتلة برمجية موجودة، بل تدعم فقط العبارات المركبة التي تُمكّن من تجميع سلاسل من العبارات معًا في ifعبارات تحكم while.repeat
أمثلة
في بدايات الحوسبة، افتقرت العديد من لغات البرمجة، مثل فورتران 4 وبيسك ، إلى بنية الكتل البرمجية، باستثناء بعض بنى الحلقات البسيطة. وكان الشرط يُعبَّر عنه باستخدام عبارة goto . في كود فورتران 66 التالي، تبدو البنية المنطقية غير واضحة بسبب غياب الكتل البرمجية.
C تهيئة القيم المراد حسابها PAYSTX = . FALSE . PAYSST = . FALSE . TAX = 0.0 SUPTAX = 0.0 C تخطي خصم الضريبة إذا كان دخل الموظف أقل من الحد الأدنى للضريبة IF ( WAGES . LE . TAXTHR ) GOTO 100 PAYSTX = . TRUE . TAX = ( WAGES - TAXTHR ) * BASCRT C تخطي خصم الضريبة الإضافية إذا كان دخل الموظف أقل من الحد الأدنى للضريبة الإضافية IF ( WAGES . LE . SUPTHR ) GOTO 100 PAYSST = . TRUE . الضريبة الإضافية = ( الأجور - الضريبة الإضافية ) * الضريبة الإضافية 100 الضريبة المفروضة = الأجور - الضريبة - الضريبة الإضافيةتتيح الكتل البرمجية للمبرمج التعامل مع مجموعة من التعليمات كوحدة واحدة، ويمكن، باستخدام بنية الكتل، وضع القيم الافتراضية التي كان لا بد من ظهورها في التهيئة في هذا النمط من البرمجة بالقرب من القرار. يوضح الكود التالي في لغة باسكال لجنسن وويرث أن بنية الكتل تُسهّل فهم كيفية إعادة هيكلة الكود لزيادة وضوحه، كما تُسهّل عملية إعادة الهيكلة نفسها، إذ يُمكن نقل بنية الشرط الداخلي بسهولة من الشرط الخارجي، ويمكن التنبؤ بآثار ذلك بسهولة. يُوضح استخدام الكتل في المقطع أدناه نية المبرمج، ويُمكّن من دمج الكتل الناتجة في تسلسل هرمي متداخل من التعليمات الشرطية . تعكس بنية الكود تفكير المبرمج بشكل أدق، مما يُسهّل فهمه وتعديله. يُمكن جعل الكود أكثر وضوحًا بإخراج عبارة if الداخلية من الخارجية تمامًا، ووضع الكتلتين واحدة تلو الأخرى ليتم تنفيذهما بالتتابع. من الناحية الدلالية، لا يوجد فرق كبير في هذه الحالة، واستخدام بنية الكتلة، المدعومة بالمسافة البادئة لسهولة القراءة، يجعل من السهل على المبرمج إعادة هيكلة الكود.
إذا كانت الأجور أعلى من عتبة الضريبة ، فابدأ : اجعل قيمة paystax صحيحة ؛ واحسب الضريبة على أساس ( الأجور - عتبة الضريبة ) * معدل الضريبة. إذا كانت الأجور أعلى من عتبة الضريبة الفائقة ، فابدأ : اجعل قيمة pays_supertax صحيحة ؛ واحسب الضريبة الفائقة على أساس ( الأجور - عتبة الضريبة الفائقة ) * معدل الضريبة الفائقة . وإلا ، فابدأ: اجعل قيمة pays_supertax خاطئة ؛ واحسب الضريبة الفائقة على أساس 0. وإلا ، فابدأ : اجعل قيمة paystax خاطئة ؛ اجعل قيمة pays_supertax خاطئة ؛ واحسب الضريبة على أساس 0 ؛ واحسب الضريبة الفائقة على أساس 0. واحسب الضريبة على أساس ( الأجور - الضريبة - الضريبة الفائقة ).في اللغات البرمجية القديمة، كانت المتغيرات ذات نطاق واسع. على سبيل المثال، قد يُستخدم متغير صحيح يُسمى IEMPNO في جزء من روتين فرعي مكتوب بلغة فورتران للدلالة على رقم الضمان الاجتماعي للموظف، ولكن أثناء أعمال الصيانة على نفس الروتين الفرعي، قد يستخدم المبرمج عن طريق الخطأ نفس المتغير، IEMPNO، لغرض مختلف، مما قد يؤدي إلى خطأ يصعب تتبعه. أما بنية الكتل البرمجية فتُسهّل على المبرمجين التحكم في نطاق المتغيرات.
في جزء R5RS Standard Scheme التالي ، يُستخدم المتغير empno لتعريف كل من المدير ومرؤوسيه، كلٌّ حسب رقم الضمان الاجتماعي الخاص به. ولكن نظرًا لأن رقم الضمان الاجتماعي للمرؤوس مُعرَّف داخل كتلة داخلية، فإنه لا يتفاعل مع المتغير الذي يحمل نفس الاسم والذي يحتوي على رقم الضمان الاجتماعي للمدير. عمليًا، قد تدفع اعتبارات الوضوح المبرمج إلى اختيار أسماء متغيرات مختلفة، ولكن الخيار متاح، ومن الصعب إدخال خطأ غير مقصود. داخل تعبير lambda، يشير المتغير empno إلى رقم الضمان الاجتماعي للمرؤوس. أما المتغير empno في التعبير الخارجي، الذي يشير إلى رقم الضمان الاجتماعي للمدير، فهو مُظلَّل.
( let (( empno ( ssn-of employee-name ))) ( while ( is-manager empno ) ( let (( employees ( length ( underlings-of empno )))) ( printf "~a has ~a employees working under him:~%" employee-name employees ) ( for-each ( lambda ( empno ) ( printf "Name: ~a, role: ~a~%" ( name-of empno ) ( role-of empno ))) ( underlings-of empno )))))الرفع
في بعض لغات البرمجة، يمكن تعريف متغير ضمن نطاق الدالة حتى داخل الكتل المغلقة. على سبيل المثال، في جافا سكريبت، المتغيرات المُعرَّفة باستخدام `input` varلها نطاق الدالة.
انظر أيضاً
مراجع
- ↑ بيرليس، أ. ج .؛ ساميلسون، ك. (1958). "تقرير أولي: لغة جبرية دولية" . اتصالات رابطة آلات الحوسبة . 1 (12). نيويورك، نيويورك، الولايات المتحدة الأمريكية: رابطة آلات الحوسبة: 8-22 . doi : 10.1145/377924.594925 . S2CID 28755282 .
- ^ باكوس، جي دبليو ؛ باور، فلوريدا, فلوريدا ; جرين، ج. كاتز، C .؛ مكارثي، J .؛ بيرليس، AJ؛ روتيسهاوزر، هـ . ساملسون، ك. فوكوا، ب . ويجستين، JH. فان فيجنجاردن، أ؛ وودجر، م. (مايو 1960). نور، بيتر (محرر). "تقرير عن اللغة الخوارزمية ALGOL 60" . اتصالات ACM . 3 (5). نيويورك، نيويورك، الولايات المتحدة الأمريكية: ACM: 299-314 . دوى : 10.1145 / 367236.367262 . ISSN 0001-0782 . S2CID 278290 . تم الاسترجاع 2009-10-27 .
- بنى البرمجة
