تدفق التحكم
في البرمجيات ، يصف تدفق التحكم (أو تدفق التحكم ) كيفية تقدم التنفيذ من أمر إلى آخر. في العديد من السياقات، مثل لغة الآلة ولغات البرمجة الإجرائية ، يتقدم التحكم بشكل تسلسلي (إلى الأمر الذي يلي الأمر الجاري تنفيذه مباشرةً) باستثناء حالة نقل التحكم إلى نقطة أخرى ، حيث يُصنف الأمر حينها كأمر تحكم. وبحسب السياق، تُستخدم مصطلحات أخرى بدلاً من " أمر" . على سبيل المثال، في لغة الآلة، يُستخدم مصطلح " تعليمات" ، وفي لغات البرمجة الإجرائية، يُستخدم مصطلح " عبارة" .
على الرغم من أن اللغة الإجرائية تُشفّر تدفق التحكم بشكل صريح، فإن لغات البرمجة الأخرى أقل تركيزًا على تدفق التحكم. تُحدد اللغة التصريحية النتائج المرجوة دون فرض ترتيب معين للعمليات. أما اللغة الوظيفية فتستخدم كلاً من بنيات اللغة والدوال للتحكم في التدفق ، مع أنها لا تُسمى عادةً عبارات تحكم في التدفق.
في مجموعة تعليمات وحدة المعالجة المركزية ، غالبًا ما تُغير تعليمات التحكم في التدفق عداد البرنامج ، وتكون إما تفرعًا غير مشروط (يُعرف أيضًا بالقفز) أو تفرعًا مشروطًا. وهناك نهج بديل هو التنبؤ الذي يُفعّل التعليمات بشكل مشروط بدلًا من التفرع.
يؤدي نقل تدفق التحكم غير المتزامن مثل المقاطعة أو الإشارة إلى تغيير التدفق الطبيعي للتحكم إلى معالج قبل إعادة التحكم إلى المكان الذي تمت مقاطعته فيه.
إحدى طرق مهاجمة البرمجيات هي إعادة توجيه مسار التنفيذ. وتُستخدم مجموعة متنوعة من تقنيات سلامة تدفق التحكم ، بما في ذلك مؤشرات التحقق من تجاوز سعة المخزن المؤقت ، وحماية تجاوز سعة المخزن المؤقت ، ومكدسات الظل، والتحقق من مؤشرات جدول الدوال الافتراضية ، للدفاع ضد هذه الهجمات. [ 1 ] [ 2 ] [ 3 ]
بناء
يرتبط تدفق التحكم ارتباطًا وثيقًا ببنية الكود. ويتدفق التحكم وفقًا لخطوط محددة ببنية وقواعد تنفيذ لغة البرمجة. يجب عدم الخلط بين هذا المفهوم العام للبنية والبرمجة الهيكلية التي تحصر البنية في التسلسل والاختيار والتكرار بناءً على تنظيم الكتل .
تسلسل
يُعدّ التنفيذ التسلسلي البنية الأساسية. مع أن ليس كل البرامج تسلسلية بطبيعتها، إلا أن البرامج الإجرائية كذلك.
ملصق
يُحدد الوسم موضعًا في شفرة المصدر . تشير بعض عبارات التحكم في التدفق إلى وسم بحيث ينتقل التحكم إلى السطر الموسوم. بخلاف تحديد الموضع، لا يكون للوسم أي تأثير آخر .
تُقيّد بعض لغات البرمجة التسمية برقم يُسمى أحيانًا رقم السطر ، مع أن هذا يُشير إلى فهرس السطر نفسه، وليس إلى التسمية. ومع ذلك، يُشترط عادةً أن تتزايد هذه التسميات الرقمية من أعلى الملف إلى أسفله، حتى وإن لم تكن متسلسلة. على سبيل المثال، في لغة BASIC:
10 اجعل X = 3 20 اطبع X 30 انتقل إلى 10في العديد من لغات البرمجة، يُعدّ الوسم مُعرّفًا أبجديًا رقميًا ، يظهر عادةً في بداية السطر ويتبعه مباشرةً نقطتان رأسيتان. على سبيل المثال، يُعرّف كود C التالي وسمًا Successفي السطر 3 يُحدّد نقطة هدف القفز في أول عبارة تليه (السطر 4).
void f ( bool ok ) {إذا ( موافق ) {انتقل إلى النجاح ؛}يعود ؛نجاح :printf ( "OK" );}حاجز
تُتيح معظم لغات البرمجة تنظيم تسلسلات التعليمات البرمجية على شكل كتلة . عند استخدامها مع عبارة تحكم، تُحدد بداية الكتلة هدفًا للقفز. على سبيل المثال، في كود C التالي (الذي يستخدم الأقواس المعقوفة لتحديد الكتلة)، ينتقل التحكم من السطر 1 إلى السطر 4 إذا كانت قيمة `done` خاطئة.
إذا ( تم ) {printf ( "تم الانتهاء من كل شيء" );} آخر {printf ( "ما زلت أعمل على ذلك" );}يتحكم
تم ابتكار العديد من أوامر التحكم للغات البرمجة. يصف هذا القسم أبرز هذه الأوامر، وهو مُرتب حسب وظائفها.
وظيفة
تُتيح الدالة التحكم في تدفق التنفيذ، فعند استدعائها، ينتقل التنفيذ إلى بداية كود الدالة، وعند اكتمالها، يعود التحكم إلى نقطة الاستدعاء. في كود C التالي، ينتقل التحكم من السطر 6 إلى السطر 2 لاستدعاء الدالة foo(). ثم، بعد اكتمال جسم الدالة (طباعة "Hi")، يعود التحكم إلى السطر 7 بعد الاستدعاء.
void foo () {printf ( "Hi" );}دالة bar () {foo ();printf ( "تم" );}فرع
ينقل أمر التفرع نقطة التنفيذ من النقطة الموجودة في الكود والتي تحتوي على الأمر إلى النقطة التي يحددها الأمر.
اقفز
يقوم أمر القفز بنقل التحكم بشكل غير مشروط إلى نقطة أخرى في الكود، وهو أبسط أشكال التحكم في تدفق الكود.
في لغات البرمجة عالية المستوى، يُستخدم هذا الأمر غالبًا كأمر goto . على الرغم من أن الكلمة المفتاحية قد تكون بأحرف كبيرة أو صغيرة، أو كلمة واحدة أو كلمتين حسب اللغة، إلا أنها تُفهم على النحو التالي: . عندما يصل التحكم إلى أمر goto، ينتقل إلى الأمر الذي يليه. وقد اعتبر العديد من علماء الحاسوب، بمن فيهم ديكسترا، أمر goto ضارًا .goto label
الفرع الشرطي
تُغيّر العبارة الشرطية مستوى التحكم بناءً على قيمة تعبير منطقي . ومن بين الصيغ الشائعة ما يلي:
- إذا-انتقل
- ينتقل إلى علامة بناءً على شرط؛ عبارة برمجية عالية المستوى تحاكي بشكل وثيق تعليمة مماثلة مستخدمة في لغة الآلة
- إذا-ثم
- بدلاً من أن يقتصر تنفيذ العبارة أو الكتلة على القفز، يتم تنفيذها إذا كان التعبير صحيحًا. في لغة لا تتضمن الكلمة
thenالمفتاحية `if`، يُطلق على هذا اسم عبارة `if`.
- إذا-ثم-وإلا
- يشبه هذا أسلوب "إذا-ثم"، لكن مع تنفيذ إجراء ثانٍ في حال كان الشرط خاطئًا. في لغة برمجة لا تتضمن الكلمة
thenالمفتاحية "و"، يُطلق على هذا الأسلوب اسم "عبارة إذا-وإلا".
- متداخل
- غالباً ما تكون العبارات الشرطية متداخلة داخل عبارات شرطية أخرى.
- الحساب إذا
- في بدايات لغة فورتران ، كان هناك شرط حسابي (يُعرف أيضًا باسم شرط الشرط الثلاثي) يختبر ما إذا كانت القيمة العددية سالبة أو صفرًا أو موجبة. وقد اعتُبر هذا الشرط قديمًا في فورتران 90، وتم حذفه في فورتران 2018.
- المشغل
- تحتوي بعض اللغات على شكل عامل ، مثل عامل الشرط الثلاثي .
- متى وما لم
- تُكمّل لغة بيرل نمط لغة سي
ifباستخدامwhenوunless.
- رسائل
- يستخدم Smalltalk
ifTrueالرسائلifFalseلتنفيذ الشروط، بدلاً من بنية لغوية.
يوضح كود باسكال التالي عبارة شرطية بسيطة من نوع if-then-else. ويكون بناء الجملة مشابهاً في لغة آدا :
إذا كانت قيمة a أكبر من 0 ، فاكتب ( " نعم " ) وإلا فاكتب ( " لا " ) ؛شركة :
إذا كانت قيمة ( a) أكبر من صفر ، فسيتم طباعة " نعم" . وإلا فسيتم طباعة " لا " .في لغة باش :
إذا كانت قيمة المتغير ` $a` أكبر من صفر ، فاطبع "نعم"، وإلا فاطبع "لا" .في لغة بايثون :
إذا كانت قيمة a أكبر من صفر : اطبع "نعم" ؛ وإلا : اطبع " لا" .في لغة ليسب :
( princ ( if ( plusp a ) "yes" "no" ))فرع متعدد الاتجاهات
تعتمد عملية الانتقال متعددة المسارات على مطابقة القيم. وعادةً ما يُتيح النظام إجراءً افتراضيًا في حال عدم العثور على تطابق. كما تُتيح عبارة switch تحسينات للمُصرّف، مثل استخدام جداول البحث . في اللغات الديناميكية ، قد لا تقتصر الحالات على التعبيرات الثابتة، بل قد تمتد لتشمل مطابقة الأنماط ، كما في مثال سكريبت shell على اليمين، حيث *)تُنفّذ الحالة الافتراضية باستخدام نمط glob يُطابق أي سلسلة نصية. ويمكن أيضًا تنفيذ منطق الحالة في شكل وظيفي، كما في عبارة SQLdecode .
يُظهر كود باسكال التالي عبارة switch بسيطة نسبيًا. يستخدم باسكال الكلمة caseالمفتاحية بدلاً من switch.
case someChar of 'a' : actionOnA ; 'x' : actionOnX ; 'y' , 'z' : actionOnYandZ ; else actionOnNoMatch ; end ;في آدا :
case someChar is when ' a ' => actionOnA ; when ' x ' => actionOnX ; when ' y ' | ' z ' => actionOnYandZ ; when others => actionOnNoMatch ; end ;شركة :
switch ( someChar ) { case 'a' : actionOnA ; break ; case 'x' : actionOnX ; break ; case 'y' : case 'z' : actionOnYandZ ; break ; default : actionOnNoMatch ; }في باش :
case $someChar in a ) actionOnA ;; x ) actionOnX ;; [ yz ]) actionOnYandZ ;; * ) actionOnNoMatch ;; esacفي لغة ليسب :
( حالة بعض الأحرف (( #\a ) إجراء على a ) (( #\x ) إجراء على x ) (( #\y #\z ) إجراء على y و z ) ( وإلا إجراء على عدم وجود تطابق ))في لغة فورتران :
حدد الحالة ( بعض الحرف ) الحالة ( 'a' ) الإجراء على A الحالة ( 'x' ) الإجراء على X الحالة ( 'y' ، 'z' ) الإجراء على Y وZ الحالة الافتراضية الإجراء على عدم التطابق نهاية التحديدحلقة

الحلقة هي سلسلة من التعليمات، تُسمى جسم الحلقة، تُنفذ عددًا من المرات بناءً على حالة وقت التشغيل. يُنفذ الجسم مرة واحدة لكل عنصر من عناصر المجموعة ( تكرار محدد )، أو حتى يتحقق شرط معين ( تكرار غير محدد )، أو بشكل لانهائي . تُسمى الحلقة الموجودة داخل جسم الحلقة حلقة متداخلة . [ 4 ] [ 5 ] [ 6 ] يمكن دعم الخروج المبكر من الحلقة باستخدام عبارة break. [ 7 ] [ 8 ]
في لغة برمجة وظيفية ، مثل Haskell و Scheme ، يتم التعبير عن كل من العمليات المتكررة والتكرارية باستخدام إجراءات تكرارية ذيلية بدلاً من بنيات التكرار التي هي نحوية.
رقمي
تُعدّ حلقة التكرار البسيطة والفعّالة أداةً أساسيةً للتكرار على نطاق من القيم العددية. يبدأ شكلها البسيط بقيمة عددية صحيحة، وينتهي بقيمة عددية صحيحة أكبر، ثم يتكرر على كل قيمة عددية صحيحة بينهما. غالبًا ما يمكن أن تكون الزيادة أي قيمة عددية صحيحة (حتى سالبة، للتكرار من قيمة أكبر إلى قيمة أصغر).
مثال بلغة BASIC:
من أجل I = 1 إلى N xxx التالي Iمثال بلغة باسكال:
for I := 1 to N do begin xxx end ;مثال بلغة فورتران:
كرر من 1 إلى xxx حتى نهاية التكرارفي العديد من لغات البرمجة، لا يُمكن استخدام سوى الأعداد الصحيحة، أو يُمكن استخدامها بشكل موثوق. ونظرًا لأن تمثيل الأعداد العشرية غير دقيق بسبب قيود الأجهزة، فقد تتكرر الحلقة التالية 9 أو 10 مرات، اعتمادًا على عوامل مختلفة مثل خطأ التقريب، ونوع الجهاز، والمترجم. علاوة على ذلك، إذا تمت زيادة قيمة X عن طريق الجمع المتكرر، فقد تؤدي أخطاء التقريب المتراكمة إلى اختلاف قيمة X في كل تكرار اختلافًا كبيرًا عن التسلسل المتوقع عادةً وهو 0.1، 0.2، 0.3، ...، 1.0.
لكل قيمة لـ X := 0.1 خطوة من 0.1 إلى 1.0 نفّذ
يتم التحكم في الظروف
تُكرر بعض حلقات التكرار العملية حتى يتحقق شرطٌ ما. تختبر بعض أنواعها الشرط في بداية الحلقة، بينما تختبره أنواع أخرى في نهايتها. إذا كان الاختبار في البداية، فقد يتم تخطي جسم الحلقة بالكامل. أما في النهاية، فيتم تنفيذ جسم الحلقة مرة واحدة على الأقل.
مثال في لغة فيجوال بيسك:
كرر ما يلي ( اختبار ) xxx حلقةمثال بلغة باسكال:
كرر xxx حتى الاختبار ؛مثال في عائلة C للاختبار المسبق:
بينما ( اختبار ) { xxx }مثال في عائلة C للاختبار اللاحق:
نفّذ xxx بينما ( اختبر )؛على الرغم من استخدام الكلمة forالمفتاحية، فإن حلقة التكرار الثلاثية الأجزاء على نمط لغة C تعتمد على الشروط، وليست على العمليات العددية. يتم تقييم الجزء الثاني، وهو الشرط، قبل كل تكرار، لذا تُعتبر الحلقة اختبارًا مسبقًا. يُستخدم الجزء الأول لتهيئة الحالة، بينما يُستخدم الجزء الثالث لزيادة قيمة العداد للتكرار التالي، ولكن يمكن تنفيذ كلا الجزأين في مكان آخر. يُنفذ كود C التالي منطق حلقة تكرار عددية تُكرر العملية من أجل i من 0 إلى n-1.
for ( int i = 0 ; i < n ; ++ i ) { xxx }تعداد
تقوم بعض بنى الحلقات بتعداد عناصر المجموعة؛ والتكرار لكل عنصر.
مثال في لغة سمول توك:
someCollection do: [ : eachElement | xxx ] .مثال بلغة باسكال:
for Item in Collection do begin xxx end ;مثال في راكو:
foreach ( item ; myCollection ) { xxx } مثال بلغة TCL:
foreach someArray { xxx }مثال بلغة PHP:
foreach ( $someArray as $k => $v ) { xxx }مثال بلغة جافا:
Collection <String> coll ; for ( String s : coll ) { }مثال بلغة C#:
foreach ( string s in myStringCollection ) { xxx }مثال في PowerShell حيث يكون 'foreach' اسمًا بديلًا لـ 'ForEach-Object':
someCollection | foreach { $_ }مثال بلغة فورتران:
forall ( index = first : last : step ... )تحتوي لغة سكالا على تعابير for ، التي تعمم الحلقات التي يتم التحكم فيها بواسطة المجموعات، وتدعم أيضًا استخدامات أخرى، مثل البرمجة غير المتزامنة . أما لغة هاسكل، فتحتوي على تعابير do وفهم العبارات، والتي توفر معًا وظيفة مشابهة لتعابير for في سكالا.
لا نهائي
في برمجة الحاسوب ، تُعرف الحلقة اللانهائية (أو الحلقة التي لا نهاية لها) [ 9 ] [ 10 ] بأنها سلسلة من التعليمات التي، كما هي مكتوبة، ستستمر إلى ما لا نهاية، ما لم يحدث تدخل خارجي، مثل إيقاف تشغيل الطاقة عبر مفتاح أو فصل قابس. وقد يكون ذلك مقصودًا.
لا توجد خوارزمية عامة لتحديد ما إذا كان برنامج الكمبيوتر يحتوي على حلقة لا نهائية أم لا؛ هذه هي مشكلة التوقف .
مشكلة الحلقة والنصف
قد تؤدي هياكل الحلقات الشائعة أحيانًا إلى تكرار التعليمات البرمجية، سواءً أكانت عبارات متكررة أم شروطًا متكررة. وينشأ هذا لأسباب مختلفة، وقد طُرحت حلول عديدة للتخلص من تكرار التعليمات البرمجية أو تقليله إلى أدنى حد. [ 11 ] وبخلاف الحل التقليدي غير المنظم المتمثل في عبارة goto ، [ 12 ] تشمل الحلول المنظمة العامة وضع شرط ( عبارة if ) داخل الحلقة (مما قد يؤدي إلى تكرار الشرط دون تكرار العبارات) أو تغليف المنطق المتكرر في دالة (بحيث يكون هناك استدعاء دالة مكرر، ولكن العبارات لا تتكرر). [ 11 ]
من الحالات الشائعة تنفيذ بداية الحلقة دائمًا، ولكن قد يتم تخطي نهايتها في التكرار الأخير. [ 12 ] أطلق ديكسترا على هذه الحالة اسم "حلقة تُنفذ ' ن ونصف مرة'"، [ 13 ] وتُعرف الآن باسم " مشكلة الحلقة والنصف" . [ 8 ] تشمل الحالات الشائعة قراءة البيانات في الجزء الأول، والتحقق من نهاية البيانات، ثم معالجتها في الجزء الثاني؛ أو المعالجة، والتحقق من النهاية، ثم التحضير للتكرار التالي. [ 12 ] [ 8 ] في هذه الحالات، يتم تنفيذ الجزء الأول من الحلقة .مرات ، لكن الجزء الثاني يتم تنفيذه فقطمرات .
لقد تمّ التعرّف على هذه المشكلة منذ عام 1967 على الأقل من قِبل كنوت، واقترح ويرث حلّها عبر الخروج المبكر من الحلقة. [ 14 ] ومنذ تسعينيات القرن الماضي، أصبح هذا الحلّ هو الأكثر شيوعًا في التدريس، باستخدام عبارة break ، كما في: [ 8 ]
عبارات التكرار إذا كان الشرط شرطًا عبارات الخروج عبارات التكرار
تكمن دقة هذا الحل في أن الشرط فيه معاكس لشرط حلقة while المعتادة : فإعادة كتابة شرط while ... كرر مع خروج في المنتصف تتطلب عكس الشرط: حلقة ... إذا لم يتحقق الشرط خروج ... كرر . يدعم هيكل التحكم " حلقة مع اختبار في المنتصف" صراحةً حالة استخدام "حلقة نصفية"، دون عكس الشرط. [ 14 ]
غير منظم
تُتيح بنية الحلقة معايير إكمال مُهيكلة تُؤدي إما إلى تكرار آخر أو إلى استمرار التنفيذ بعد عبارة الحلقة. مع ذلك، تدعم العديد من لغات البرمجة بنيات تحكم غير مُهيكلة متنوعة.
- التكرار التالي المبكر
- توفر بعض اللغات بنية تنقل التحكم إلى بداية جسم الحلقة للتكرار التالي؛ على سبيل المثال،
continue(الأكثر شيوعًا)،skip، [ 15 ]cycle(Fortran)، أوnext(Perl و Ruby).
- إعادة التكرار
- تحتوي بعض اللغات، مثل Perl [ 16 ] و Ruby [ 17 ]
redo، على عبارة تنتقل إلى بداية الجسم لنفس التكرار.
- إعادة تشغيل
- تحتوي لغة روبي على
retryعبارة تعيد تشغيل الحلقة بأكملها من التكرار الأول. [ 18 ]
خروج مبكر
يُتيح الخروج المبكر نقل التحكم إلى ما بعد جسم الحلقة [ 19 ] [ 8 ]. على سبيل المثال، عند البحث في قائمة، يمكن إيقاف الحلقة عند العثور على العنصر. توفر بعض لغات البرمجة عبارة مثل break`---` (في معظم اللغات)، Exitأو `---` (فيجوال بيسك)، أو `---` last(بيرل).
في كود Ada التالي، تنتهي الحلقة عندما تكون قيمة X تساوي 0.
حلقة Get ( X ); إذا كان X = 0 فاخرج ; نهاية الشرط ; DoSomething ( X ) ; نهاية الحلقة ;يستخدم أسلوب أكثر اصطلاحية ما يلي exit when:
حلقة Get ( X ); الخروج عندما X = 0 ; DoSomething ( X ); نهاية الحلقة ;يدعم بايثون التنفيذ المشروط للتعليمات البرمجية بناءً على ما إذا تم الخروج من الحلقة مبكرًا (باستخدام breakعبارة `else`) أم لا، وذلك باستخدام عبارة `else` داخل الحلقة. في كود بايثون التالي، elseترتبط عبارة `else` بعبارة for`else`، وليس ifبالعبارة الداخلية. تدعم كل من حلقات بايثون ` else` forو` whileelse` هذه العبارة، والتي تُنفذ فقط في حال عدم الخروج المبكر من الحلقة.
for n in set_of_numbers : if isprime ( n ): print ( "المجموعة تحتوي على عدد أولي" ) break else : print ( "المجموعة لا تحتوي على أي أعداد أولية" )استراحات متعددة المستويات
تدعم بعض لغات البرمجة الخروج من الحلقات المتداخلة؛ ويُطلق على هذه العملية نظريًا اسم " الخروج متعدد المستويات" . ومن الأمثلة الشائعة على ذلك البحث في جدول متعدد الأبعاد. يمكن تحقيق ذلك إما عبر الخروج متعدد المستويات (الخروج من N مستوى)، كما هو الحال في لغتي bash [ 20 ] وPHP [ 21 ] ، أو عبر الخروج المُعَلَّم (الخروج ثم المتابعة عند مستوى مُعَلَّم مُحدد)، كما هو الحال في لغات Ada وGo وJava وRust وPerl [ 22 ] . تشمل البدائل للخروج متعدد المستويات الخروج الفردي، مع متغير حالة يتم اختباره للخروج إلى مستوى آخر؛ والاستثناءات التي يتم التقاطها عند المستوى الذي يتم الخروج إليه؛ ووضع الحلقات المتداخلة في دالة واستخدام عبارة return لإنهاء الحلقة المتداخلة بالكامل؛ أو استخدام مُعَلَّم وعبارة goto. لا تدعم لغتا C وC++ حاليًا الخروج متعدد المستويات أو الحلقات المُسماة، والبديل المعتاد هو استخدام عبارة goto لتنفيذ الخروج المُعَلَّم. [ 23 ] مع ذلك، تم اقتراح تضمين هذه الميزة، [ 24 ] وأُضيفت إلى C2Y، [ 25 ] وفقًا لقواعد لغة جافا. لا تحتوي لغة بايثون على أمر break أو continue متعدد المستويات - وقد اقتُرح ذلك في PEP 3136 ، ورُفض على أساس أن التعقيد الإضافي لا يُبرر الاستخدام المشروع النادر. [ 26 ]
يُعدّ مفهوم الفواصل متعددة المستويات ذا أهمية في علوم الحاسوب النظرية ، لأنه يُفضي إلى ما يُعرف اليوم بتسلسل كوساراجو الهرمي . [ 27 ] في عام 1973، قام إس. راو كوساراجو بتطوير نظرية البرمجة المهيكلة ، مُثبتًا إمكانية تجنّب إضافة متغيرات إضافية في البرمجة المهيكلة، طالما سُمح بوجود فواصل متعددة المستويات ذات عمق عشوائي من الحلقات. [ 28 ] علاوة على ذلك، أثبت كوساراجو وجود تسلسل هرمي صارم للبرامج: لكل عدد صحيح n ، يوجد برنامج يحتوي على فاصل متعدد المستويات بعمق n، ولا يُمكن إعادة كتابته كبرنامج يحتوي على فواصل متعددة المستويات بعمق أقل من n دون إضافة متغيرات. [ 27 ]
في كتابه الدراسي الصادر عام ٢٠٠٤، يستخدم ديفيد وات مفهوم تيننت عن المُسلسل لشرح التشابه بين فواصل متعددة المستويات وعبارات الإرجاع. ويشير وات إلى أن فئة من المُسلسلات تُعرف باسم مُسلسلات الهروب ، والتي تُعرَّف بأنها "مُسلسل يُنهي تنفيذ أمر أو إجراء مُحاط بنص"، تشمل كلاً من فواصل الحلقات (بما في ذلك الفواصل متعددة المستويات) وعبارات الإرجاع. ومع ذلك، وكما هو شائع في التطبيقات، قد تحمل مُسلسلات الإرجاع قيمة (إرجاع)، بينما لا تستطيع مُسلسلات الفواصل، كما هو مُطبق في اللغات الحديثة، ذلك عادةً. [ ٢٩ ]
الاختبار الأوسط
اقترح دال الهيكل التالي في عام 1972: [ 30 ]
حلقة حلقة xxx1 read(char); أثناء الاختبار؛ طالما لم تصل إلى نهاية الملف؛ xxx2 write(char); كرر ؛ كرر ؛
يمكن اعتبار هذا التركيب بمثابة حلقة تكرارية (do loop) مع شرط التحقق ( while check) في المنتصف، مما يسمح بمنطق واضح لحلقة تكرارية ونصف . علاوة على ذلك، بحذف بعض المكونات، يمكن لهذا التركيب الواحد أن يحل محل عدة تركيبات في معظم لغات البرمجة. إذا حُذف xxx1 ، نحصل على حلقة تكرارية مع الشرط في الأعلى ( حلقة while تقليدية ). إذا حُذف xxx2 ، نحصل على حلقة تكرارية مع الشرط في الأسفل، وهو ما يعادل حلقة do while في العديد من اللغات. إذا حُذف while ، نحصل على حلقة تكرارية لا نهائية. يسمح هذا التركيب أيضًا بالحفاظ على قطبية الشرط نفسها حتى في المنتصف، على عكس الخروج المبكر (early exit)، الذي يتطلب عكس القطبية (بإضافة not )، [ 14 ] حيث يعمل كحلقة until بدلًا من while .
لا يحظى هذا الهيكل بدعم واسع، حيث تستخدم معظم اللغات بدلاً من ذلك if ... break للخروج المبكر المشروط.
يدعم ذلك بعض اللغات، مثل فورث ، حيث يكون بناء الجملة BEGIN ... WHILE ... REPEAT، [ 31 ] ولغات برمجة سطر الأوامر Bourne shell ( sh) و bash ، حيث يكون بناء الجملة while ... do ... done أو until ... do ... done ، كما يلي: [ 32 ] [ 33 ]
بينما العبارة 1 العبارة 2 ... الشرط نفذ العبارة أ العبارة ب ... تميعمل بناء جملة الصدفة لأن حلقة while (أو until ) تقبل قائمة من الأوامر كشرط، [ 34 ] رسميًا:
أثناء تنفيذ أوامر الاختبار ؛ نفّذ الأوامر اللاحقة ؛ انتهى
قيمة (حالة الخروج) قائمة أوامر الاختبار هي قيمة الأمر الأخير ، ويمكن فصل هذه الأوامر بواسطة أسطر جديدة، مما ينتج عنه الشكل الاصطلاحي أعلاه.
توجد تركيبات مماثلة في لغتي C و C++ باستخدام عامل الفاصلة ، وفي لغات أخرى ذات تركيبات مماثلة ، مما يسمح بإدخال قائمة من التعليمات في شرط while:
بينما ( العبارة_1 ، العبارة_2 ، الشرط ) { العبارة_أ ؛ العبارة_ب ؛ }على الرغم من أن هذا قانوني، إلا أنه هامشي، ويتم استخدامه في المقام الأول، إن وجد، فقط لحالات التعديل ثم الاختبار القصيرة، كما في: [ 35 ]
بينما ( قراءة_السلسلة ( s )، طول_السلسلة ( s ) > 0 ) { // ... }متغيرات وثوابت الحلقة
تُستخدم متغيرات الحلقات وثوابت الحلقات للتعبير عن صحة الحلقات. [ 36 ]
عمليًا، متغير الحلقة هو تعبير عددي صحيح ذو قيمة ابتدائية غير سالبة. يجب أن تتناقص قيمة المتغير مع كل تكرار للحلقة، ولكن لا يجب أن تصبح سالبة أبدًا أثناء التنفيذ الصحيح للحلقة. تُستخدم متغيرات الحلقة لضمان انتهاء الحلقات.
الشرط الثابت للحلقة هو عبارة يجب أن تكون صحيحة قبل أول تكرار للحلقة، وأن تظل صحيحة بعد كل تكرار. وهذا يعني أنه عند انتهاء الحلقة بشكل صحيح، يتحقق كل من شرط الخروج والشرط الثابت للحلقة. تُستخدم الشروط الثابتة للحلقة لمراقبة خصائص محددة للحلقة أثناء التكرارات المتتالية.
تتضمن بعض لغات البرمجة، مثل إيفل، دعمًا أصليًا لأنواع وثوابت الحلقات. وفي حالات أخرى، يكون الدعم إضافةً، كما هو الحال في مواصفات لغة جافا للنمذجة (Java Modeling Language) لعبارات الحلقات في جافا .
لغة فرعية للحلقة
توفر بعض لهجات لغة ليسب لغة فرعية موسعة لوصف الحلقات. ويمكن إيجاد مثال مبكر على ذلك في لغة ليسب التحويلية من إنترليسب . كما توفر لغة ليسب الشائعة [ 37 ] ماكرو للحلقات يُنفذ مثل هذه اللغة الفرعية.
جدول مرجعي لنظام الحلقة
| لغة البرمجة | شرطي | حلقة | خروج مبكر | استمرار الحلقة | إعادة العمل | إعادة المحاولة | مرافق الإصلاح | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| يبدأ | وسط | نهاية | رقمي | مجموعة | عام | لا نهائي [1] | متغير | ثابت | |||||
| آدا | نعم | نعم | نعم | نعم | المصفوفات | لا | نعم | متداخلة بعمق | لا | ||||
| APL | نعم | لا | نعم | نعم | نعم | نعم | نعم | متداخلة بعمق [3] | نعم | لا | لا | ||
| ج | نعم | لا | نعم | رقم [2] | لا | نعم | لا | متداخلة بعمق [3] | متداخلة بعمق [3] | لا | لا | لا | لا |
| لغة سي++ | نعم | لا | نعم | رقم [2] | نعم [9] | نعم | لا | متداخلة بعمق [3] | متداخلة بعمق [3] | لا | لا | لا | لا |
| سي شارب | نعم | لا | نعم | رقم [2] | نعم | نعم | لا | متداخلة بعمق [3] | متداخلة بعمق [3] | لا | لا | لا | لا |
| كوبول | نعم | لا | نعم | نعم | لا | نعم | لا | متداخلة بعمق [15] | متداخلة بعمق [14] | لا | |||
| لغة الشفرة الشائعة | نعم | نعم | نعم | نعم | مدمج فقط [16] | نعم | نعم | متداخلة بعمق | لا | ||||
| د | نعم | لا | نعم | نعم | نعم | نعم | نعم [14] | متداخلة بعمق | متداخلة بعمق | لا | |||
| إيفل | نعم | لا | لا | نعم [10] | نعم | نعم | لا | مستوى واحد [10] | لا | لا | لا [11] | عدد صحيح فقط [13] | نعم |
| فا# | نعم | لا | لا | نعم | نعم | لا | لا | رقم [6] | لا | لا | |||
| فورتران 77 | نعم | لا | لا | نعم | لا | لا | لا | مستوى واحد | نعم | لا | لا | ||
| فورتران 90 | نعم | لا | لا | نعم | لا | لا | نعم | متداخلة بعمق | متداخلة بعمق | لا | لا | ||
| فورتران 95 والإصدارات الأحدث | نعم | لا | لا | نعم | المصفوفات | لا | نعم | متداخلة بعمق | متداخلة بعمق | لا | لا | ||
| يذهب | نعم | لا | لا | نعم | مدمج فقط | نعم | نعم | متداخلة بعمق | متداخلة بعمق | لا | |||
| هاسكل | لا | لا | لا | لا | نعم | لا | نعم | رقم [6] | لا | لا | |||
| جافا | نعم | لا | نعم | رقم [2] | نعم | نعم | لا | متداخلة بعمق | متداخلة بعمق | لا | غير أصلي [12] | غير أصلي [12] | |
| جافا سكريبت | نعم | لا | نعم | رقم [2] | نعم | نعم | لا | متداخلة بعمق | متداخلة بعمق | لا | لا | لا | |
| كوتلين | نعم | لا | نعم | ربما | نعم | لا | لا | متداخلة بعمق | متداخلة بعمق | لا | لا | لا | لا |
| طبيعي | نعم | نعم | نعم | نعم | لا | نعم | نعم | نعم | نعم | نعم | لا | ||
| أوكاميل | نعم | لا | لا | نعم | المصفوفات والقوائم | لا | لا | رقم [6] | لا | لا | |||
| أودين | لا [17] | لا | لا | رقم [5] | مدمج فقط | نعم | لا [17] | متداخلة بعمق | متداخلة بعمق | ||||
| PHP | نعم | لا | نعم | لا [2] [5] | نعم [4] | نعم | لا | متداخلة بعمق | متداخلة بعمق | لا | لا | لا | لا |
| بيرل | نعم | لا | نعم | لا [2] [5] | نعم | نعم | لا | متداخلة بعمق | متداخلة بعمق | نعم | |||
| بايثون | نعم | لا | لا | رقم [5] | نعم | لا | لا | متداخلة بعمق [6] | متداخلة بعمق [6] | لا | لا | لا | لا |
| QB64 | نعم | لا | نعم | نعم | لا | نعم | نعم | مستوى واحد لكل نوع من أنواع الحلقات | مستوى واحد لكل نوع من أنواع الحلقات | لا | لا | لا | لا |
| ريبول | لا [7] | نعم | نعم | نعم | نعم | رقم [8] | نعم | مستوى واحد [6] | لا | لا | |||
| روبي | نعم | لا | نعم | نعم | نعم | لا | نعم | متداخلة بعمق [6] | متداخلة بعمق [6] | نعم | نعم | ||
| الصدأ | نعم | لا | لا | رقم [5] | نعم | لا | نعم | متداخلة بعمق | متداخلة بعمق | لا | لا | لا | لا |
| لغة الآلة القياسية | نعم | لا | لا | لا | المصفوفات والقوائم | لا | لا | رقم [6] | لا | لا | |||
| سويفت | نعم | لا | نعم | لا | نعم | نعم | لا | متداخلة بعمق | متداخلة بعمق | لا | لا | لا | لا |
| فيجوال بيسك دوت نت | نعم | لا | نعم | نعم | نعم | لا | نعم | مستوى واحد لكل نوع من أنواع الحلقات | مستوى واحد لكل نوع من أنواع الحلقات | لا | لا | لا | لا |
| باور شيل | نعم | لا | نعم | رقم [2] | نعم | نعم | لا | نعم | نعم | لا | لا | لا | لا |
| زيج | نعم | لا | لا | نعم | مدمج فقط | لا | لا | متداخلة بعمق | متداخلة بعمق | لا | لا | لا | لا |
- لا يُعتبر a حلقة لا نهائية لهذا الغرض، لأنه ليس بنية لغوية مخصصة.
while (true) - a b c d e f g h حلقة Cهي بنية حلقة عامة، وليست حلقة عد على وجه التحديد، على الرغم من أنها تستخدم غالبًا لهذا الغرض.
for (init; test; increment) - يمكن تحقيق عمليات التوقف العميق في لغات APL و C و C++ و C# من خلال استخدام التسميات و goto.
- تمت إضافة خاصية التكرار على الكائناتفي PHP 5.
- يمكن محاكاة حلقة العد عن طريق التكرار على قائمة متزايدة أو مولد، على سبيل المثال ، بايثون .
range() - يمكن تحقيق الانقطاعات العميقة من خلال استخدام معالجة الاستثناءات.
- لا يوجد تركيب خاص، حيث
whileيمكن استخدام الدالة لهذا الغرض. - لا يوجد تركيب خاص، ولكن يمكن للمستخدمين تعريف وظائف التكرار العامة.
- قدّم معيار C ++11خاصية التكرار على النطاق. فيمكتبة STL، توجد
std::for_eachقالبيةيمكنها التكرار علىحاوياتواستدعاءدالة أحاديةلكل عنصر. [ 38 ] يمكن أيضًا إنشاء هذه الوظيفةكوحدة ماكروعلى هذه الحاويات. [ 39 ] - يتم تنفيذ التكرار العددي عن طريق التكرار عبر فاصل زمني صحيح؛ والخروج المبكر عن طريق تضمين شرط إضافي للخروج.
- يدعم Eiffel كلمة محجوزة
retry، ومع ذلك يتم استخدامها فيمعالجة الاستثناءات، وليس في التحكم في الحلقات. - يتطلب لغة نمذجة جافاوهيلغة مواصفات واجهة سلوكية.
- يتطلب أن تكون متغيرات الحلقة أعدادًا صحيحة؛ المتغيرات المتسامية غير مدعومة.إيفل: لماذا تكون متغيرات الحلقة أعدادًا صحيحة؟
- يدعم D المجموعات غير المحدودة، والقدرة على التكرار عبر تلك المجموعات. وهذا لا يتطلب أي بنية خاصة.
- يمكن تحقيق فترات راحة عميقة باستخدام الإجراءات
GO TO. - لغة Common Lisp تسبق مفهوم نوع المجموعة العامة.
- يدعم برنامج Odin 's generalloop اختصارات بناء الجملة للحلقة الشرطية والحلقة اللانهائية.
for
غير محلي
تُتيح العديد من لغات البرمجة، ولا سيما تلك التي تُفضّل أساليب البرمجة الديناميكية، بنياتٍ للتحكم غير المحلي في تدفق البرنامج، مما يسمح بتنفيذ البرنامج من نقطة التنفيذ الحالية إلى نقطة مُحددة مسبقًا . وفيما يلي أمثلة بارزة.
معالجة الحالة
دعمت مُجمّعات لغة فورتران الأولى عباراتٍ لمعالجة الحالات الاستثنائية IF ACCUMULATOR OVERFLOW، بما في ذلك IF QUOTIENT OVERFLOWو و IF DIVIDE CHECK. ولضمان استقلالية اللغة عن الأجهزة، لم تُضمّن هذه العبارات في فورتران 4 ومعيار فورتران 66. مع ذلك، منذ إصدار فورتران 2003، أصبح من الممكن اختبار المشكلات العددية عبر استدعاء الدوال في IEEE_EXCEPTIONSالوحدة النمطية.
يحتوي PL/I على حوالي 22 شرطًا قياسيًا (مثل ZERODIVIDE SUBSCRIPTRANGE ENDFILE) والتي يمكن إثارتها والتي يمكن اعتراضها بواسطة: إجراء الشرط ON ؛ يمكن للمبرمجين أيضًا تعريف واستخدام شروطهم المسماة الخاصة.
مثل عبارة if غير المنظمة ، لا يمكن تحديد سوى عبارة واحدة، لذلك في كثير من الحالات تكون هناك حاجة إلى عبارة GOTO لتحديد مكان استئناف تدفق التحكم.
لسوء الحظ، كانت بعض التطبيقات تتطلب تكلفة إضافية كبيرة من حيث المساحة والوقت (خاصة SUBSCRIPTRANGE)، لذلك حاول العديد من المبرمجين تجنب استخدام الشروط.
مثال نموذجي على بناء الجملة:
في حالة الشرط ، انتقل إلى الملصق
معالجة الاستثناءات
تدعم العديد من لغات البرمجة الحديثة معالجة الاستثناءات بشكلٍ أصيل . يبدأ تدفق التحكم في الاستثناءات عادةً بظهور كائن استثناء (يُسمى أيضًا رفع استثناء). ثم ينتقل التحكم إلى معالج الاستثناء الداخلي في مكدس الاستدعاءات . إذا نجح المعالج في معالجة الاستثناء، يعود تدفق التحكم إلى وضعه الطبيعي. وإلا، ينتقل التحكم إلى المعالجات الخارجية حتى ينجح أحدها في معالجة الاستثناء أو يصل البرنامج إلى النطاق الخارجي ويخرج. ومع انتقال التحكم تدريجيًا إلى المعالجات الخارجية، تتم معالجة العمليات التي تحدث عادةً، مثل إزالة الاستثناءات من مكدس الاستدعاءات، تلقائيًا.
يوضح كود C++ التالي كيفية التعامل مع الاستثناءات المنظمة. إذا نشأ استثناء أثناء تنفيذ الأمر ` doSomething()catch` وكان نوع كائن الاستثناء مطابقًا لأحد الأنواع المحددة في عبارة `catch`، فسيتم تنفيذ تلك العبارة. على سبيل المثال، إذا SomeExceptionنشأ استثناء من النوع doSomething()`SomeException`، فسينتقل التحكم من السطر 2 إلى 4، وستُطبع الرسالة "Caught SomeException"، ثم ينتقل التحكم إلى tryالسطر 8 بعد عبارة `catch`. إذا نشأ استثناء من أي نوع آخر، فسينتقل التحكم من السطر 2 إلى 6. في حال عدم وجود استثناء، سينتقل التحكم من السطر 2 إلى 8.
يحاول {doSomething ();} catch ( const SomeException & e )std :: println ( " تم رصد استثناء ما: {}" , e.what ( ));} يمسك (...) {std :: println ( "خطأ غير معروف" );}doNextThing ();تستخدم العديد من لغات البرمجة كلمات C++ الرئيسية (مثل throw` include` tryو`include` و` catchinclude`)، بينما تستخدم لغات أخرى كلمات رئيسية مختلفة. على سبيل المثال، تستخدم لغة Ada exceptionالكلمات الرئيسية `include` لتقديم معالج استثناءات، و`include` whenبدلاً من `include` catch. أما لغة AppleScript فتستخدم عناصر نائبة في بناء الجملة لاستخراج معلومات حول الاستثناء، كما هو موضح في كود AppleScript التالي.
حاول تعيين قيمة myNumber إلى myNumber / 0 عند حدوث خطأ e، الرقم n من f إلى t، نتيجة جزئية pr، إذا كانت ( e = "لا يمكن القسمة على صفر" ) ، فاعرض مربع حوار "يجب عدم القيام بذلك" . نهاية المحاولةفي العديد من لغات البرمجة (بما في ذلك Object Pascal وD وJava وC# وPython)، يتم تنفيذ finallyشرط في نهاية tryجملة try عند انتهاء جملة try، سواءً حدث استثناء tryأم لا. يضمن كود C# التالي streamإغلاق التدفق.
FileStream stream = null ; try { stream = new FileStream ( "logfile.txt" , FileMode.Create ); return ProcessStuff ( stream ) ; } finally { if ( stream ! = null ) { stream.Close ( ) ; } }نظرًا لشيوع هذا النمط، توفر لغة C# usingعبارةً لضمان التنظيف. في الكود التالي، حتى لو تسبب ProcessStuff() في حدوث استثناء، يتم تحرير الكائن. تُستخدم عبارة streamPython withووسيط الكتلة في Ruby لتحقيق تأثير مماثل.File.open
باستخدام ( FileStream stream = new ( "logfile.txt" , FileMode.Create ) ) { return ProcessStuff ( stream ) ; }استمرار
في علم الحاسوب ، يُعدّ الاستمرار تمثيلاً مجرداً لحالة التحكم في برنامج حاسوبي . يُجسّد الاستمرار حالة التحكم في البرنامج، أي أنه بنية بيانات تُمثّل العملية الحسابية عند نقطة معينة في تنفيذها. يمكن للغة البرمجة الوصول إلى بنية البيانات هذه، بدلاً من أن تكون مخفية في بيئة التشغيل . تُفيد الاستمرارات في ترميز آليات تحكم أخرى في لغات البرمجة، مثل الاستثناءات ، والمولدات ، والروتينات الفرعية ، وما إلى ذلك.
يُقصد بـ"الاستمرار الحالي" أو "استمرار خطوة الحساب" الاستمرار الذي، من منظور تنفيذ الكود، يُشتق من النقطة الحالية في تنفيذ البرنامج. ويمكن استخدام مصطلح " الاستمرار" أيضًا للإشارة إلى الاستمرار من الدرجة الأولى، وهي بنيات تُمكّن لغة البرمجة من حفظ حالة التنفيذ عند أي نقطة والعودة إليها لاحقًا في البرنامج، وربما عدة مرات.
مولد
في علوم الحاسوب ، المولد هو روتين يُستخدم للتحكم في سلوك التكرار في حلقة تكرارية . جميع المولدات هي أيضًا مُكرِّرات . [ 40 ] يشبه المولد إلى حد كبير الدالة التي تُرجع مصفوفة ، حيث يحتوي على مُعاملات ، ويمكن استدعاؤه، ويُنشئ سلسلة من القيم. مع ذلك، بدلًا من إنشاء مصفوفة تحتوي على جميع القيم وإعادتها دفعة واحدة، يُنتج المولد القيم واحدة تلو الأخرى، مما يتطلب ذاكرة أقل ويسمح للمستدعي بالبدء في معالجة القيم القليلة الأولى فورًا. باختصار، يبدو المولد كدالة ولكنه يتصرف كمُكرِّر .
يمكن تنفيذ المولدات باستخدام بنيات تحكم أكثر تعبيرًا، مثل الروتينات الفرعية أو الاستمراريات من الدرجة الأولى . [ 41 ] تُعد المولدات، المعروفة أيضًا باسم الروتينات الفرعية الجزئية، [ 42 ] حالة خاصة من الروتينات الفرعية (وأضعف منها)، حيث إنها تُعيد التحكم دائمًا إلى المُستدعي (عند تمرير قيمة)، بدلاً من تحديد روتين فرعي للانتقال إليه؛ انظر مقارنة الروتينات الفرعية بالمولدات .
روتين فرعي
الروتينات الفرعية هي مكونات برمجية يمكن إيقافها واستئنافها - وهي عبارة عن روتينات فرعية عامة - لتنفيذ مهام متعددة تعاونية . وتُعدّ الروتينات الفرعية مناسبة تمامًا لتنفيذ مكونات برمجية مألوفة مثل المهام التعاونية ، والاستثناءات ، وحلقات الأحداث ، والمكررات ، والقوائم اللانهائية ، والأنابيب .
وقد وُصفت بأنها "وظائف يمكنك إيقاف تنفيذها مؤقتًا". [ 43 ]
صاغ ميلفين كونواي مصطلح "الروتين الفرعي" في عام 1958 عندما طبقه على بناء برنامج تجميع . [ 44 ] ظهر أول شرح منشور للروتين الفرعي لاحقًا، في عام 1963. [ 45 ]
قادم من
في برمجة الحاسوب ، تُستخدم عبارة COMEFROM للتحكم في تدفق البرنامج، حيث تُنقل التعليمات البرمجية إلى العبارة التالية عند وصولها إلى النقطة المحددة بواسطة وسيط COMEFROM. تُعتبر هذه العبارة، على سبيل المزاح، عكس عبارة goto ، وتُستخدم عادةً لأغراض فكاهية أكثر من كونها مصطلحًا علميًا جادًا . غالبًا ما تُحدد نقطة الانتقال باستخدام مُعرّف . على سبيل المثال، يُشير COMEFROM إلى أنه عند وصول التعليمات البرمجية إلى المُعرّف ، فإن التحكم يستمر من العبارة التي تلي COMEFROM.COMEFROM xx
يتمثل أحد الفروق الرئيسية بين الأمر goto والأمر COMEFROM في أن goto يعتمد على البنية المحلية للبرنامج، بينما يعتمد COMEFROM على البنية العامة. ينقل الأمر goto التحكم عند وصوله إلى تلك النقطة، بينما يتطلب COMEFROM من المعالج (أي المفسر) البحث عن أوامر COMEFROM، بحيث يتمكن المعالج من الانتقال إلى تلك النقطة عند وصول التحكم إليها. يصعب فهم المنطق الناتج، إذ لا يوجد ما يشير قرب نقطة الانتقال إلى أن التحكم سينتقل بالفعل. لذا، يجب دراسة البرنامج بأكمله لمعرفة ما إذا كانت أي من أوامر COMEFROM تشير إلى تلك النقطة.
تختلف دلالات عبارة COMEFROM باختلاف لغات البرمجة . ففي بعض اللغات، يحدث الانتقال قبل تنفيذ العبارة عند النقطة المحددة، بينما يحدث في لغات أخرى بعد ذلك. وبحسب اللغة، قد تكون عبارات COMEFROM المتعددة التي تشير إلى النقطة نفسها غير صالحة، أو غير حتمية، أو تُنفذ بترتيب معين، أو تُؤدي إلى معالجة متوازية أو متزامنة، كما هو الحال في Threaded Intercal .
ظهرت عبارة COMEFROM لأول مرة في قوائم تعليمات لغة التجميع الفكاهية (تحت اسم 'CMFRM'). وقد تم شرحها بالتفصيل في مقال نُشر في مجلة Datamation بقلم ر. لورانس كلارك عام 1973، [ 46 ] ردًا على رسالة إدسكار ديكسترا بعنوان "عبارة Go To تُعتبر ضارة " . تم تطبيق COMEFROM لاحقًا في لغة البرمجة INTERCAL، وهي نسخة C-INTERCAL من لغة البرمجة المتخصصة INTERCAL، إلى جانب عبارة 'computed COMEFROM' الأكثر غموضًا. كما وُجدت مقترحات بلغة فورتران [ 47 ] لعبارة 'assigned COME FROM' وعبارة 'DONT' (لتكملة حلقة 'DO' الموجودة).
الخروج المبكر من حلقة متداخلة بناءً على حدث
تم اقتراح نموذج زان في عام 1974، [ 48 ] ونوقش في كتاب كنوت (1974) . ويتم تقديم نسخة معدلة منه هنا.
الخروج عند وقوع الحدث أ أو الحدث ب أو الحدث ج؛ xxx مخارج الحدث أ: الإجراء أ الحدث ب: الإجراء ب الحدث ج: الإجراء ج endexit ;
يُستخدم الأمر exitwhen لتحديد الأحداث التي قد تحدث ضمن xxx ، ويُشار إلى حدوثها باستخدام اسم الحدث كعبارة. عند وقوع حدث ما، يُنفَّذ الإجراء المناسب، ثم ينتقل التحكم مباشرةً بعد endexit . يوفر هذا التركيب فصلًا واضحًا بين تحديد انطباق حالة معينة، والإجراء المطلوب اتخاذه لتلك الحالة.
يُعدّ exitwhen مشابهًا من الناحية المفاهيمية لمعالجة الاستثناءات ، ويتم استخدام الاستثناءات أو البنى المشابهة لهذا الغرض في العديد من اللغات.
يتضمن المثال البسيط التالي البحث في جدول ثنائي الأبعاد عن عنصر معين.
الخروج عند العثور على العنصر أو عدم العثور عليه؛ من أجل I := 1 إلى N ، من أجل J := 1 إلى M ، إذا كان الجدول[I,J] = الهدف، فهذا يعني أنه تم العثور عليه؛ مفتقد؛ مخارج تم العثور على: طباعة ("العنصر موجود في الجدول"); مفقود: اطبع ("العنصر غير موجود في الجدول"); endexit ;انظر أيضاً
- تحليل تدفق التحكم – تقنية المترجم
- مخطط تدفق التحكم – أداة نمذجة العمليات التجارية
- مخطط تدفق التحكم – تمثيل بياني لبرنامج حاسوبي أو خوارزمية
- جدول التحكم – جدول بيانات يُستخدم للتحكم في تدفق البرنامج
- التعقيد الحلقي – مقياس للتعقيد الهيكلي لبرنامج حاسوبي
- دراكون – أداة رسم خرائط الخوارزميات
- مخطط انسيابي – رسم بياني يمثل سير العمل أو العملية
- كود السباغيتي – كود مصدر برمجي ذو بنية رديئة
مراجع
- ↑ باير، ماتياس ؛ كوزنيتسوف، فولوديمير. "حول الاختلافات بين خصائص مؤشر أسعار المستهلك (CFI) ومؤشر أسعار المستهلك (CPS) ومؤشر أسعار المستهلك (CPI)" . nebelwelt.net . تاريخ الاسترجاع: 1 يونيو 2016 .
- ↑ "اكتشاف ثغرة في برنامج أدوبي فلاش يؤدي إلى طريقة جديدة للتخفيف من حدة الهجوم" . دارك ريدينج . 10 نوفمبر 2015. تاريخ الاسترجاع: 1 يونيو 2016 .
- ↑ إند جيم. "إند جيم ستقدم عرضًا في مؤتمر بلاك هات الولايات المتحدة الأمريكية 2016" . www.prnewswire.com (بيان صحفي) . تاريخ الاطلاع: 1 يونيو 2016 .
- ↑ "الحلقات المتداخلة في لغة C مع أمثلة" . GeeksforGeeks . 25-11-2019 . تم الاطلاع عليه بتاريخ 14-03-2024 .
- ↑ "حلقات بايثون المتداخلة" . www.w3schools.com . تم الاطلاع عليه بتاريخ 14-03-2024 .
- ↑ دين، جينا (22 نوفمبر 2019). "الحلقات المتداخلة" . مجلة الشركات الناشئة . تم الاطلاع عليه بتاريخ 14 مارس 2024 .
- ↑ كنوت، دونالد إي. (1974). "البرمجة المهيكلة باستخدام العبارات". دراسات الحوسبة . 6 (4): 261-301 . CiteSeerX 10.1.1.103.6084 . doi : 10.1145/356635.356640 . S2CID 207630080 .
go to - 1 2 3 4 5 روبرتس، إي. [1995] " مخارج الحلقات والبرمجة الهيكلية: إعادة فتح النقاش مؤرشف في 2014-07-25 على Wayback Machine "، نشرة ACM SIGCSE، (27)1: 268-272.
- ↑ "تعريف قاموس الحلقة اللانهائية" . مؤرشف من الأصل بتاريخ 2020-08-01 . تم الاطلاع عليه بتاريخ 2020-01-22 .
- ↑ "ما هي الحلقة اللانهائية (الحلقة التي لا نهاية لها)؟" . مؤرشف من الأصل بتاريخ 15 يوليو 2019. تم الاطلاع عليه بتاريخ 22 يناير 2020 .
- 1 2 "شروط الحلقة الفوضوية" . ويكي ويكي ويب . 2014-11-03.
- 1 2 3 كنوت 1974 ، ص 278، التكرارات البسيطة.
- ↑ إدسكار دبليو. ديجكسترا ، مراسلة شخصية إلى دونالد كنوث في 3 يناير 1974، ورد ذكرها في كنوث (1974 ، ص 278، التكرارات البسيطة)
- 1 2 3 كنوت 1974 ، ص 279.
- ↑ "ما هي الحلقة وكيف يمكننا استخدامها؟" . مؤرشف من الأصل بتاريخ 28-07-2020 . تم الاطلاع عليه بتاريخ 25-05-2020 .
- ↑ "redo - perldoc.perl.org" . perldoc.perl.org . تم الاطلاع عليه بتاريخ 25-09-2020 .
- ↑ "control_expressions - Documentation for Ruby 2.4.0" . docs.ruby-lang.org . تم الاطلاع عليه بتاريخ 25-09-2020 .
- ↑ "control_expressions - Documentation for Ruby 2.3.0" . docs.ruby-lang.org . تاريخ الاسترجاع: 25-09-2020 .
- ↑ هي طريقة شائعة لحلمشكلة الحلقة والنصف .
- ↑ دليل برمجة باش المتقدمة: 11.3. التحكم في الحلقات
- ↑ دليل PHP: " break "
- ↑ perldoc: last
- ↑ قائمة الأسئلة الشائعة حول لغة البرمجة C · " السؤال 20.20ب "
- ↑ "named-loops" . open-std.org . 18 سبتمبر 2024.
- ↑ "تكنولوجيا المعلومات - لغات البرمجة - لغة C" (ملف PDF) . open-std.org . 4 مايو 2025.
- ↑ [Python-3000] إعلان PEP 3136 ، غيدو فان روسوم
- 1 2 كوزين، ديكستر (2008). "نظرية بوم-جاكوبيني خاطئة، من الناحية المنطقية". رياضيات بناء البرامج (ملف PDF) . سلسلة محاضرات في علوم الحاسوب. المجلد 5133. الصفحات 177-192 . CiteSeerX 10.1.1.218.9241 . doi : 10.1007/978-3-540-70594-9_11 . ISBN 978-3-540-70593-2.
- ↑ كوساراجو، إس. راو. "تحليل البرامج المهيكلة"، وقائع المؤتمر السنوي الخامس لجمعية آلات الحوسبة. نظرية الحوسبة، (مايو 1973)، 240-252؛ وأيضًا في مجلة علوم الحاسوب والنظم، 9، 3 (ديسمبر 1974)، نقلاً عن كنوت (1974) .
- ↑ ديفيد أنتوني وات؛ ويليام فيندلاي (2004). مفاهيم تصميم لغات البرمجة . جون وايلي وأولاده. الصفحات 215-221 . ISBN 978-0-470-85320-7.
- ↑ دال وديجكسترا وهور، "البرمجة الهيكلية"، دار النشر الأكاديمية، 1972.
- ↑ "6. ارمها في حلقة" .
- ↑ "3.2.5.1 بنى التكرار" ، دليل مرجع GNU Bash ، 18-05-2025
- ↑ "كيف يمكن للغة أن تجعل حلقة التكرار ونصف الحلقة أقل عرضة للأخطاء؟" . Stack Exchange: تصميم وتنفيذ لغات البرمجة .
- ↑ "3.2.4 قوائم الأوامر" ، دليل مرجع GNU Bash ، 18-05-2025
- ↑ "ماذا يفعل عامل الفاصلة،؟" . Stack Overflow .
- ↑ ماير، برتراند (1991). إيفل: اللغة . برنتيس هول. ص 129-131 .
- ↑ "Common Lisp LOOP macro" .
- ↑ for_each . Sgi.com. تم الاطلاع عليه بتاريخ 2010-11-09.
- ↑ الفصل 1. Boost.Foreach مؤرشف بتاريخ 29 يناير 2010 في أرشيف الإنترنت . Boost-sandbox.sourceforge.net (19 ديسمبر 2009). تم الاطلاع عليه بتاريخ 9 نوفمبر 2010.
- ↑ ما الفرق بين المُكرِّر والمُوَلِّد؟
- ↑ كيسليوف، أوليغ (يناير 2004). "طرق عامة لاجتياز المجموعات في لغة Scheme" .
- ↑ أنتوني رالستون (2000). موسوعة علوم الحاسوب . مجموعة نيتشر للنشر. ISBN 978-1-56159-248-7تم الاطلاع عليه بتاريخ 11 مايو 2013 .
- ↑ "كيف يعمل async/await في بايثون 3.5؟" . كاتب كندي طويل القامة وساخر . 11 فبراير 2016. مؤرشف من الأصل في 10 يناير 2023. تم الاطلاع عليه في 10 يناير 2023 .
- ↑ كنوت، دونالد إرفين (1997). الخوارزميات الأساسية (ملف PDF) . فن برمجة الحاسوب. المجلد 1 ( الطبعة الثالثة). أديسون-ويسلي. القسم 1.4.5: التاريخ والمراجع، ص 229. ISBN 978-0-201-89683-1تمت أرشفة الملف (PDF) من النسخة الأصلية بتاريخ 21-10-2019.
- ↑ كونواي، ميلفين إي. (يوليو 1963). "تصميم مُجمِّع مخطط انتقالي قابل للفصل" ( ملف PDF) . اتصالات ACM . 6 (7). ACM: 396-408 . doi : 10.1145/366663.366704 . ISSN 0001-0782 . S2CID 10559786. مؤرشف (PDF) من الأصل بتاريخ 2022-04-06 . تم الاسترجاع بتاريخ 2019-10-21 – عبر مكتبة ACM الرقمية.
- ↑ كلارك، لورانس ، "لا نعرف إلى أين نذهب إن لم نعرف من أين أتينا. هذا الابتكار اللغوي يرقى إلى مستوى كل التوقعات." ، داتاماشن (مقال)، مؤرشف من الأصل بتاريخ 16 يوليو 2018 ، تم الاطلاع عليه بتاريخ 24 سبتمبر 2004.
- ↑ موديل، هوارد؛ سلاتر، ويليام (أبريل 1978). "البرمجة المهيكلة تُعتبر ضارة" . إشعارات ACM SIGPLAN . 13 (4): 76-79 . doi : 10.1145/953411.953418 . تاريخ الاسترجاع: 18 يوليو 2014 .
- ↑ Zahn, CT "A control statement for natural top-down structured programming" provided at Symposium on Programming Languages, Paris, 1974.
روابط خارجية
الوسائط المتعلقة بتدفق التحكم على ويكيميديا كومنز- انتقل إلى البيان الذي يعتبر ضارًا
- مساهمة لغوية من البرمجة بدون استخدام عبارة GOTO
- "البرمجة الهيكلية باستخدام عبارات Go To" (ملف PDF) . مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 24-08-2009. (2.88 ميجابايت)
- "دليل IBM 704" (ملف PDF) . (31.4 ميجابايت)
- تدفق التحكم
- التكرار في البرمجة
- مقارنات لغات البرمجة
- التكرار
