البرمجة الهيكلية
البرمجة الهيكلية هي نموذج برمجي يتميز باستخدام كود المصدر الذي يستخدم بنية كود المصدر القائمة على الكتل لترميز تدفق التحكم مثل التسلسل والاختيار (أي if-then-else و switch ) والتكرار (أي for و while ).
كان الهدف الرئيسي لحركة البرمجة الهيكلية في الأصل هو الاستغناء عن عبارة goto واستخدامها . فنظرًا لأن goto توفر تحكمًا قويًا ومرنًا في تدفق البرنامج، يمكن استخدامها لكتابة أي خوارزمية معقدة، ولكن غالبًا ما يعاني الكود الناتج من مشاكل جودة كبيرة، ويُعرف عادةً باسم "كود السباغيتي" . تستبدل البرمجة الهيكلية عبارة goto ببنى برمجية تُنتج عادةً كودًا أفضل. وقد شاع هذا النموذج، وحقق إلى حد كبير هدفه في استبدال goto. في الواقع، أصبح انتشاره واسعًا لدرجة أنه في معظم عمليات تطوير البرمجيات ، أصبح ببساطة الطريقة المُتبعة في كتابة الكود، ولم يعد موضوعًا للنقاش كما كان في السابق.
يُربط أحيانًا بين البرمجة الهيكلية والبرمجة المعيارية على الرغم من اختلافهما. فبالمعنى العام، تشير البرمجة الهيكلية إلى المعيارية وكتابة البرامج بكفاءة وسهولة فهمها وتعديلها، ولكن هذا ليس المقصود بالبرمجة الهيكلية بالمعنى الضيق. [ 1 ]
بعد أن شاعت البرمجة الهيكلية، أُطلق على أسلوب البرمجة الذي سبقها اسم البرمجة غير الهيكلية . ورغم أنها تُعدّ نموذجًا برمجيًا من الناحية التقنية، إلا أنها تختلف عن النماذج الأخرى في أنها لم تُصمّم عمدًا، بل كانت ببساطة أحدث ما توصلت إليه التكنولوجيا قبل ظهور البرمجة الهيكلية.
تاريخ
ظهر النموذج في أواخر الخمسينيات مع ظهور لغات البرمجة ALGOL 58 و ALGOL 60 ، [ 2 ] حيث تضمنت الأخيرة دعمًا لهياكل الكتل.
تشمل العوامل المساهمة في شعبيتها وقبولها على نطاق واسع، في البداية في الأوساط الأكاديمية ولاحقًا بين الممارسين، نشر ما يُعرف الآن بنظرية البرنامج المهيكل في عام 1966، [ 3 ] ونشر الرسالة المفتوحة المؤثرة " عبارة Go To تعتبر ضارة " في عام 1968 من قبل عالم الكمبيوتر الهولندي إدسكار دبليو ديكسترا ، الذي صاغ مصطلح البرمجة المهيكلة . [ 4 ]
الأساس النظري
تُقدّم نظرية البرنامج المُهيكل الأساس النظري للبرمجة المُهيكلة. وتنص على أن ثلاث طرق لدمج البرامج - التسلسل، والاختيار، والتكرار - كافية للتعبير عن أي دالة قابلة للحساب . لم تنشأ هذه الملاحظة مع حركة البرمجة المُهيكلة؛ فهذه الهياكل كافية لوصف دورة تعليمات وحدة المعالجة المركزية ، وكذلك تشغيل آلة تورينج . لذلك، يُنفّذ المعالج دائمًا "برنامجًا مُهيكلًا" بهذا المعنى، حتى لو لم تكن التعليمات التي يقرأها من الذاكرة جزءًا من برنامج مُهيكل. ومع ذلك، يُنسب المؤلفون عادةً هذه النتيجة إلى ورقة بحثية نُشرت عام 1966 من قِبل بوم وجاكوبيني، ربما لأن ديكسترا نفسه استشهد بهذه الورقة. [ 5 ] لا تتناول نظرية البرنامج المُهيكل كيفية كتابة وتحليل برنامج مُهيكل مفيد. تمت معالجة هذه القضايا خلال أواخر الستينيات وأوائل السبعينيات، بمساهمات كبيرة من ديجكسترا ، وروبرت دبليو فلويد ، وتوني هوار ، وأولي يوهان دال ، وديفيد جريس .
مناظرة
وصف بي جيه بلاوجر ، أحد أوائل من تبنوا البرمجة الهيكلية، رد فعله على نظرية البرمجة الهيكلية:
لوّح المتحولون منّا بهذه المعلومة المثيرة للاهتمام أمام أعين مبرمجي لغة التجميع الذين لم يتخلوا عن مبادئهم، والذين استمروا في طرح عبارات منطقية معقدة قائلين: "أراهن أنكم لا تستطيعون هيكلة هذا". لم ينجح لا برهان بوم وجاكوبيني ولا نجاحاتنا المتكررة في كتابة التعليمات البرمجية المهيكلة في إقناعهم قبل أن يكونوا مستعدين لذلك. [ 6 ]
قبل دونالد كنوث مبدأ ضرورة كتابة البرامج مع مراعاة إمكانية إثباتها، لكنه اختلف مع إلغاء عبارة GOTO، واعتبارًا من عام 2018استمر في استخدامها في برامجه. [ 7 ] في ورقته البحثية عام 1974 بعنوان "البرمجة المهيكلة باستخدام عبارات Goto"، [ 8 ] قدم أمثلةً اعتقد فيها أن القفزة المباشرة تؤدي إلى كود أكثر وضوحًا وكفاءةً دون التضحية بإمكانية الإثبات. اقترح كنوت قيدًا هيكليًا أقل صرامة: ينبغي أن يكون من الممكن رسم مخطط تدفق البرنامج بحيث تكون جميع الفروع الأمامية على اليسار، وجميع الفروع الخلفية على اليمين، ولا تتقاطع أي فروع مع بعضها البعض. وقد دعا بعض الخبراء في المترجمات ونظرية الرسوم البيانية إلى السماح فقط بمخططات التدفق القابلة للاختزال .
اكتسب منظرو البرمجة الهيكلية حليفًا قويًا في سبعينيات القرن الماضي بعد أن طبّق الباحث هارلان ميلز من شركة IBM تفسيره لنظرية البرمجة الهيكلية على تطوير نظام فهرسة لملف أبحاث صحيفة نيويورك تايمز . حقق المشروع نجاحًا هندسيًا باهرًا، واستشهد به مديرو الشركات الأخرى لدعم تبني البرمجة الهيكلية، على الرغم من أن ديكسترا انتقد أوجه الاختلاف بين تفسير ميلز والأبحاث المنشورة. [ 9 ]
حتى عام 1987، كان لا يزال من الممكن طرح مسألة البرمجة الهيكلية في إحدى مجلات علوم الحاسوب. وقد فعل فرانك روبين ذلك في ذلك العام برسالة مفتوحة بعنوان "استخدام عبارة GOTO يُعتبر ضارًا". [ 10 ] وتلت ذلك اعتراضات عديدة، من بينها ردٌّ من ديكسترا انتقد فيه روبين بشدة، وكذلك التنازلات التي قدمها كتّاب آخرون عند الرد عليه.
حصيلة
بحلول نهاية القرن العشرين، اقتنع جميع علماء الحاسوب تقريباً بأهمية تعلم وتطبيق مفاهيم البرمجة الهيكلية. أما لغات البرمجة عالية المستوى التي كانت تفتقر في الأصل إلى هياكل البرمجة، مثل فورتران وكوبول وبيسيك ، فقد أصبحت الآن تتضمنها.
هياكل التحكم
وفقًا لنظرية البرنامج المهيكل ، يتكون البرنامج من ثلاثة هياكل تحكم:
- تسلسل
- يتم تنفيذ العبارات المرتبة بالتسلسل.
- على الرغم من أن مفهوم الكتلة ليس جزءًا من نظرية البرمجة المهيكلة، إلا أن لغات البرمجة تتضمن عمومًا مفهوم الكتلة الذي يُجمّع سلسلة من التعليمات البرمجية بحيث تعمل كوحدة واحدة. توفر اللغة طريقة لتمييز سلسلة من التعليمات ككتلة، والتي تُنفّذ بالتسلسل من الأعلى إلى الأسفل ما لم تتضمن تحكمًا في التدفق. على سبيل المثال، تُحاط الكتلة بأقواس معقوفة
{...}في لغة C وغيرها من اللغات التي تستخدم الأقواس المعقوفة ، وتُحاط بـBEGIN...ENDفي PL/I وباسكال ، ويُشار إليها بالمسافة البادئة في بايثون . تستخدم بعض الكتل صيغة مختلفة لكل بنية. على سبيل المثال، تُحاط عبارة if بـ فيif...fiALGOL 68 .
- اختيار
- يتم تنفيذ كتلة برمجية (قد تكون عبارة واحدة) بناءً على حالة البرنامج. يُعبَّر عن هذا التركيب غالبًا باستخدام كلمات مفتاحية مثل
if`if`thenو`if` و`elseif`. يجب أن تحتوي العبارة الشرطية على مسار واحد على الأقل صحيح، ويجب أن يحتوي كل مسار شرطي على نقطة خروج واحدة فقط.
- التكرار
- (أو التكرار) يتم تنفيذ كتلة برمجية (قد تكون عبارة واحدة) بشكل متكرر حتى يصل البرنامج إلى حالة معينة. يُعبَّر عن هذا التركيب غالبًا باستخدام كلمات مفتاحية مثل `--`، `--`، `--`
while،repeatأوfor`do-until--`. على الرغم من أن البرمجة الهيكلية تُقيِّد تدفق البرنامج بنقطة دخول واحدة ونقطة خروج واحدة فقط، فإن معظم لغات البرمجة تسمح بنقاط خروج متعددة مبكرة.

الدعم اللغوي
عمومًا، تُصمَّم لغة البرمجة لدعم نموذج برمجي واحد أو أكثر. وفي الوقت نفسه، حتى وإن لم تُصمَّم لغة ما لدعم نموذج برمجي معين، فإنه يُمكن استخدامها غالبًا لهذا الغرض. نظريًا، يُمكن استخدام أي لغة للبرمجة الهيكلية. من بين اللغات التي استُخدمت في البداية للبرمجة الهيكلية: ALGOL و Pascal و PL/I و Ada و RPL ، ولكن معظم لغات البرمجة الإجرائية الجديدة منذ ذلك الحين قد أضافت ميزات لتشجيع البرمجة الهيكلية، وأحيانًا استبعدت عمدًا بعض الميزات - ولا سيما أمر GOTO - لتجنب عيوبها.
الانحرافات الشائعة
على الرغم من أن استخدام goto قد تم استبداله إلى حد كبير بالبنى المهيكلة، إلا أن معظم اللغات توفر ميزات لا تتوافق تمامًا مع نظرية البرمجة المهيكلة.
العودة المبكرة
تُتيح معظم لغات البرمجة عبارة إرجاع تسمح بنقاط خروج متعددة ومبكرة من الدالة . وبما أن الدالة عبارة عن كتلة برمجية، فإن هذه الميزة تُخالف نقطة الخروج الوحيدة الموصوفة في النظرية.
خروج مبكر
تُتيح العديد من لغات البرمجة إمكانية الخروج المبكر من كتلة برمجية (بخلاف استخدام عبارة return). على سبيل المثال، قد يدعم بناء حلقة تكرارية عبارة break التي تُنهي كتلة الحلقة قبل نهايتها. وكما تُبيّن النظرية، يُمكن الاستغناء عن منطق الخروج المبكر هذا بإضافة فروع أو اختبارات، ولكن هذا قد يُضيف تعقيدًا كبيرًا. تُعدّ لغة C مثالًا مبكرًا وبارزًا على هذه البنى. كما تحتوي بعض اللغات الحديثة على "عبارات break مُصنّفة"، والتي تُتيح الخروج من أكثر من مجرد الحلقة الداخلية.
قد تنشأ الحاجة إلى مخارج متعددة لأسباب متنوعة، وغالبًا ما يكون ذلك إما لأن الدالة لم يعد لديها المزيد من العمل للقيام به (إذا كانت تُرجع قيمة، فقد أكملت الحساب)، أو أنها واجهت ظروفًا "استثنائية" تمنعها من الاستمرار، وبالتالي تحتاج إلى معالجة الاستثناءات.
من مشاكل الخروج المبكر احتمال عدم تنفيذ تعليمات التنظيف. على سبيل المثال، قد لا يتم تحرير الذاكرة المخصصة، أو قد لا يتم إغلاق الملفات المفتوحة، مما يؤدي إلى تسرب الذاكرة والموارد . يجب إجراء التنظيف عند كل نقطة إرجاع، وهو أمر هشّ وقد يؤدي بسهولة إلى ظهور أخطاء. على سبيل المثال، في مراحل التطوير اللاحقة، قد يتجاهل المطور عبارة الإرجاع، وقد لا يتم تنفيذ إجراء يُفترض تنفيذه في نهاية الدالة (مثل عبارة التتبع ) في جميع الحالات. أما اللغات التي لا تحتوي على عبارة إرجاع، مثل باسكال ، وليسب ، وأو كاميل ، فلا تعاني من هذه المشكلة.
توفر معظم لغات البرمجة الحديثة دعمًا على مستوى اللغة لمنع مثل هذه التسريبات [ 11 ] (انظر إدارة الموارد ). وكبديل منظم لاستخدام عبارة goto وكتلة التنظيف، تضمن حماية فك الالتفاف تنفيذ جزء معين من التعليمات البرمجية عند الخروج من كتلة التنفيذ؛ وغالبًا ما يتم تطبيقها بالتزامن مع معالجة الاستثناءات باستخدام عبارة try-finally. أما في لغة C++، فيُستخدم أسلوب بديل يتمثل في الحصول على الموارد عند التهيئة ، والذي يعتمد على فك الالتفاف العادي للمكدس (إلغاء تخصيص المتغيرات) عند الخروج من الدالة لاستدعاء دوال التدمير على المتغيرات المحلية لإلغاء تخصيص الموارد.
جادل كينت بيك ومارتن فاولر وزملاؤهما في كتبهم عن إعادة هيكلة البرامج بأن العبارات الشرطية المتداخلة قد تكون أصعب فهمًا من نوع معين من البنية المسطحة التي تستخدم مخارج متعددة مشروطة بعبارات حماية . وينص كتابهم الصادر عام 2009 صراحةً على أن "نقطة خروج واحدة ليست قاعدة مفيدة حقًا. الوضوح هو المبدأ الأساسي: إذا كانت الدالة أوضح بنقطة خروج واحدة، فاستخدمها؛ وإلا فلا تستخدمها". ويقدمون حلاً عمليًا لتحويل دالة تتكون فقط من عبارات شرطية متداخلة إلى سلسلة من عبارات الإرجاع (أو الاستثناء) المحمية، متبوعة بكتلة واحدة غير محمية، والتي يُفترض أن تحتوي على شيفرة الحالة الشائعة، بينما يُفترض أن تتعامل العبارات المحمية مع الحالات الأقل شيوعًا (أو مع الأخطاء). [ 12 ] كما يجادل هيرب سوتر وأندريه ألكسندرسكو في كتابهما عن نصائح لغة C++ الصادر عام 2004 بأن نقطة الخروج الواحدة أصبحت مطلبًا عفا عليه الزمن. [ 13 ]
في كتابه الدراسي الصادر عام ٢٠٠٤، يذكر ديفيد وات أن "تدفقات التحكم ذات المدخل الواحد والمخارج المتعددة مرغوبة في كثير من الأحيان". وباستخدام مفهوم " المُسلسل" الذي وضعه تيننت ، يصف وات بشكل موحد بنيات تدفق التحكم الموجودة في لغات البرمجة المعاصرة، ويحاول شرح سبب تفضيل أنواع معينة من المُسلسلات على غيرها في سياق تدفقات التحكم متعددة المخارج. ويشير وات إلى أن عبارات "goto" غير المقيدة (مُسلسلات القفز) غير مرغوبة لأن وجهة القفزة لا تكون واضحة لقارئ البرنامج حتى يعثر على العنوان أو التسمية الفعلية التي تمثل هدف القفزة ويفحصها. في المقابل، يرى وات أن الغرض المفاهيمي لمُسلسل الإرجاع واضح من سياقه، دون الحاجة إلى فحص وجهته. ويذكر وات أن فئة من المُسلسلات تُعرف باسم مُسلسلات الهروب ، والتي تُعرَّف بأنها "مُسلسل يُنهي تنفيذ أمر أو إجراء مُحاط بنص"، تشمل كلاً من الخروج من الحلقات (بما في ذلك الخروج متعدد المستويات) وعبارات الإرجاع. يشير وات أيضًا إلى أنه على الرغم من تقييد استخدام تسلسلات القفز (goto) في لغات مثل C، حيث يجب أن يكون الهدف داخل الكتلة المحلية أو كتلة خارجية محيطة بها، فإن هذا التقييد وحده لا يكفي لجعل الغرض من استخدام goto في C واضحًا بذاته، وبالتالي لا يزال من الممكن أن ينتج عنه " كود معقد ". كما يتناول وات كيفية اختلاف تسلسلات الاستثناءات عن تسلسلات الهروب والقفز؛ وسيتم شرح ذلك في القسم التالي من هذه المقالة. [ 14 ]
على النقيض مما سبق، كتب برتراند ماير في كتابه المدرسي الصادر عام 2009 أن تعليمات مثل "break" و"continue" ليست سوى حيل قديمة مُقنّعة، ونصح بشدة بعدم استخدامها. [ 15 ]
معالجة الاستثناءات
يشير بيتر ريتشي إلى أنه من حيث المبدأ، حتى مجرد رمية استثناء واحدة قبل نقطة العودة تُعدّ انتهاكًا لمبدأ الخروج الأحادي، لكنه يجادل بأن قواعد ديكسترا كُتبت في زمنٍ لم تكن فيه معالجة الاستثناءات نموذجًا سائدًا في لغات البرمجة، لذا فهو يقترح السماح بأي عدد من نقاط الرمي بالإضافة إلى نقطة عودة واحدة. ويشير إلى أن الحلول التي تُغلّف الاستثناءات بهدف إنشاء خروج واحد تتميز بعمق تداخل أكبر، وبالتالي يصعب فهمها، بل ويتهم أولئك الذين يقترحون تطبيق مثل هذه الحلول على لغات البرمجة التي تدعم الاستثناءات بالانخراط في تفكيرٍ أعمى . [ 16 ]
يُحلل ديفيد وات أيضًا معالجة الاستثناءات في إطار عمل المُسلسلات (التي تم تقديمها في هذا المقال في القسم السابق حول الخروج المبكر ). ويشير وات إلى أن الحالة الشاذة (والتي تتمثل عادةً في تجاوزات العمليات الحسابية أو فشل الإدخال/الإخراج مثل عدم العثور على الملف) هي نوع من الأخطاء التي "يتم اكتشافها في وحدة برمجية منخفضة المستوى، ولكن من الأنسب أن يكون مُعالجها موجودًا في وحدة برمجية عالية المستوى". على سبيل المثال، قد يحتوي البرنامج على عدة استدعاءات لقراءة الملفات، ولكن الإجراء الذي يتم تنفيذه عند عدم العثور على ملف يعتمد على معنى (غرض) الملف المعني بالنسبة للبرنامج، وبالتالي لا يمكن تحديد روتين معالجة هذه الحالة الشاذة في كود النظام منخفض المستوى. ويشير واتس كذلك إلى أن إدخال اختبارات علامات الحالة في الدالة المستدعِية، كما هو الحال في البرمجة الهيكلية ذات المخرج الواحد أو حتى في مُسلسلات الإرجاع (ذات المخارج المتعددة)، يؤدي إلى حالة "يميل فيها كود التطبيق إلى أن يصبح مزدحمًا باختبارات علامات الحالة"، وأن "المبرمج قد ينسى أو يتجاهل اختبار علامة حالة ما. في الواقع، يتم تجاهل الحالات الشاذة التي تمثلها علامات الحالة افتراضيًا!". ويلاحظ أنه على عكس اختبار علامات الحالة، فإن الاستثناءات لها سلوك افتراضي معاكس ، مما يؤدي إلى إنهاء البرنامج ما لم يتعامل المبرمج مع الاستثناء بشكل صريح بطريقة ما، ربما عن طريق إضافة كود لتجاهله عمدًا. بناءً على هذه الحجج، يخلص واتس إلى أن مُسلسلات القفز أو مُسلسلات الهروب (التي نوقشت في القسم السابق) ليست مناسبة مثل مُسلسل استثناءات مخصص بالدلالات المذكورة أعلاه. [ 17 ]
يؤكد كتاب لودن ولامبرت أن معالجة الاستثناءات تختلف عن بنيات البرمجة الهيكلية مثل حلقات while، لأن نقل التحكم "يتم إعداده في نقطة مختلفة من البرنامج عن النقطة التي يحدث فيها النقل الفعلي. عند النقطة التي يحدث فيها النقل فعليًا، قد لا يكون هناك أي مؤشر نحوي على أن التحكم سينتقل بالفعل." [ 18 ] ويشير أستاذ علوم الحاسوب أرفيند كومار بانسال أيضًا إلى أنه في اللغات التي تُنفذ معالجة الاستثناءات، حتى بنيات التحكم مثل for، التي تتمتع بخاصية الخروج الفردي في غياب الاستثناءات، تفقد هذه الخاصية في وجود الاستثناءات، لأن الاستثناء قد يتسبب في خروج مبكر في أي جزء من بنية التحكم؛ على سبيل المثال، إذا init()أطلق استثناءً في دالة for (init(); check(); increm())check()، فلن يتم الوصول إلى نقطة الخروج المعتادة بعد check(). [ 19 ] وبالاستناد إلى دراسات سابقة متعددة أجراها باحثون آخرون (1999-2004) ونتائجهم الخاصة، كتب ويستلي وايمر وجورج نيكولا أن إحدى المشكلات الرئيسية في الاستثناءات هي أنها "تُنشئ مسارات تحكم خفية يصعب على المبرمجين فهمها". [ 20 ]
تظهر ضرورة تقييد التعليمات البرمجية بنقاط خروج واحدة في بعض بيئات البرمجة المعاصرة التي تركز على الحوسبة المتوازية ، مثل OpenMP . لا تسمح بنيات التوازي المختلفة في OpenMP، مثل ` parallel do_____________، بالخروج المبكر من داخل بنية التوازي إلى خارجها؛ يشمل هذا القيد جميع أنواع الخروج، بما في ذلك `break` والاستثناءات، ولكن يُسمح بكل هذه الأنواع داخل بنية التوازي إذا كان هدف القفز موجودًا أيضًا داخلها. [ 21 ]
إدخال متعدد
نادرًا ما تسمح الدوال بدخول متعدد. ويقتصر هذا غالبًا على إعادة الدخول إلى روتين فرعي (أو مولد /روتين فرعي شبه)، حيث تُسلّم الدالة التحكم (وربما قيمة)، ولكن يمكن استئنافها من حيث توقفت. لهذا النوع من البرمجة استخدامات شائعة عديدة، لا سيما في تدفقات البيانات (خاصةً المدخلات/المخرجات)، وآلات الحالة، والتزامن. من منظور تنفيذ التعليمات البرمجية، يُعدّ التنازل عن التحكم من روتين فرعي أقرب إلى البرمجة المهيكلة من العودة من دالة، لأن الدالة لم تنتهِ فعليًا، وستستمر عند استدعائها مرة أخرى - فهو ليس خروجًا مبكرًا. مع ذلك، تعني الروتينات الفرعية أن دوالًا متعددة لها حالة تنفيذ - بدلًا من مكدس استدعاء واحد للدوال - مما يُدخل شكلًا مختلفًا من التعقيد.
من النادر أن تسمح الدوال بالدخول إلى موضع عشوائي في الدالة، لأنه في هذه الحالة تكون حالة البرنامج (مثل قيم المتغيرات) غير مهيأة أو غامضة، وهذا يشبه أمر goto.
آلات الحالة
تتضمن بعض البرامج، ولا سيما برامج التحليل اللغوي وبروتوكولات الاتصال ، عددًا من الحالات المتتابعة بطريقة يصعب اختزالها إلى البنى الأساسية، ولذا يقوم بعض المبرمجين بتنفيذ تغييرات الحالة بالقفز إلى الحالة الجديدة. يُستخدم هذا النوع من تبديل الحالة بكثرة في نواة لينكس. [ 22 ]
مع ذلك، من الممكن هيكلة هذه الأنظمة بجعل كل تغيير في الحالة دالة منفصلة واستخدام متغير للإشارة إلى الحالة النشطة (انظر الترامبولين ). بدلاً من ذلك، يمكن تنفيذ ذلك عبر الروتينات الفرعية، مما يُغني عن استخدام الترامبولين.
انظر أيضاً
مراجع
الاقتباسات
- ↑ "ما هي البرمجة الهيكلية؟" . جودة البرمجيات . تم الاسترجاع في 2024-04-09 .
- ↑ كلارك، ليزلي ب. ويلسون، روبرت ج.؛ روبرت، كلارك (2000). لغات البرمجة المقارنة ( الطبعة الثالثة). هارلو، إنجلترا: أديسون-ويسلي. ص 20. ISBN 9780201710120أُرشف من المصدر الأصلي بتاريخ 26 نوفمبر 2015. تم الاطلاع عليه بتاريخ 25 نوفمبر 2015 .
{{cite book}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) - ↑ بوم وجاكوبيني 1966 .
- ↑ ديكسترا 1968 ، ص 147، "إن الاستخدام المفرط لعبارة go to يؤدي مباشرةً إلى صعوبة بالغة في إيجاد مجموعة إحداثيات ذات معنى لوصف تقدم العملية. ... إن عبارة go to بصيغتها الحالية بدائية للغاية، وهي بمثابة دعوة صريحة لإفساد البرنامج."
- ↑ ديكسترا 1968 .
- ↑ بلاوجر، بي جيه ( 12 فبراير 1993). البرمجة الهادفة، مقالات في تصميم البرمجيات ( الطبعة الأولى). برنتيس هول. ص 25. ISBN 978-0-13-721374-0.
- ↑ DLS • دونالد كنوث • إجابات على جميع الأسئلة . يوتيوب . جامعة واترلو. ١٥ نوفمبر ٢٠١٨. ٤٨ دقيقة . تم الاطلاع عليه بتاريخ ٢٤ يوليو ٢٠٢٢ .
- ↑ دونالد إي. كنوث (ديسمبر 1974). "البرمجة المهيكلة باستخدام عبارات الانتقال" (ملف PDF) . مجلة Computing Surveys . 6 (4): 261–301 . doi : 10.1145/356635.356640 . S2CID 207630080. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 23 أكتوبر 2013.
- ↑ في EWD1308، "ما الذي أدى إلى "ملاحظات حول البرمجة الهيكلية"" .في رسالة مؤرخة في 10 يونيو 2001، كتب ديكسترا: "على ما يبدو، لم تعجب شركة IBM شعبية نصي؛ فقد سرقت مصطلح "البرمجة الهيكلية" وتحت رعايتها قام هارلان دي ميلز بتبسيط المفهوم الأصلي إلى إلغاء عبارة goto".
- ↑ فرانك روبين (مارس 1987). ""استخدام GOTO يُعتبر ضارًا" (ملف PDF) . مجلة اتصالات ACM . 30 (3): 195-196 . doi : 10.1145/214748.315722 . S2CID 6853038. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 20 مارس 2009.
- ↑ إلدر، مات؛ جاكسون، ستيف؛ ليبليت، بن (أكتوبر 2008). شطائر الشفرة (ملف PDF) (تقرير فني). جامعة ويسكونسن-ماديسون . 1647.
- ↑ جاي فيلدز؛ شين هارفي؛ مارتن فاولر؛ كينت بيك (2009). إعادة هيكلة الكود: إصدار روبي . بيرسون للتعليم. الصفحات 274-279 . ISBN 978-0-321-60350-0.
- ↑ هيرب ساتر؛ أندريه ألكسندرسكو (2004). معايير برمجة لغة C++: 101 قاعدة، وإرشادات، وأفضل الممارسات . بيرسون للتعليم. ISBN 978-0-13-265442-5مثال 4: مدخل واحد، مخرج واحد ("SESE"). تاريخيًا ،
اشترطت بعض معايير البرمجة أن تحتوي كل دالة على مخرج واحد فقط، أي عبارة إرجاع واحدة. أصبح هذا الشرط قديمًا في اللغات التي تدعم الاستثناءات والمدمرات، حيث تحتوي الدوال عادةً على العديد من المخارج الضمنية.
- ↑ وات وفيندلاي 2004 ، ص 215-221.
- ↑ برتراند ماير (2009). لمسة من الرقي: تعلم البرمجة الجيدة باستخدام الكائنات والعقود . سبرينغر ساينس آند بيزنس ميديا. ص 189. ISBN 978-3-540-92144-8.
- ↑ "مدخل واحد، مخرج واحد، هل لا يزال هذا المبدأ قابلاً للتطبيق في لغات البرمجة الكائنية؟" . مدونة بيتر ريتشي لأفضل منتج . 7 مارس 2008. مؤرشف من الأصل في 14 نوفمبر 2012. تم الاطلاع عليه في 15 يوليو 2014 .
- ↑ وات وفيندلاي 2004 ، ص 221-222.
- ↑ كينيث سي. لاودن؛ كينيث أ. لامبرت (2011). لغات البرمجة: المبادئ والممارسات ( الطبعة الثالثة). سينجايج ليرنينج. ص 423. ISBN 978-1-111-52941-3.
- ↑ أرفيند كومار بانسال (2013). مقدمة في لغات البرمجة . مطبعة سي آر سي. ص 135. ISBN 978-1-4665-6514-2.
- ↑ وايمر، دبليو. ونيكولا، جي سي (2008). "الحالات الاستثنائية وموثوقية البرامج" (ملف PDF) . معاملات ACM في لغات البرمجة والأنظمة . 30 (2). 8:27. doi : 10.1145/1330017.1330019 . S2CID 3136431. مؤرشف من الأصل (ملف PDF) بتاريخ 23-09-2015.
- ↑ روهيت تشاندرا (2001). البرمجة المتوازية في OpenMP . مورغان كوفمان. ص 45. ISBN 978-1-55860-671-5.
- ↑ سيدني أماني؛ ب. تشاب؛ ألاستير ف. دونالدسون؛ ألكسندر ليغ؛ ل. ريزيك؛ يانجين تشو (2012). "التحقق التلقائي من برامج تشغيل الأجهزة القائمة على الرسائل". ورشة العمل الدولية حول التحقق من برمجيات الأنظمة . الصفحات 4-17 . arXiv : 1211.6185 . doi : 10.4204/EPTCS.102.3 .
مصادر
- إدسكار ديكسترا ، ملاحظات حول البرمجة الهيكلية ، ص 6.
- بوم، كورادو ؛ جاكوبيني، جوزيبي (مايو 1966). "مخططات التدفق، وآلات تورينج، واللغات ذات قاعدتي تكوين فقط" (ملف PDF) . مجلة اتصالات رابطة آلات الحوسبة . 9 (5): 366-371 . CiteSeerX 10.1.1.119.9119 . doi : 10.1145/355592.365646 . S2CID 10236439. مؤرشف (ملف PDF) من الأصل بتاريخ 23 سبتمبر 2015.
- ديجكسترا، إدسكار دبليو. (مارس 1968). "رسائل إلى المحرر: بيان Go to يُعتبر ضارًا" (ملف PDF) . مجلة اتصالات رابطة آلات الحوسبة . 11 (3): 147-148 . doi : 10.1145/362929.362947 . ISSN 0001-0782 . S2CID 17469809 .
- مايكل أ. جاكسون ، مبادئ تصميم البرامج ، دار النشر الأكاديمية، لندن، 1975.
- أو. ج. دال ، إي. دبليو. ديكسترا ، سي. إيه. آر. هوار، البرمجة الهيكلية ، دار النشر الأكاديمية، لندن، 1972. رقم ISBN 0-12-200550-3.
- يتضمن هذا المجلد نسخة موسعة من الملاحظات حول البرمجة الهيكلية المذكورة أعلاه، بما في ذلك مثال موسع لاستخدام النهج الهيكلي لتطوير خوارزمية التراجع لحل مشكلة الملكات الثماني .
- تتوفر نسخة PDF ضمن سلسلة كتب ACM الكلاسيكية
- تجدر الإشارة إلى أن الفصل الثالث من هذا الكتاب، بقلم دال، يصف منهجًا يُعرف بسهولة باسم البرمجة الكائنية التوجه. ويمكن اعتباره طريقة أخرى لـ"هيكلة" البرنامج بشكل مفيد للمساعدة في إثبات صحته.
- وات، ديفيد أنتوني؛ فيندلاي، ويليام (2004). مفاهيم تصميم لغات البرمجة . جون وايلي وأولاده. ISBN 978-0-470-85320-7.
روابط خارجية
- BPStruct - أداة لهيكلة الأنظمة المتزامنة (البرامج، نماذج العمليات)
- ج. دارلينتون؛ م. غانم؛ هـ. و. تو (1993)، "البرمجة المتوازية المهيكلة"، في نماذج البرمجة للحواسيب المتوازية الضخمة. مطبعة جمعية مهندسي الكهرباء والإلكترونيات. 1993 : 160-169 ، CiteSeerX 10.1.1.37.4610
- نماذج البرمجة
- الشمولية
