انتقل إلى

مفتاح " GOTO " على جهاز الكمبيوتر المنزلي ZX Spectrum لعام 1982 ، تم تنفيذه باستخدام لغة BASIC الأصلية (إدخال الأوامر بمفتاح واحد).

في برمجة الحاسوب ، تُستخدم عبارة goto للتحكم في تدفق البرنامج ، حيث تنقل التحكم إلى سطر آخر من التعليمات البرمجية . على عكس استدعاء الدالة الذي يسمح بالعودة إلى نقطة الاستدعاء، فإن goto لا يسمح بذلك. تختلف طريقة كتابة هذه العبارة باختلاف لغات البرمجة ؛ فبعضها يستخدم الأحرف الصغيرة ( )، وبعضها يستخدم الأحرف الكبيرة ( )، بينما لا تُميّز لغات أخرى بين الأحرف الكبيرة والصغيرة. في بعض اللغات، تُكتب العبارة بكلمتين (مثلاً: ).gotoGOTOGO TO

تُستخدم عبارة goto في لغات البرمجة بشكل أساسي لتوفير الوصول إلى تعليمات القفز في كود الآلة (المعروفة أيضًا بالتفرع أو النقل)، ولكن نظرًا للمشاكل المحتملة المرتبطة باستخدام دلالات القفز، فقد تم تطوير اللغات بمرور الوقت بآليات أخرى للتحكم في تدفق البيانات بهدف الاستغناء عن عبارة goto. لا تتضمن العديد من اللغات الحديثة عبارة goto على الإطلاق. أما اللغات التي تتضمنها، فتقيّد استخدامها للحد من المشاكل التي قد تنجم عنها. علاوة على ذلك، ولأن استخدامها يُعتبر عمومًا خيارًا غير مُستحب، يميل مطورو البرامج إلى تجنبه حتى عند استخدام لغة تدعمه.

بشكل عام، يُعتبر استخدام عبارة goto خيارًا غير مُجدٍ، إذ يُؤدي إلى كتابة شفرة برمجية ذات عبء معرفي أكبر وأخطاء أكثر من الشفرة التي تستخدم آليات تحكم أكثر تنظيمًا في تدفق البرنامج. كان استخدام goto شائعًا في بدايات الحوسبة، ولكن بفضل الجهود الحثيثة لحركة البرمجة الهيكلية في الستينيات والسبعينيات، والتي سعت إلى استبدال goto بآليات تحكم أكثر تنظيمًا في تدفق البرنامج، انخفض استخدامه بشكل ملحوظ. مع ذلك، لا تزال عبارة goto تُستخدم حتى اليوم، ولكن استخدامها يقتصر عمومًا على حالات مُحددة .

أثبتت نظرية البرنامج المهيكل أن عبارة goto ليست ضرورية لكتابة برامج يمكن التعبير عنها بمخططات انسيابية ؛ فمزيج من بنى البرمجة الثلاث: التسلسل، والاختيار، والتكرار، يكفي لأي عملية حسابية يمكن إجراؤها بواسطة آلة تورينج ، مع التنبيه إلى أنه قد يلزم تكرار الكود وإضافة متغيرات. [ 1 ]

الدعم اللغوي

يختلف دعم الأمر goto باختلاف لغات البرمجة. فاللغات القديمة عادةً ما توفر دعمًا غير مقيد، بينما تميل اللغات الحديثة إلى توفير دعم مقيد أو عدم توفير أي دعم على الإطلاق. على سبيل المثال، لا تسمح لغة C بالانتقال إلى تسمية داخل دالة أخرى. [ 2 ] [ 3 ]

تدعم كل من لغة C# و Visual Basic .NET الأمر goto. [ 4 ] [ 5 ] ومع ذلك، لا تسمحان بالانتقال إلى عنصر خارج النطاق الحاوي، وتحترمان التخلص من الكائنات finallyوبنيتها، مما يجعلها أقل قوة وأقل خطورة من goto في لغات أخرى. كما أنهما تُنشئان الكلمات المفتاحية case`t` و` defaultt` كعناصر، ونطاقها هو عبارة `switch` المُحيطة . goto caseأو goto defaultيُستخدم `t` كبديل عن الانتقال الضمني ، وهو أمر غير مسموح به.

تفتقر العديد من لغات البرمجة إلى دلالات الانتقال (goto). ففي جافا ، توجد كلمة محجوزةgoto ، لكنها غير قابلة للاستخدام، على الرغم من أن .classالملفات المُجمَّعة تُولِّد عبارات الانتقال والتسمية. [ 6 ] ولا تدعم بايثون الانتقال، على الرغم من وجود العديد من الوحدات البرمجية التي تُوفِّره. [ 7 ] [ 8 ] ولم تدعم PHP الانتقال حتى الإصدار 5.3. [ 9 ]

يحتوي PL/I على عبارة goto التي تقوم بفك المكدس لنقل البيانات خارج الكتلة ولا تسمح بنقل البيانات إلى كتلة.

تستخدم معظم اللغات التي تحتوي على عبارة ذات دلالة goto الكلمة المفتاحية goto ، ولكن تُستخدم صيغ أخرى، خاصةً في اللغات القديمة. على سبيل المثال، تستخدم لغة MADTRANSFER TO , [ 10 بينما تستخدم لغة APL سهمًا يشير إلى اليمين، .

لا تحتوي لغات البرمجة الوظيفية مثل Scheme عمومًا على أمر goto، بل تستخدم الاستمراريات.

تم حسابها وتخصيصها

في لغة فورتران ، ينتقل أمر goto المحسوب إلى أحد العناوين المتعددة في قائمة، بناءً على قيمة تعبير معين. مثال على ذلك هو [ 11 ]goto (20,30,40) i . البنية المكافئة في لغة C هي عبارة switch ، وفي فورتران الأحدث، تُعد هذه البنية البديل النحوي الموصى به. [ 12 ] كانت لغة BASIC تحتوي على عبارة تحقق نفس الهدف، ولكن في Visual Basic لم تعد هذه البنية مدعومة. [ 13 ]SELECT CASE'On GoTo'

في الإصدارات السابقة لفورتران 95، كان لدى فورتران أيضًا متغير goto مُعيّن ينقل التحكم إلى مُعرّف سطر (رقم سطر) مُخزّن في متغير عددي. لسوء الحظ، كان من الممكن الانتقال إلى متغير عددي لم يتم تعيين قيمة له، وكان هذا مصدرًا رئيسيًا للأخطاء المتعلقة بعبارات goto المُعيّنة. [ 14 ] تسمح عبارة فورتران assignفقط بتعيين رقم سطر ثابت (موجود) للمتغير العددي. مع ذلك، سمحت بعض المُترجمات بالتعامل مع هذا المتغير عن طريق الخطأ كعدد صحيح لاحقًا، على سبيل المثال، زيادته، مما أدى إلى سلوك غير مُحدد عند استخدام goto. يُوضح الكود التالي سلوك المتغير goto iعندما يكون رقم السطر i غير مُحدد:

قم بتعيين القيمة 200 للمتغير i ، ثم قم بزيادة قيمة i بمقدار ثم انتقل إلى المتغير i ! سلوك غير محدد 200 اكتب ( * , * ) "هذا رقم سطر صالح"

تُطبّق العديد من مُجمّعات لغة C امتدادين غير قياسيين للغة C/C++ يتعلقان بعبارات goto، وقد طُرحا في الأصل بواسطة gcc . [ 15 ] يسمح امتداد GNU بالحصول على عنوان مُعرّف داخل الدالة الحالية باستخدام مُعامل قيمة المُعرّفvoid* الأحادي ذي البادئة . كما تم توسيع تعليمة goto للسماح بالقفز إلى أي تعبير. يُشار إلى هذا الامتداد في لغة C باسم goto المحسوب في وثائق مُجمّعات C التي تدعمه؛ وتُعدّ دلالاته مجموعةً فرعيةً من goto المُعيّن في لغة Fortran، لأنه يسمح بتعبيرات مؤشر عشوائية كهدف goto، بينما لا يسمح goto المُعيّن في Fortran بتعبيرات عشوائية كهدف للقفز. [ 16 ] كما هو الحال مع goto القياسي في لغة C، يسمح امتداد GNU C بأن يكون هدف goto المحسوب موجودًا فقط داخل الدالة الحالية. وتؤدي محاولة القفز خارج الدالة الحالية إلى سلوك غير مُحدد. [ 16 ]&&void*

تدعم بعض إصدارات لغة BASIC أيضًا أمر الانتقال المحسوب بالمعنى المستخدم في لغة GNU C، أي أن الهدف يمكن أن يكون أي رقم سطر، وليس فقط رقمًا من قائمة. على سبيل المثال، في لغة MTS BASIC، يمكن كتابة أمر GOTO i*1000للانتقال إلى السطر الذي يحمل الرقم 1000 مضروبًا في قيمة المتغير i (والذي قد يمثل خيارًا محددًا من القائمة، على سبيل المثال). [ 17 ]

تحقق متغيرات تسمية PL/I تأثير الانتقال المحسوب أو المعين.

تغيير

حتى عام 1985، كان معيار ANSI للغة COBOL يتضمن ALTERعبارةً لتغيير وجهة متغير GO TO، وكان يجب أن تكون هذه العبارة ضمن فقرة مستقلة. ALTERوقد اعتُبرت هذه العبارة قديمة في معيار COBOL لعام 1985، وحُذفت في عام 2002 (انظر: كود COBOL ذاتي التعديل ). وكانت هذه الميزة، التي تسمح بتعدد الأشكال ، تُنتقد بشدة ونادرًا ما تُستخدم. [ 18 ]

بيرل goto

تحتوي لغة بيرل على عبارة goto التي تأخذ اسم دالة وتنقل التحكم عن طريق استبدال استدعاء دالة بأخرى ( استدعاء ذيلي ). لا تعود الدالة الجديدة إلى عبارة goto، بل إلى المكان الذي تم استدعاء الدالة الأصلية منه. [ 19 ]

محاكاة الانتقال إلى

توجد عدة لغات لا تدعم وظيفة goto بشكل مباشر، ولكن محاكاة goto توفر بعض الإمكانيات المشابهة لها، وإن كانت محدودة. يمكن محاكاة goto في Java، [ 20 ] وJavaScript، [ 21 ] وPython. [ 7 ] [ 8 ]

متغير تسمية PL/I

يمكن استخدام نوع بيانات PL /I لتنفيذ كلٍ من الانتقال المُعيّن والمحسوب، كما يسمح PL/I بالتفرع خارج الكتلة الحالية. يمكن للإجراء أن يستقبل مُعرّفًا كوسيط، والذي يمكنه بعد ذلك الخروج بتفرع. تتضمن قيمة متغير المُعرّف عنوان إطار المكدس، ويؤدي الانتقال خارج الكتلة إلى إزالة جزء من المكدس.label

يُنفذ ما يلي أمر الانتقال المُعين.

أعلن عن مكان التسمية ؛ حيث = مكان ما ؛ انتقل إلى حيث ؛ ... مكان ما: ...

يُنفذ ما يلي عملية الانتقال المحسوبة.

أعلن عن المتغير ` where ( 5 ) ` عرّف المتغير ` inx` كمتغير ثابت ؛ ...

هناك طريقة أخرى للحصول على نتيجة مكافئة وهي استخدام مصفوفة ثابتة للتسميات لا تستخدم labelمتغيرًا:

أعلن inx ثابتًا ؛ ... انتقل إلى حيث ( inx ... حيث ( 1 ): ... حيث ( 2 ): ...

أمثلة

تختلف بنية الجملة باختلاف اللغة، ولكنها غالباً ما تتبع نمطاً مشابهاً. يتم تحديد هدف التحكم من خلال تسمية أو رقم سطر .

في ملف دفعي لنظام DOS ، يوجه الأمر goto التنفيذ إلى مُعرِّف مُسبق بنقطتين رأسيتين. يمكن أن يكون هدف الأمر goto متغيرًا. يستخدم المثال التالي الأمر goto لتنفيذ تفرع متعدد المسارات عبر أمر goto محسوب.

@ echo off SET D8str = %date% SET D8dow = %D8str:~0,3%لكل %% D في ( من الإثنين إلى الجمعة ) نفّذ ما يلي: إذا كان " %% D" يساوي " %D8dow% " ، فانتقل إلى SHOP%%D. اطبع: اليوم، %D8dow% ، ليس يوم تسوق. انتقل إلى النهاية.: SHOPMon echo اشتري بيتزا للغداء - يوم الاثنين هو يوم البيتزا. goto endتسوق اليوم الأربعاء واشترِ كالزون لتأخذه معك إلى المنزل - اليوم هو الأربعاء. انتقل إلى النهاية: SHOPFri echo buy Seltzer in if someone want to acalorie sound. : end

نقد

في الاجتماع التمهيدي للغة ALGOL الذي عُقد عام 1959، شكّك هاينز زيمانيك صراحةً في ضرورة استخدام عبارات goto، لكن لم يُعر أحدٌ اهتمامًا لملاحظته آنذاك ، بمن فيهم إدسكار دبليو ديكسترا ، الذي أصبح فيما بعد أبرز معارضي goto. [ 22 ] شهدت سبعينيات وثمانينيات القرن العشرين تراجعًا في استخدام عبارات goto لصالح نموذج البرمجة الهيكلية ، حيث وُجهت انتقاداتٌ لـ goto باعتبارها تؤدي إلى شيفرة معقدة يصعب صيانتها . توصي بعض معايير أسلوب البرمجة ، مثل معايير GNU Pascal، بعدم استخدام عبارات goto. [ 23 ] لم يُحسم برهان بوم-جاكوبيني (1966) مسألة اعتماد البرمجة الهيكلية لتطوير البرمجيات، ويعود ذلك جزئيًا إلى أن هذا الأسلوب كان يُرجّح أن يُعقّد البرنامج بدلًا من تحسينه، نظرًا لأن تطبيقه يتطلب إضافة متغيرات محلية إضافية. [ 24 ] مع ذلك، أثارت هذه الظاهرة نقاشًا واسعًا بين علماء الحاسوب، والمعلمين، ومصممي اللغات، ومبرمجي التطبيقات، مما أدى إلى تحول تدريجي وثابت عن الاستخدام الشائع لعبارة goto. ولعل أشهر انتقاد لعبارة goto هو رسالة إدسكار ديكسترا عام 1968 بعنوان " عبارة goto تُعتبر ضارة" . [ 22 ] في تلك الرسالة، جادل ديكسترا بضرورة إلغاء عبارات goto غير المقيدة من لغات البرمجة عالية المستوى لأنها تُعقّد مهمة تحليل البرامج والتحقق من صحتها (خاصةً تلك التي تتضمن حلقات تكرارية). [ 25 ] أثارت الرسالة نفسها نقاشًا، بما في ذلك رسالة بعنوان " عبارة goto تُعتبر ضارة" [ 26 ] أُرسلت إلى مجلة اتصالات رابطة مكائن ​​الحوسبة (CACM) في مارس 1987، بالإضافة إلى ردود أخرى من أشخاص آخرين، بما في ذلك رد ديكسترا " حول مراسلة مخيبة للآمال نوعًا ما" . [ 27 ]

يُقدّم دونالد كنوث وجهة نظر بديلة في كتابه " البرمجة الهيكلية باستخدام عبارات go to" ، الذي يُحلّل العديد من مهام البرمجة الشائعة، ويخلص إلى أن goto هي البنية اللغوية الأمثل للاستخدام في بعضها . [ 28 ] في كتاب "لغة البرمجة C" ، يُحذّر برايان كيرنيغان ودينيس ريتشي من أن goto "قابلة للاستغلال بشكل كبير"، لكنهما يُشيران أيضًا إلى إمكانية استخدامها لمعالجة أخطاء نهاية الدوال، وللخروج من الحلقات على مستويات متعددة. [ 29 ] يمكن إيجاد هذين النمطين في العديد من الكتب اللاحقة حول لغة C لمؤلفين آخرين؛ [ 30 ] [ 31 ] [ 32 ] [ 33 ] ويُشير كتاب تمهيدي صدر عام 2007 إلى أن نمط معالجة الأخطاء هو وسيلة للتغلب على "نقص معالجة الاستثناءات المدمجة في لغة C". [ 30 ] يعترض مبرمجون آخرون، بمن فيهم مصمم ومبرمج نواة لينكس، لينوس تورفالدز، ومهندس البرمجيات ومؤلف الكتب، ستيف ماكونيل ، على وجهة نظر ديكسترا، مشيرين إلى أن استخدام goto قد يكون ميزة لغوية مفيدة، إذ يُحسّن سرعة البرنامج وحجمه ووضوح الكود، ولكن فقط عند استخدامه بطريقة منطقية من قِبل مبرمج يتمتع بنفس القدر من المنطق. [ 34 ] [ 35 ] ووفقًا لأستاذ علوم الحاسوب، جون ريغير ، فقد بلغ عدد حالات استخدام goto في كود نواة لينكس حوالي 100,000 حالة في عام 2013. [ 36 ]

تبنى أكاديميون آخرون وجهة نظر أكثر تطرفًا، إذ جادلوا بأن حتى تعليمات مثل `goto` breakو` returngoto` من منتصف الحلقات تُعد ممارسة سيئة، لأنها غير ضرورية في نتيجة بوم-جاكوبيني، وبالتالي دعوا إلى أن يكون للحلقات نقطة خروج واحدة فقط. [ 37 ] على سبيل المثال، كتب برتراند ماير في كتابه الدراسي الصادر عام 2009 أن تعليمات مثل `goto` breakو`goto` continue"ليست سوى نسخة مُعدّلة من `goto`". [ 38 ] مع ذلك، يسمح شكل مُعدّل قليلاً من نتيجة بوم-جاكوبيني بتجنب المتغيرات الإضافية في البرمجة الهيكلية، طالما يُسمح بالخروج من الحلقات على مستويات متعددة. [ 39 ] ولأن بعض اللغات، مثل لغة C، لا تسمح بالخروج على مستويات متعددة عبر breakالكلمة المفتاحية `goto`، تنصح بعض الكتب الدراسية المبرمج باستخدام `goto` في مثل هذه الحالات. [ 33 ] يحظر معيار MISRA C 2004 استخدام `goto` و`goto` continue، بالإضافة إلى عبارات `goto` returnو` goto` المتعددة break. [ 40 ] خفّضت نسخة عام 2012 من معيار MISRA C حظر استخدام أمر goto من "إلزامي" إلى "استرشادي"؛ وتتضمن نسخة 2012 قاعدة إضافية إلزامية تحظر فقط القفزات العكسية، وليس الأمامية، باستخدام أمر goto. [ 41 ] [ 42 ]

أدخلت لغة فورتران بنى البرمجة الهيكلية عام 1978، وفي المراجعات اللاحقة، جرى تشديد القواعد الدلالية المتساهلة نسبيًا التي تحكم الاستخدام المسموح به لعبارة goto؛ حيث أُزيل "النطاق الموسع" الذي كان يسمح للمبرمج باستخدام goto للخروج من حلقة DO قيد التنفيذ والعودة إليها من اللغة عام 1978، [ 43 ] وبحلول عام 1995، حُذفت عدة أشكال من عبارة goto في فورتران، بما في ذلك goto المحسوبة وgoto المُسندة. [ 44 ] تفتقر بعض لغات البرمجة الحديثة واسعة الانتشار، مثل جافا وبايثون ، إلى عبارة goto، على الرغم من أن معظمها يوفر وسيلة ما للخروج من التحديد، أو الخروج من الخطوة التالية في التكرار أو الانتقال إليها. ويمكن ملاحظة وجهة النظر القائلة بأن تعطيل تدفق التحكم في الكود غير مرغوب فيه في تصميم بعض لغات البرمجة، فعلى سبيل المثال، تُبرز لغة آدا [ 45 ] تعريفات التسميات بصريًا باستخدام الأقواس الزاوية .

يتناول البند 17.10 في قائمة الأسئلة الشائعة الخاصة بـ comp.lang.c [ 46 ] مسألة استخدام goto بشكل مباشر، وينص على

أسلوب البرمجة، كأسلوب الكتابة، فنٌّ إلى حدٍّ ما، ولا يمكن تقنينه بقواعد جامدة، مع أن النقاشات حول الأسلوب غالبًا ما تتمحور حول هذه القواعد. في حالة عبارة goto، لوحظ منذ زمن طويل أن الإفراط في استخدامها يؤدي سريعًا إلى شيفرة معقدة يصعب صيانتها. مع ذلك، فإن الحظر التلقائي لعبارة goto لا يُفضي بالضرورة إلى برمجة جميلة: فالمبرمج غير المنظم قادرٌ على بناء شيفرة معقدة دون استخدام goto (ربما باستبدالها بحلقات متداخلة غريبة ومتغيرات تحكم منطقية). يتبنى العديد من المبرمجين موقفًا معتدلًا: يُنصح عادةً بتجنب goto، لكنها مقبولة في حالات محددة، عند الضرورة: كعبارات break متعددة المستويات، أو لدمج الإجراءات المشتركة داخل عبارة switch، أو لتركيز مهام التنظيف في دالة ذات عدة عمليات إرجاع للأخطاء. (...) إن تجنب بعض المفاهيم البرمجية بشكل أعمى أو اتباع القواعد دون فهمها قد يؤدي إلى مشاكل لا تقلّ عن تلك التي كان من المفترض أن تمنعها هذه القواعد. علاوة على ذلك، فإن العديد من الآراء حول أساليب البرمجة ليست سوى آراء. قد تكون هذه الآراء مدعومة بأدلة وحجج قوية، لكن الآراء المعارضة قد تكون بنفس القوة والدعم والجدل. عادةً ما يكون من العبث الانجرار إلى "حروب الأساليب"، لأنه في بعض القضايا، يبدو أن الخصوم لا يستطيعون الاتفاق، أو الاتفاق على الاختلاف، أو التوقف عن الجدال.

أنماط أكثر قبولا

على الرغم من انخفاض استخدام عبارة goto بشكل عام، إلا أن هناك حالات تُعدّ فيها هذه العبارة وسيلة جيدة للتعبير عن منطق البرنامج. مع أنه من الممكن التعبير عن المنطق بدونها، إلا أن الكود المكافئ يكون أطول أو أكثر صعوبة في الفهم. ومن الحالات التي يُرجّح فيها اعتبار استخدام goto مقبولاً: [ 34 ] [ 47 ]

  • تقليل تكرار التعليمات البرمجية. [ 34 ] [ 47 ]
  • يُعدّ تنفيذ أوامر break وcontinue متعددة المستويات، إن لم تكن مدعومة بشكل مباشر في اللغة، أسلوبًا شائعًا في لغة C. [ 33 ] على الرغم من أن لغة Java تحتفظ بالكلمة المفتاحية goto، إلا أنها لا تُنفّذها فعليًا. بدلًا من ذلك، تُنفّذ Java أوامر break وcontinue المُعلّمة. [ 51 ] وفقًا لتوثيق Java، كان استخدام أوامر goto للتوقفات متعددة المستويات هو الاستخدام الأكثر شيوعًا (90%) لأوامر goto في لغة C. [ 52 ] لم تكن Java أول لغة تتبنى هذا النهج - منع استخدام goto مع توفير التوقفات متعددة المستويات - فقد سبقتها لغة برمجة BLISS (وتحديدًا إصدار BLISS-11 منها) في هذا الصدد. [ 53 ]
  • تُستخدم بدائل لعبارات break أو continue (إعادة المحاولة) ذات المستوى الواحد عندما قد يؤثر إدخال حلقات إضافية بشكل غير صحيح على مسار التحكم. وقد لوحظت هذه الممارسة في كود NetBSD . [ 48 ]
  • إزالة البيانات من المكدس في لغات مثل Algol و PL/I .
  • لغات برمجة متخصصة تعمل بطريقة خطية، مثل نظام الحوار لألعاب الفيديو. [ 54 ]

تُعدّ هذه الاستخدامات شائعة نسبيًا في لغة C، ولكنها أقل شيوعًا في لغة C++ أو غيرها من اللغات ذات الميزات عالية المستوى. [ 50 ] مع ذلك، قد يكون طرح استثناء والتقاطه داخل دالة غير فعال للغاية في بعض اللغات؛ ومن الأمثلة البارزة على ذلك لغة Objective-C ، حيث يُعدّ استخدام goto بديلاً أسرع بكثير. [ 55 ]

يُستخدم أمر goto أيضًا لتعديل الشيفرة القديمة ذات البنية الضعيفة ، حيث يتطلب تجنب استخدامه إعادة هيكلة شاملة أو تكرارًا للشيفرة . على سبيل المثال، عند وجود دالة كبيرة لا يهم فيها سوى جزء معين من الشيفرة، يسمح أمر goto بالانتقال إلى أو من الشيفرة ذات الصلة فقط، دون تعديل الدالة. يُعتبر هذا الاستخدام مؤشرًا على رداءة الشيفرة [ 56 ] ، ولكنه يُستخدم أحيانًا.

البدائل

البرمجة الهيكلية

هدفت حركة البرمجة الهيكلية إلى إلغاء الحاجة إلى استخدام عبارة goto من خلال إدخال هياكل تحكم إلى لغة مثل:

اختيار
مثل العبارة الشرطية (أي if-then-else) وعبارة التبديل
التكرار
عبارات التكرار مثل حلقة for ، وحلقة while، وحلقة do while .
خروج مبكر
إنهاء تنفيذ بنية التحكم أو تكرار واحد
استراحة
أعاد
يترك
تسمح بعض اللغات، على سبيل المثال، PL/I ، بتسمية بنية التحكم.
foo : do i = 1 to 10 ; if i = 7 then iterate foo ; x ( i ) = 3 ; end ;

حلت آليات اللغة الجديدة هذه محلّ آليات التحكم المكافئة التي كانت تُكتب سابقًا باستخدام عبارة goto. وتحل عبارة switch محل عبارة goto المحسوبة التي يتم فيها تحديد التعليمات المراد الانتقال إليها ديناميكيًا (بشكل مشروط).

في ظل ظروف معينة، من الممكن حذف عبارات الانتقال المحلية في البرامج القديمة عن طريق استبدالها بعبارات الخروج من الحلقات متعددة المستويات. [ 57 ]

معالجة الاستثناءات

من الناحية العملية، يؤدي الالتزام الصارم بالنموذج الأساسي ذي البنية الثلاثية للبرمجة الهيكلية إلى كود متداخل للغاية، وذلك بسبب عدم القدرة على الخروج من وحدة هيكلية قبل الأوان، وانفجار توافقي مع بيانات حالة برنامج معقدة للغاية للتعامل مع جميع الظروف الممكنة.

تم اعتماد حلين رئيسيين: طريقة للخروج من وحدة هيكلية قبل الأوان، ومعالجة الاستثناءات بشكل عام. يصعد كلا الحلين في الهيكل، مُعيدًا التحكم إلى الكتل أو الدوال المُحيطة، دون الانتقال إلى مواقع برمجية عشوائية. يشبه هذا استخدام عبارة return في موضع غير نهائي - ليس هيكليًا تمامًا، نظرًا للخروج المبكر، ولكنه تخفيف طفيف لقيود البرمجة الهيكلية. في لغة C، breakتسمح continueهذه الطريقة بإنهاء حلقة تكرارية أو الانتقال إلى التكرار التالي ، دون الحاجة إلى عبارة while أو if إضافية. في بعض اللغات، يُمكن أيضًا استخدام فواصل متعددة المستويات. ولمعالجة الحالات الاستثنائية، أُضيفت بنيات مُخصصة لمعالجة الاستثناءات ، مثل try` catch--` finallyفي لغة Java.

يمكن إساءة استخدام آليات معالجة الاستثناءات من نوع throw-catch بسهولة لإنشاء هياكل تحكم غير شفافة، تمامًا كما يمكن إساءة استخدام goto. [ 58 ]

نداء الذيل

في ورقة بحثية قُدّمت في مؤتمر ACM في سياتل عام 1977، لخّص جاي إل. ستيل النقاش الدائر حول عبارة goto والبرمجة الهيكلية، ولاحظ أن استدعاءات الإجراءات في نهاية مسار الإجراء يُمكن التعامل معها على النحو الأمثل كنقل مباشر للتحكم إلى الإجراء المُستدعى، مما يُلغي عادةً عمليات معالجة المكدس غير الضرورية. [ 59 ] ونظرًا لشيوع هذه "الاستدعاءات في نهاية المسار" في لغة Lisp ، وهي لغة تكثر فيها استدعاءات الإجراءات، فإن هذا النوع من التحسين يُقلل بشكل كبير من تكلفة استدعاء الإجراء مقارنةً بعبارة goto المُستخدمة في لغات أخرى. جادل ستيل بأن استدعاءات الإجراءات سيئة التنفيذ قد أدت إلى تصور خاطئ بأن عبارة goto رخيصة مقارنةً باستدعاء الإجراء. كما جادل ستيل أيضًا بأنه "بشكل عام، يُمكن اعتبار استدعاءات الإجراءات بمثابة عبارات goto تُمرر أيضًا مُعاملات، ويُمكن ترميزها بشكل موحد كتعليمات JUMP في لغة الآلة "، مع اعتبار تعليمات معالجة المكدس في لغة الآلة "تحسينًا (وليس العكس!)". [ 59 ] استشهد ستيل بأدلة تُشير إلى أن الخوارزميات العددية المُحسَّنة جيدًا في لغة ليسب يُمكن تنفيذها بسرعة أكبر من الشيفرة التي تُنتجها مُترجمات فورتران التجارية المُتاحة آنذاك، وذلك لأن تكلفة استدعاء الإجراء في ليسب كانت أقل بكثير. في لغة سكيم ، وهي لهجة من ليسب طوّرها ستيل مع جيرالد جاي سوسمان ، يُعد تحسين استدعاءات الذيل إلزاميًا. [ 60 ]

على الرغم من أن ورقة ستيل لم تُقدّم الكثير من الجديد في علوم الحاسوب، على الأقل كما كانت تُمارس في معهد ماساتشوستس للتكنولوجيا، إلا أنها سلّطت الضوء على إمكانية تحسين استدعاءات الإجراءات، مما جعل خصائص الإجراءات المُعززة للنمطية بديلاً أكثر موثوقية لأساليب البرمجة الشائعة آنذاك، والتي كانت تعتمد على إجراءات ضخمة متجانسة ذات هياكل تحكم داخلية معقدة وبيانات حالة واسعة النطاق. وعلى وجه الخصوص، حوّلت تحسينات استدعاءات الذيل التي ناقشها ستيل الإجراء إلى طريقة فعّالة لتنفيذ التكرار من خلال استدعاء ذيلي واحد (استدعاء الذيل لنفس الدالة). علاوة على ذلك، يسمح تحسين استدعاءات الذيل بالتكرار المتبادل ذي العمق غير المحدود، بافتراض استدعاءات الذيل - وهذا يسمح بنقل التحكم، كما هو الحال في آلات الحالة المحدودة ، والذي يتم تحقيقه عادةً باستخدام عبارات goto.

روتين فرعي

الروتين الفرعي هو شكل أكثر مرونة من البرمجة الهيكلية، إذ يسمح ليس فقط بنقاط خروج متعددة (كما في عبارة return في غير موضع الذيل)، بل أيضًا بنقاط دخول متعددة، على غرار عبارات goto. يُعد الروتين الفرعي أكثر تقييدًا من goto، حيث لا يمكنه استئناف تنفيذ روتين فرعي قيد التشغيل إلا عند نقاط محددة - أي الاستمرار بعد عبارة yield - بدلًا من الانتقال إلى أي نقطة في الكود. يُعد المولد شكلًا محدودًا من أشكال الروتين الفرعي. أما الإغلاق فهو أكثر تقييدًا - دالة تحتفظ بالحالة (عبر متغيرات ثابتة )، ولكن ليس موضع التنفيذ. يمكن لمجموعة من متغيرات الحالة والتحكم الهيكلي، ولا سيما عبارة switch الشاملة، أن تسمح للدالة باستئناف التنفيذ عند أي نقطة في الاستدعاءات اللاحقة، وهو بديل هيكلي لعبارة goto في حال عدم وجود الروتينات الفرعية. يُعد هذا أسلوبًا شائعًا في لغة C، على سبيل المثال.

استمرار

يُشبه الأمر "الاستمرار " الأمر "goto" في كونه ينقل التحكم من أي نقطة في البرنامج إلى نقطة مُحددة. إلا أن الاستمرار أكثر مرونة من "goto" لأنه يُمكنه نقل التحكم خارج الدالة الحالية، وهو أمر لا يُمكن لـ "goto" فعله في معظم لغات البرمجة الهيكلية. في تلك اللغات التي تحتفظ بإطارات مكدس لتخزين المتغيرات المحلية ومعاملات الدوال، يتضمن تنفيذ الاستمرار تعديل مكدس استدعاءات البرنامج بالإضافة إلى القفز. تُعد دالة longjmp في لغة البرمجة C مثالًا على استمرار الهروب الذي يُمكن استخدامه للهروب من السياق الحالي إلى سياق آخر. كما يتمتع عامل GO في لغة Common Lisp بخاصية فك المكدس هذه، على الرغم من أن بنيته مُحددة النطاق المعجمي ، حيث يُمكن الإشارة إلى العلامة المراد القفز إليها من دالة مغلقة .

في لغة Scheme ، يمكن للاستمرار نقل التحكم من سياق خارجي إلى سياق داخلي. وهذا يُمكّن من كتابة هياكل تحكم مثل الروتينات الفرعية والتعددية التعاونية للمهام. [ 60 ]

انظر أيضاً

  • COMEFROM – عبارة تحكم في تدفق لغة البرمجة؛ عكس goto 
  • GOSUB – عائلة لغات البرمجة. صفحات تعرض أوصافًا مختصرة لأهداف إعادة التوجيه. 
  • عبارة التبديل – عبارة برمجية للتحكم في التفرع بناءً على قيمة 
  • البرمجة غير المهيكلة – نموذج البرمجة الذي يسبق البرمجة المهيكلة 

ملحوظات

  1. وات وفيندلاي 2004 .
  2. كيرنيغان وريتشي 1988 ، ص 224، A9.6 عبارات القفز.
  3. ومع ذلك، فإن القفزات داخل سلسلة الاستدعاءات ممكنة باستخداموظائف setjmp/longjmp
  4. فاغنر 2021 .
  5. "عبارة GoTo - فيجوال بيسك | مايكروسوفت ليرن" . مايكروسوفت ليرن . 15 سبتمبر 2021. تم الاطلاع عليه بتاريخ 25 سبتمبر 2023 .
  6. جوسلينج وآخرون (2005): على عكس لغتي C وC++، لا تحتوي لغة برمجة جافا على عبارة goto؛ بل تُستخدم مُعرّفات العبارات مع عبارات break (الفقرة 14.15) أو continue (الفقرة 14.16) التي تظهر في أي مكان داخل العبارة المُعرّفة. الكلمتان المفتاحيتان const وgoto محجوزتان، على الرغم من أنهما غير مستخدمتين حاليًا. قد يسمح هذا لمترجم جافا بإنتاج رسائل خطأ أفضل في حال ظهور هاتين الكلمتين المفتاحيتين من لغة C++ بشكل غير صحيح في البرامج.
  7. 1 2 هيندل 2004 .
  8. 1 2 نواك وآخرون 2015 .
  9. دليل PHP لعام 2021 .
  10. ^ جالر 1962 ، ص 26-28، 197، 211.
  11. ، مما يعني أن البرنامج يقفز إلى التسمية 20 أو 30 أو 40، في حالة كون i أقل من أو يساوي أو أكبر من الصفر.
  12. شركة لاهي لأنظمة الكمبيوتر، 2004 .
  13. مايكروسوفت 2021 .
  14. Wehr 1997 .
  15. z/OS 2.5.0 في وثائق IBM لعام 2021 .
  16. 1 2 GCC، مجموعة مترجمات GNU 2021 .
  17. Fronczak & Lubbers 1974 ، ص 226.
  18. فان تاسل 2004 .
  19. دليل بناء جملة لغة بيرل 2021 .
  20. GOTO لجافا 2009 .
  21. سيكستون 2012 .
  22. 1 2 ديكسترا 1968 .
  23. فريق تطوير GNU Pascal 2005 ، 5.1 نصائح متنوعة لبرمجة Pascal.
  24. لودن ولامبرت 2012 .
  25. «إن الاستخدام المفرط لعبارة goto يؤدي مباشرةً إلى صعوبة بالغة في إيجاد مجموعة إحداثيات ذات معنى لوصف تقدم العملية. ... إن عبارة goto بصيغتها الحالية بدائية للغاية، وهي بمثابة دعوة صريحة لإفساد البرنامج.»
  26. روبين 1987 .
  27. ديجكسترا، إدسكار دبليو. حول مراسلة مخيبة للآمال إلى حد ما (EWD-1009) (ملف PDF) . أرشيف إي دبليو ديجكسترا. مركز التاريخ الأمريكي، جامعة تكساس في أوستن .( نص مكتوب ) (مايو 1987)
  28. كنوت 1974 .
  29. كيرنيغان وريتشي 1988 ، ص 65-66، 3.8 الانتقال إلى والتسميات.
  30. 1 2 3 فاين 2007 ، ص 262.
  31. جيسلر 2011 .
  32. براتا 2013 .
  33. 1 2 3 4 ساهني وجماليك 1995 .
  34. 1 2 3 أندروز 2003 .
  35. ماكونيل 2004 .
  36. ريغير 2013 .
  37. روبرتس 1995 .
  38. ماير 2009 .
  39. كوزين وتسنج 2008 .
  40. أسئلة موقع Stack Overflow لعام 2012 .
  41. بيتشفورد وتاب 2013 .
  42. ويليامز 2013 .
  43. معيار ANSI X3.9-1978. المعيار الوطني الأمريكي - لغة البرمجة فورتران. المعهد الوطني الأمريكي للمعايير. يُعرف أيضًا باسم ISO 1539-1980، ويُعرف بشكل غير رسمي باسم فورتران 77
  44. ISO/IEC 1539-1:1997. تكنولوجيا المعلومات – لغات البرمجة – فورتران – الجزء 1: اللغة الأساسية. تُعرف بشكل غير رسمي باسم فورتران 95. يوجد جزآن آخران لهذا المعيار. وقد اعتمدت ANSI الجزء 1 رسميًا.
  45. بارنز 2006 .
  46. قمة 1995 .
  47. 1 2 تورفالدز 2016 .
  48. 1 2 سبينليس 2003 .
  49. 1 2 كوزنز 2004 .
  50. 1 2 ألان 2019 .
  51. دروس جافا 2012 .
  52. جوسلينج وماكجيلتون 1996 .
  53. ^ بريندر 2002 ، ص 960-965.
  54. هواد، ناثان (28 يوليو 2022). "nathanhoad/godot_dialogue_manager" . جيت هاب . تم الاطلاع عليه في 3 فبراير 2023 .
  55. تشيسنال 2012 .
  56. كونتيري 2021 .
  57. رامشو 1988 .
  58. سيدرسليبن 2006 .
  59. 1 2 ستيل 1977 .
  60. 1 2 كيلسي وكلينجر وريس 1998 .

مراجع

  • أندروز، جيريمي (13 يناير 2003). "لينكس: استخدام أمر goto في كود النواة" . مؤرشف من الأصل في 28 نوفمبر 2005. تم الاطلاع عليه بتاريخ 14 نوفمبر 2021 .
  • كونتييري، ماكسي (2021-11-02). "Code Smell 100 - GoTo" . ماكسيميليانو كونتييري - تصميم البرمجيات . مؤرشف من الأصل بتاريخ 2021-11-11 . تم الاطلاع عليه بتاريخ 2021-11-14 .
  • كوزنز، سيمون (16 أبريل 2004). "استخدامات جيدة لأمر goto" . سيمون وهنريتا كوزنز . مؤرشف من الأصل بتاريخ 19 مارس 2011.
  • فرونتشاك، إدوارد جيه؛ لوبيرز، كلارك إي. (سبتمبر 1974). نظام محطة ميشيغان (MTS ). مركز الحوسبة بجامعة ميشيغان. UOM:39015034770076.
  • جيسلر، ساندرا (2011). مرجع شامل للمبتدئين . جون وايلي وأولاده. الصفحات 217-220 . ISBN  978-1-118-05424-6.
  • GOTO للغة جافا (6 يوليو 2009). "GOTO للغة جافا" . steik . مؤرشف من الأصل في 15 يونيو 2012. تم الاطلاع عليه في 28 أبريل 2012 .
  • هيندل، ريتشي (1 أبريل 2004). "goto for Python" . Entrian Solutions . هيرتفورد، المملكة المتحدة: Entrian Solutions Ltd. تم الاسترجاع في 10 نوفمبر 2021 .
  • شركة لاهي لأنظمة الحاسوب (2004). "عبارة GOTO المحسوبة (القديمة)" . شركة لاهي لأنظمة الحاسوب. مؤرشفة من الأصل بتاريخ 26 مايو 2016. تم الاطلاع عليها بتاريخ 10 نوفمبر 2021 .
  • ماكونيل، ستيف (ديسمبر 2004). كود كامل: دليل عملي لبناء البرمجيات، الطبعة الثانية .  مطبعة مايكروسوفت. ISBN 978-0735619678.
  • ماير، برتراند (2009). لمسة من الرقي: تعلم البرمجة الجيدة باستخدام الكائنات والعقود . سبرينغر ساينس آند بيزنس ميديا. ص  189. ISBN 978-3-540-92144-8.
  • دليل بناء جملة لغة بيرل (2021). انتقل إلى (تقرير) . تم الاطلاع عليه بتاريخ 14 نوفمبر 2021 .
  • دليل PHP (2021). "goto" . PHP . تم الاطلاع عليه بتاريخ 13 نوفمبر 2021 .
  • براتا ، ستيفن (2013). سي برايمر بلس . أديسون ويسلي. ص 287 – 289. ISBN  978-0-13-343238-1.
  • سيكستون، أليكس (2012). "صيف غوتو | الموقع الرسمي لـ Goto.js" . مؤرشف من الأصل في 25 أكتوبر 2015. تم الاطلاع عليه في 27 أبريل 2012 .
  • ستيل، جاي لويس (يناير 1977). "دحض أسطورة "استدعاء الإجراء المكلف" أو، تطبيقات استدعاء الإجراء التي تُعتبر ضارة أو، لامدا". وقائع المؤتمر السنوي لعام 1977 - ACM '77 . الصفحات 153-162 . doi : 10.1145/800179.810196 . ISBN  9781450323086. S2CID 9807843 . 
  • فان تاسل، ديني (8 يوليو 2004). "تاريخ التسميات في لغات البرمجة" . مؤرشف من الأصل في 18 سبتمبر 2024. تم الاطلاع عليه في 4 يناير 2011 .
  • فاين، مايكل أ. (2007). برمجة لغة سي للمبتدئين تمامًا . سينجايج ليرنينج. ISBN 978-1-59863-634-5.
  • وير، جيسون (1997). "انتقل إلى (المُخصص)" . www.personal.psu.edu/jhm/f90/201.html . مؤرشف من الأصل بتاريخ 21 يناير 2022. تم الاطلاع عليه بتاريخ 13 نوفمبر 2021 .
  • في وثائق IBM (2021)، ورد في z/OS 2.5.0: "عبارة الانتقال المحسوبة (امتداد IBM)" . IBM . تاريخ الاطلاع: 13 نوفمبر 2021. يصف هذا المستند بناء الجملة، والدلالات، وتطبيق IBM z/OS XL للغتي البرمجة C وC++. للاطلاع على مرجع معياري عام للغة C أو C++، يُرجى زيارة cppreference.com.{{cite web}}: صيانة CS1: الأسماء الرقمية: قائمة المؤلفين ( رابط )