اذهب الى

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

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

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

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

الاستخدام

goto label

غالبًا ما يتم دمج العبارة gotoمع عبارة if للتسبب في نقل مشروط للتحكم.

IF condition THEN goto label

تفرض لغات البرمجة قيودًا مختلفة فيما يتعلق بوجهة العبارة goto. على سبيل المثال، لا تسمح لغة البرمجة C بالانتقال إلى تسمية موجودة داخل دالة أخرى، [2] ومع ذلك، فإن الانتقالات داخل سلسلة نداء واحدة ممكنة باستخدام الدالتين setjmp/longjmp .

نقد

في اجتماع ما قبل ALGOL الذي عقد في عام 1959، شكك هاينز زيمانيك صراحةً في ضرورة عبارات GOTO؛ في ذلك الوقت لم ينتبه أحد [ بحاجة لمصدر ] إلى ملاحظته، بما في ذلك إدسجر دبليو ديكسترا ، الذي أصبح فيما بعد الخصم الأيقوني لـ GOTO. [3] شهدت السبعينيات والثمانينيات انخفاضًا في استخدام عبارات GOTO لصالح نموذج البرمجة المنظمة ، مع انتقاد GOTO لأنه يؤدي إلى كود سباغيتي غير قابل للصيانة . توصي بعض معايير ترميز أسلوب البرمجة ، على سبيل المثال معايير ترميز GNU Pascal، بعدم استخدام عبارات GOTO. [4] لم يحسم دليل بوم-جاكوبيني (1966) مسألة ما إذا كان ينبغي تبني البرمجة المنظمة لتطوير البرامج، ويرجع ذلك جزئيًا إلى أن البناء كان من المرجح أن يحجب البرنامج بدلاً من تحسينه لأن تطبيقه يتطلب إدخال متغيرات محلية إضافية. [5] ومع ذلك، فقد أثار نقاشًا بارزًا بين علماء الكمبيوتر والمعلمين ومصممي اللغات ومبرمجي التطبيقات الذين شهدوا تحولًا بطيئًا ولكن ثابتًا بعيدًا عن الاستخدام السائد سابقًا لـ GOTO. ربما كان الانتقاد الأكثر شهرة لـ GOTO هو رسالة عام 1968 بقلم إدسجر ديكسترا بعنوان " بيان Go-to يعتبر ضارًا ". [3] في تلك الرسالة، زعم ديكسترا أنه يجب إلغاء عبارات GOTO غير المقيدة من اللغات ذات المستوى الأعلى لأنها تعقد مهمة تحليل والتحقق من صحة البرامج (خاصة تلك التي تنطوي على حلقات). [6] أثارت الرسالة نفسها نقاشًا، بما في ذلك رسالة " 'GOTO يعتبر ضارًا' يعتبر ضارًا" [7] المرسلة إلى اتصالات ACM (CACM) في مارس 1987، بالإضافة إلى ردود أخرى من أشخاص آخرين، بما في ذلك رسالة ديكسترا حول مراسلات مخيبة للآمال إلى حد ما . [8]

تم تقديم وجهة نظر بديلة في كتاب دونالد كنوث " البرمجة المنظمة مع عبارات الانتقال إلى" ، والذي يحلل العديد من مهام البرمجة الشائعة ويجد أنه في بعضها، يعد GOTO هو بنية اللغة المثلى للاستخدام. [9] في كتاب لغة البرمجة سي ، يحذر بريان كيرنيغان ودينيس ريتشيgoto من أن هذا "قابل للإساءة إلى ما لا نهاية"، لكنهما يقترحان أيضًا أنه يمكن استخدامه لمعالجات أخطاء نهاية الوظيفة وللانقطاعات متعددة المستويات من الحلقات. [10] يمكن العثور على هذين النمطين في العديد من الكتب اللاحقة عن سي من قبل مؤلفين آخرين؛ [11] [12] [13] [14] يلاحظ كتاب تمهيدي عام 2007 أن نمط معالجة الأخطاء هو وسيلة للتغلب على "نقص معالجة الاستثناءات المضمنة في لغة سي". [11] يعترض مبرمجون آخرون، بما في ذلك مصمم ومبرمج نواة لينكس لينوس تورفالدس أو مهندس البرمجيات ومؤلف الكتاب ستيف ماكونيل ، على وجهة نظر ديكسترا أيضًا، حيث صرّحوا بأن GOTOs يمكن أن تكون ميزة لغوية مفيدة، تعمل على تحسين سرعة البرنامج وحجمه ووضوح الكود، ولكن فقط عند استخدامها بطريقة معقولة من قبل مبرمج معقول نسبيًا. [15] [16] وفقًا لأستاذ علوم الكمبيوتر جون ريجير ، في عام 2013، كان هناك حوالي 100000 حالة من goto في كود نواة لينكس. [17]

اتخذ أكاديميون آخرون وجهة نظر أكثر تطرفًا وجادلوا بأن حتى التعليمات مثل breakو returnمن منتصف الحلقات هي ممارسة سيئة لأنها غير ضرورية في نتيجة بوم-جاكوبيني، وبالتالي دافعوا عن أن الحلقات يجب أن يكون لها نقطة خروج واحدة. [18] على سبيل المثال، كتب برتراند ماير في كتابه المدرسي لعام 2009 أن التعليمات مثل breakو continue"هي مجرد تعليمات قديمة gotoفي ثياب الحملان". [19] ومع ذلك، فإن الشكل المعدل قليلاً لنتيجة بوم-جاكوبيني يسمح بتجنب المتغيرات الإضافية في البرمجة المنظمة، طالما يُسمح بفواصل متعددة المستويات من الحلقات. [20] نظرًا لأن بعض اللغات مثل سي لا تسمح بفواصل متعددة المستويات عبر breakالكلمة الأساسية الخاصة بها، فإن بعض الكتب المدرسية تنصح المبرمج باستخدامها gotoفي مثل هذه الظروف. [14] يحظر معيار MISRA C 2004 ، ،goto بالإضافة continueإلى عبارات returnو المتعددة. [21] خفضت طبعة 2012 من معيار MISRA C الحظر على من "مطلوب" إلى "استشاري"؛ تحتوي طبعة 2012 على قاعدة إلزامية إضافية تحظر القفزات للخلف فقط، ولكن ليس القفزات للأمام مع . [22] [23]breakgotogoto

قدمت لغة فورتران بنيات برمجة منظمة في عام 1978، وفي المراجعات المتعاقبة تم تشديد القواعد الدلالية الفضفاضة نسبيًا التي تحكم الاستخدام المسموح به لـ goto؛ تمت إزالة "النطاق الموسع" الذي يمكن للمبرمج من خلاله استخدام GOTO لمغادرة وإعادة الدخول إلى حلقة DO التي لا تزال قيد التنفيذ من اللغة في عام 1978، [24] وبحلول عام 1995 تم حذف العديد من أشكال Fortran GOTO، بما في ذلك GOTO المحسوبة و GOTO المعينة. [25] تفتقر بعض لغات البرمجة الحديثة المستخدمة على نطاق واسع مثل Java و Python إلى عبارة GOTO - راجع دعم اللغة - على الرغم من أن معظمها يوفر بعض الوسائل للخروج من التحديد، أو الخروج من الخطوة التالية أو الانتقال إليها من التكرار. يمكن رؤية وجهة النظر القائلة بأن إزعاج تدفق التحكم في الكود أمر غير مرغوب فيه في تصميم بعض لغات البرمجة، على سبيل المثال، تؤكد Ada [26] بصريًا على تعريفات العلامات باستخدام أقواس الزاوية .

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

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

أنماط الاستخدام الشائعة

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

تتضمن المواقف التي يكون فيها goto مفيدًا غالبًا ما يلي:

  • لجعل الكود أكثر قابلية للقراءة وأسهل للمتابعة [15] [28]
  • لإنشاء برامج أصغر حجمًا، والتخلص من تكرار الكود [15] [28]
  • تنفيذ آلة الحالة المحدودة ، باستخدام جدول انتقال الحالة والانتقال إلى التبديل بين الحالات (في حالة عدم وجود إزالة استدعاء الذيل )، وخاصة في كود C الذي تم إنشاؤه تلقائيًا. [29] على سبيل المثال، الانتقال إلى في محلل LR الأساسي .
  • تنفيذ break و continue متعدد المستويات إذا لم يكن مدعومًا بشكل مباشر في اللغة؛ هذا تعبير شائع في C. [14] على الرغم من أن Java تحتفظ بكلمة goto الرئيسية، إلا أنها لا تنفذها بالفعل. بدلاً من ذلك، تنفذ Java عبارات break و continue الموسومة. [30] وفقًا لوثائق Java، كان استخدام gotos للانقطاعات متعددة المستويات هو الاستخدام الأكثر شيوعًا (90٪) لـ gotos في C. [31] لم تكن Java هي اللغة الأولى التي اتخذت هذا النهج - حظر goto، ولكن توفير فترات راحة متعددة المستويات - فقد سبقتها لغة برمجة BLISS (أو بالأحرى إصدار BLISS-11 منها) في هذا الصدد. [32]
  • بدائل لعبارات break أو continue (retry) أحادية المستوى عندما قد يؤثر الإدخال المحتمل للحلقات الإضافية بشكل غير صحيح على تدفق التحكم. وقد لوحظت هذه الممارسة في كود Netbsd . [33]
  • معالجة الأخطاء (في حالة عدم وجود استثناءات)، وخاصةً كود التنظيف مثل إلغاء تخصيص الموارد. [11] [14] [33] [29] [34] تقدم لغة C++ بديلاً لبيان goto لحالة الاستخدام هذه، وهو: تهيئة الاستحواذ على الموارد (RAII) من خلال استخدام المدمرات أو استخدام استثناءات المحاولة والالتقاط المستخدمة في معالجة الاستثناءات . [35] يعد setjmp وlongjmp بديلاً آخر، ولهما ميزة القدرة على فك جزء من مكدس النداء .
  • إدخال المكدس، على سبيل المثال، Algol، PL/I.
  • لغات البرمجة المتخصصة التي تعمل بطريقة خطية، مثل نظام الحوار لألعاب الفيديو. [36]

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

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

البدائل

البرمجة المنظمة

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

وفي وقت لاحق، تم تصميم لغات برمجة عالية المستوى مثل باسكال لدعم البرمجة المنظمة ، والتي امتدت من البرامج الفرعية (المعروفة أيضًا بالإجراءات أو الوظائف) إلى هياكل تحكم أخرى مثل:

حلت آليات اللغة الجديدة هذه محل التدفقات المكافئة التي كانت تُكتب سابقًا باستخدام gotos و ifs. يحل التفرع متعدد الاتجاهات محل "الانتقال المحسوب" حيث يتم تحديد التعليمات للانتقال ديناميكيًا (بشروط).

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

الاستثناءات

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

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

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

نداءات الذيل

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

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

الروتينات الفرعية

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

استمرار

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

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

تمرير الرسالة

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

الاختلافات

هناك عدد من التراكيب اللغوية المختلفة ضمن فئة عبارات goto .

تم حساب GOTOوتم تعيين GOTO

في لغة فورتران ، تنتقل قفزة محسوبةGOTO إلى واحدة من عدة تسميات في قائمة، استنادًا إلى قيمة تعبير. ومن الأمثلة على ذلك goto (20,30,40) i. [44] والبناء المكافئ في لغة سي هو عبارة switch ، وفي لغة فورتران الأحدث، SELECT CASEيكون البناء هو البديل النحوي الموصى به. [45] كان لدى لغة بيسك'On GoTo' عبارة حققت نفس الهدف، ولكن في لغة فيجوال بيسك لم يعد هذا البناء مدعومًا. [46]

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

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

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

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

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

تغيير

حتى معيار ANSI COBOL لعام 1985 كان يحتوي على عبارة ALTER التي يمكن استخدامها لتغيير وجهة GO TO الموجودة، والتي يجب أن تكون في فقرة بمفردها. [51] كانت الميزة، التي تسمح بالتعدد الشكلي ، تُدان كثيرًا ونادرًا ما تُستخدم. [52]

بيرل انتقل إلى

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

محاكاة GOTO

هناك العديد من لغات البرمجة التي لا تدعم GOTO افتراضيًا. باستخدام محاكاة GOTO، لا يزال من الممكن استخدام GOTO في لغات البرمجة هذه، وإن كان مع بعض القيود. يمكن للمرء محاكاة GOTO في Java، [54] و JavaScript، [55] وPython. [56] [57]

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

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

/* هذا ينفذ ما يعادل */
 /*المكان المخصص له*/
   أعلن أين العلامة؛
   أين = في مكان ما؛
   اذهب إلى أين؛
   ...
 في مكان ما: /* بيان */ ;
   ...
/* هذا ينفذ ما يعادل */
 /*الانتقال المحسوب*/
   أعلن حيث (5) التسمية؛
   أعلن inx ثابتًا؛
   حيث(1) = abc؛
   حيث(2) = xyz؛
   ...
   انتقل إلى حيث (inx)؛
   ...
 abc: /* بيان */ ;
   ...
 xyz: /* بيان */ ;
   ...

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

/* هذا ينفذ ما يعادل */
 /*الانتقال المحسوب*/
   أعلن inx ثابتًا؛
   ...
   انتقل إلى حيث (inx)؛
   ...
 حيث(1): /* بيان */ ;
   ...
 حيث(2): /* بيان */ ;
   ...

MS/DOS انتقل إلى

في ملف دفعي DOS ، يوجه Goto التنفيذ إلى تسمية تبدأ بعلامة النقطتين. يمكن أن يكون هدف Goto متغيرًا.

@ إيقاف الصدى
 SET  D8str = %date% 
SET  D8dow = %D8str:~0,3%

بالنسبة لـ  %% D في  ( الاثنين والأربعاء والجمعة )  افعل  إذا كان  " %% D"  ==  " %D8dow% "  انتقل إلى  SHOP%%D 
صدى اليوم، %D8dow% ليس يوم تسوق.
 انتقل إلى  النهاية

: SHOPMon 
echo اشترِ بيتزا لتناول الغداء - يوم الاثنين هو يوم البيتزا.
 انتقل إلى  النهاية

: SHOPWed 
echo buy Calzone to take home - today is Wednesday.
 انتقل إلى  النهاية

: SHOPFri 
echo buy Seltzer في حالة رغبة شخص ما في تناول مشروب خالٍ من السعرات الحرارية.
 : end

دعم اللغة

تدعم العديد من اللغات gotoالعبارة، والعديد منها لا تدعمها. في Java ، gotoهي كلمة محجوزة ، لكنها غير قابلة للاستخدام، على الرغم من أن .classالملفات المترجمة تولد GOTOs وLABELs. [58] لا يدعم Python goto، على الرغم من وجود العديد من وحدات joke التي توفرها. [56] [57] لا يوجد عبارة goto في Seed7 ويتم أيضًا حذف gotos المخفية مثل عبارات break وcontinue. [59] في PHP لم يكن هناك دعم أصلي gotoحتى الإصدار 5.3 (كانت المكتبات متاحة لمحاكاة وظائفها). [60]

يدعم كل من C# و Visual Basic .NETgoto . [61] [62] ومع ذلك، فهو لا يسمح بالانتقال إلى تسمية خارج النطاق الحالي، ويحترم التخلص من الكائنات والإنشاءات النهائية، مما يجعله أقل قوة وخطورة بشكل كبير من الكلمةgoto الأساسية في لغات البرمجة الأخرى. كما أنه يصنع تسميات لعبارات الحالة والافتراضية ، والتي يكون نطاقها هو عبارة التبديل المغلقة ؛ غالبًا ما يتم استخدام goto case أو goto default كبديل صريح للسقوط الضمني، والذي لا تسمح به C#.

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

قد يكون للغات أخرى كلمات رئيسية منفصلة خاصة بها للفشل الصريح، والتي يمكن اعتبارها نسخة من gotoمقتصرة على هذا الغرض المحدد. على سبيل المثال، تستخدم Go الكلمة fallthroughالرئيسية ولا تسمح بالفشل الضمني على الإطلاق، [63] بينما تستخدم Perl 5 nextكلمة فشل صريحة بشكل افتراضي، ولكنها تسمح أيضًا بتعيين الفشل الضمني كسلوك افتراضي لوحدة نمطية.

تُطلق عليه أغلب اللغات التي تحتوي على عبارات goto هذا الاسم، ولكن في الأيام الأولى للحوسبة، تم استخدام أسماء أخرى. على سبيل المثال، في MAD تم استخدام عبارة TRANSFER TO. [64] تستخدم APL سهمًا يشير إلى اليمين، لـ goto.

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

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

انظر أيضا

ملحوظات

  1. ^ وات وفيندلاي 2004.
  2. ^ Kernighan & Ritchie 1988، ص 224، A9.6 عبارات القفز.
  3. ^ بواسطة ديكسترا 1968.
  4. ^ فريق تطوير GNU Pascal 2005، 5.1 نصائح متنوعة لبرمجة Pascal.
  5. ^ لودن و لامبرت 2012.
  6. ^ "إن الاستخدام غير المقيد لعبارة goto يؤدي على الفور إلى صعوبة بالغة في العثور على مجموعة ذات مغزى من الإحداثيات لوصف تقدم العملية... إن عبارة "go to" في شكلها الحالي بدائية للغاية، وهي بمثابة دعوة إلى إفساد برنامجك."
  7. ^ روبين 1987.
  8. ^ ديكسترا، إدجر دبليو. حول المراسلات المخيبة للآمال إلى حد ما (EWD-1009) (PDF) . أرشيف إي دبليو ديكسترا. مركز التاريخ الأمريكي، جامعة تكساس في أوستن .(النسخة المنقحة) (مايو 1987)
  9. ^ كنوث 1974.
  10. ^ Kernighan & Ritchie 1988، ص 65-66، 3.8 انتقل إلى العلامات.
  11. ^ abc Vine 2007، ص 262.
  12. ^ جايسلر 2011.
  13. ^ براتا 2013.
  14. ^ أ ب ج د ساهني و كمليخ 1995.
  15. ^ abc أندروز 2003.
  16. ^ ماكونيل 2004.
  17. ^ ريجير 2013.
  18. ^ روبرتس 1995.
  19. ^ ماير 2009.
  20. ^ كوزن وتسينج 2008.
  21. ^ أسئلة Stack Overflow لعام 2012.
  22. ^ بيتشفورد وتاب 2013.
  23. ^ ويليامز 2013.
  24. ^ ANSI X3.9-1978. المعيار الوطني الأمريكي – لغة البرمجة FORTRAN. المعهد الوطني الأمريكي للمعايير. والمعروف أيضًا باسم ISO 1539-1980، والمعروف بشكل غير رسمي باسم FORTRAN 77
  25. ^ ISO/IEC 1539-1:1997. تكنولوجيا المعلومات – لغات البرمجة – فورتران – الجزء 1: اللغة الأساسية. والمعروفة بشكل غير رسمي باسم فورتران 95. ويتكون هذا المعيار من جزأين آخرين. وقد تم اعتماد الجزء 1 رسميًا من قبل المعهد الوطني الأمريكي للمعايير.
  26. ^ بارنز 2006.
  27. ^ القمة 1995.
  28. ^ بواسطة تورفالدس 2016.
  29. ^ من قبل Cozens 2004.
  30. ^ دروس جافا 2012.
  31. ^ جوسلينج وماكجيلتون 1996.
  32. ^ بريندر 2002، ص 960-965.
  33. ^ من قبل Spinellis 2003.
  34. ^ بواسطة ألين 2019.
  35. ^ ستروستروب 2012.
  36. ^ Hoad, Nathan (28 يوليو 2022). "nathanhoad/godot_dialogue_manager". GitHub . تم الاسترجاع في 3 فبراير 2023 .
  37. ^ شيسنال 2012.
  38. ^ كونتييري 2021.
  39. ^ ويلكس، ويلر وجيل 1951.
  40. ^ رامشو 1988.
  41. ^ سيدرسليبن 2006.
  42. ^ ab Steele 1977.
  43. ^ ab Kelsey, Clinger & Rees 1998.
  44. ^ ، مما يعني أن البرنامج يقفز إلى العلامة 20 أو 30 أو 40، في حالة أن i أقل من الصفر أو يساويه أو أكبر منه.
  45. ^ Lahey Computer Systems, Inc 2004.
  46. ^ مايكروسوفت 2021.
  47. ^ وير 1997.
  48. ^ z/OS 2.5.0 في وثائق IBM 2021.
  49. ^ ab GCC، مجموعة مترجمات GNU 2021.
  50. ^ فرونكزاك و لوبرز 1974، ص 226.
  51. ^ تم اعتبار عبارة ALTER قديمة في معيار COBOL 1985 وتم حذفها في عام 2002؛ راجع COBOL > الكود الذي يعدل نفسه
  52. ^ فان تاسيل 2004.
  53. ^ دليل بناء الجملة في لغة Perl 2021.
  54. ^ GOTO لـJava 2009.
  55. ^ سيكستون 2012.
  56. ^ ab Hindle 2004.
  57. ^ ab Noack et al. 2015.
  58. ^ Gosling et al. (2005) على عكس C وC++، لا تحتوي لغة برمجة Java على عبارة goto؛ تُستخدم تسميات عبارة المعرف مع عبارات break (§14.15) أو continue (§14.16) التي تظهر في أي مكان داخل العبارة المُسمَّاة. الكلمات الأساسية const وgoto محجوزة، على الرغم من عدم استخدامها حاليًا. قد يسمح هذا لمُجمِّع Java بإنتاج رسائل خطأ أفضل إذا ظهرت كلمات C++ الأساسية هذه بشكل غير صحيح في البرامج.
  59. ^ دليل لغة البرمجة Seed7 2021.
  60. ^ دليل PHP 2021.
  61. ^ فاغنر 2021.
  62. ^ "بيان الانتقال إلى - Visual Basic | Microsoft Learn". Microsoft Learn . 15 سبتمبر 2021 . تم الاسترجاع في 25 سبتمبر 2023 .
  63. ^ مواصفات لغة البرمجة Go 2021.
  64. ^ جالر 1962، الصفحات من 26 إلى 28، 197، 211.

مراجع

  • ألين، أليكس (2019). "متى نستخدم Goto في C" . تم الاسترجاع في 2021-11-14 .
  • أندروز، جيريمي (13 يناير 2003). "لينكس: استخدام goto في كود النواة". مؤرشف من الأصل في 28 نوفمبر 2005. تم الاسترجاع في 2021-11-14 .
  • برندر، رونالد ف. (2002). "لغة البرمجة BLISS: تاريخ" (PDF) . البرمجيات: الممارسة والخبرة . 32 (10): 955-981. doi :10.1002/spe.470. S2CID  45466625.
  • تشيسنال، ديفيد (2012). كتاب العبارات Objective-C . Addison-Wesley Professional. ص 249. ISBN 978-0-321-81375-6.
  • كونتيري ، ماكسي (2021-11-02). "كود الرائحة 100 - اذهب إلى". ماكسيميليانو كونتيري - تصميم البرمجيات . تم الاسترجاع 2021-11-14 .
  • Cozens, Simon (2004-04-16). "الاستخدامات الجيدة لـ goto". مؤرشف من الأصل في 2011-03-19.
  • ديكسترا، إدسجر دبليو. (مارس 1968). "رسائل إلى المحرر: انتقل إلى البيان الذي اعتُبر ضارًا" (PDF) . اتصالات ACM . 11 (3): 147-148. doi :10.1145/362929.362947. S2CID  17469809.
  • فرونزاك، إدوارد جيه؛ لوبرز، كلارك إي. (سبتمبر 1974). نظام محطة ميشيغان، MTS. مركز الحوسبة بجامعة ميشيغان. UOM:39015034770076.
  • جالر، برنارد أ. (1 يناير 1962). لغة الحاسبات الآلية (PDF) . ماكجرو هيل.
  • GCC، مجموعة مُجمِّعات جنو (2021). "التسميات كقيم - استخدام مجموعة مُجمِّعات جنو (GCC)". Gcc.gnu.org . تم الاسترجاع في 2021-11-13 .
  • جايسلر، ساندرا (2011). مرجع مكتبي شامل للمبتدئين . جون وايلي وأولاده. ص 217-220. رقم ISBN 978-1-118-05424-6.
  • فريق تطوير GNU Pascal (2005). "معايير ترميز GNU Pascal". www.gnu-pascal.de . مؤسسة البرمجيات الحرة . تم الاسترجاع في 2021-11-10 .
  • جوسلينج، جيمس ؛ ماكجيلتون، هنري (مايو 1996). "بيئة لغة جافا". Oracle.com . تم الاسترجاع في 2014-07-22 .
  • GOTO for Java (6 يوليو 2009). "GOTO for Java". steik . مؤرشف من الأصل في 15 يونيو 2012 . تم الاسترجاع في 28 أبريل 2012 .
  • هيندل، ريتشي (1 أبريل 2004). "goto for Python". Entrian Solutions . هيرتفورد، المملكة المتحدة: Entrian Solutions Ltd. تم الاسترجاع في 2021-11-10 .
  • دروس Java (2012-02-28). "Branching Statements (The Java Tutorials > Learning the Java Language > Language Basics)". Docs.oracle.com . تم الاسترجاع في 2021-11-10 .
  • Kelsey, R.; Clinger, W.; Rees, J.; et al. (August 1998). "تقرير منقح5 عن مخطط اللغة الخوارزمية". الحوسبة الرمزية والترتيب الأعلى . 11 (1): 7–105. doi :10.1023/A:1010051815785. S2CID  14069423.
  • كنوث، دونالد (1974). "البرمجة المنظمة باستخدام عبارات الانتقال" (PDF) . استبيانات الحوسبة . 6 (4): 261–301. CiteSeerX  10.1.1.103.6084 . doi :10.1145/356635.356640. S2CID  207630080. مؤرشف من الأصل (PDF) في 2017-07-17 . تم الاسترجاع 2017-01-26 .
  • كوزن، دكستر ؛ تسينج، وي-لونج داستن (يوليو 2008). "نظرية بوم-جاكوبيني خاطئة، من الناحية الافتراضية" (PDF) . في أوديبود، فيليب؛ بولين-موهرينج، كريستين (المحرران). رياضيات بناء البرامج . المؤتمر الدولي التاسع لـ MPC 2008. مذكرات محاضرات في علوم الكمبيوتر. المجلد 5133. مرسيليا، فرنسا. ص 177_192. CiteSeerX  10.1.1.218.9241 . doi :10.1007/978-3-540-70594-9_11. ISBN 978-3-540-70593-2.
  • Lahey Computer Systems, Inc (2004). "Computed GOTO Statement (obsolescent)". Lahey Computer Systems, Inc. مؤرشف من الأصل في 2016-05-26 . تم الاسترجاع في 2021-11-10 .
  • Louden, Kenneth C.; Lambert, Kenneth A. (2012). لغات البرمجة: المبادئ والممارسات . Cengage Learning. ص. 422. ISBN 978-1-111-52941-3.
  • دليل لغة البرمجة Seed7 (2021). "مميزات Seed7" . تم الاسترجاع في 10 نوفمبر 2021 .{{cite web}}:CS1 maint: أسماء رقمية: قائمة المؤلفين ( الرابط )
  • McConnell, Steve (ديسمبر 2004). Code Complete: A Practical Handbook of Software Construction, Second Edition (الطبعة الثانية). Microsoft Press. ISBN 978-0735619678.
  • ماير، برتراند (2009). لمسة من الرقي: تعلم البرمجة الجيدة باستخدام الكائنات والعقود . سبرينغر ساينس آند بيزنس ميديا. ص. 189. ISBN 978-3-540-92144-8.
  • Microsoft (2021). "لم تعد عبارات "On GoTo" و"On GoSub" مدعومة". Microsoft . تم الاسترجاع في 2021-11-10 .
  • Noack, Sebastian; Blank, Douglas; Grainger, Thomas; spacewander (19 سبتمبر 2015). "snoack/python-goto: مُزيِّن وظيفة، يعيد كتابة الكود الثنائي، لتمكين goto في Python". GitHub . تم الاسترجاع في 2021-11-10 .
  • دليل بناء جملة Perl (2021). انتقل إلى (تقرير) . تم الاسترجاع في 2021-11-14 .
  • دليل PHP (2021). "goto". PHP . تم الاسترجاع في 2021-11-13 .
  • بيتشفورد، مارك؛ تاب، كريس (2013-02-25). "MISRA C:2012: الكثير من الأسباب الجيدة للتغيير". التصميم الإلكتروني . تم الاسترجاع في 2014-07-22 .
  • براتا ، ستيفن (2013). سي برايمر بلس . أديسون ويسلي. ص 287-289. رقم ISBN 978-0-13-343238-1.
  • رامشو، ل. (1988). "القضاء على الزيارات المتكررة مع الحفاظ على بنية البرنامج". مجلة جمعية آلات الحوسبة . 35 (4): 893-920. doi : 10.1145/48014.48021 . S2CID  31001665.
  • ريجير، جون (4 فبراير 2013). "استخدام Goto في كود الأنظمة - مضمن في الأوساط الأكاديمية". blog.regehr.org .
  • روبرتس، إريك س. (مارس 1995). "مخارج الحلقة والبرمجة المنظمة: إعادة فتح المناقشة". نشرة ACM SIGCSE . 27 (1): 268-272. doi : 10.1145/199691.199815 .
  • روبين، فرانك (مارس 1987). ""GOTO Considered Harmful" Considered Harmful" (PDF) . اتصالات ACM . 30 (3): 195–196. doi :10.1145/214748.315722. S2CID  6853038. مؤرشف من الأصل (PDF) في 2009-03-20.
  • ساهني، سرتاج؛ جيمليك، بوب (1995). تطوير البرمجيات في C. Silicon Press. ص. 135. ردمك 978-0-929306-16-2.
  • سيكستون، أليكس (2012). "صيف غوتو | الموطن الرسمي لـ Goto.js". مؤرشف من الأصل في 25 أكتوبر 2015.{{cite web}}:CS1 maint: عنوان URL غير مناسب ( الرابط )
  • Siedersleben, Johannes (2006). "الأخطاء والاستثناءات - الحقوق والالتزامات". في Christophe Dony (المحرر). مواضيع متقدمة في تقنيات معالجة الاستثناءات . Springer Science & Business Media. ص. 277. ISBN 978-3-540-37443-5.
  • سبينيليس، ديوميديس (27 مايو 2003). قراءة الكود: منظور المصدر المفتوح. أديسون ويسلي بروفيشنال. ص 43-44. رقم ISBN 978-0-672-33370-5.
  • أسئلة Stack Overflow (2012-06-11). "لماذا يعتبر "الاستمرار" انتهاكًا لـ C في MISRA C:2004؟". Stack Overflow . تم الاسترجاع في 2021-11-10 .
  • ستيل، جاي لويس (يناير 1977). "فضح أسطورة "استدعاء الإجراء المكلف" أو، تطبيقات استدعاء الإجراء التي تعتبر ضارة أو، LAMBDA". وقائع المؤتمر السنوي لعام 1977 حول - ACM '77 . ص. 153-162. doi : 10.1145/800179.810196 . ISBN 9781450323086. S2CID  9807843.
  • ستروستروب ، بيارن (2012/01/09). "الكلمة الرئيسية لليوم الأول - بيارن ستروستروب: نمط C++ 11 | GoingNative 2012 | القناة 9". Channel9.msdn.com . تم الاسترجاع 2021-11-10 .
  • Summit, Steve (1995). "comp.lang.c FAQ list · Question 17.10". C-faq.com . تم الاسترجاع في 2021-11-10 .
  • "مواصفات لغة برمجة Go (26 يوليو 2021). "مواصفات لغة برمجة Go - لغة برمجة Go".
  • Torvalds, Linus (2016). "Linux Kernel Coding Style". وثائق Linux Kernel . تم الاسترجاع في 2021-11-10 .
  • فان تاسيل، ديني (8 يوليو 2004). "تاريخ العلامات في لغات البرمجة" . تم الاسترجاع في 4 يناير 2011 .
  • فاين، مايكل أ. (2007). برمجة سي للمبتدئين تمامًا . سينجاج ليرنينج. رقم ISBN 978-1-59863-634-5.
  • Wagner, Bill (2021). "goto statement - C# Reference". docs.microsoft.com . تم الاسترجاع في 2021-11-09 .
  • وات، ديفيد أنتوني؛ فيندلاي، ويليام (2004). مفاهيم تصميم لغة البرمجة . جون وايلي وأولاده. ص 228. ISBN 978-0-470-85320-7.
  • Wehr, Jason (1997). "انتقل إلى (مُعيَّن)". www.personal.psu.edu/jhm/f90/201.html . تم الاسترجاع في 2021-11-13 .
  • ويليامز، توم (مارس 2013). "التحقق من قواعد C: ضمان الموثوقية والسلامة". مجلة RTC . 22 (3): 12-15 . تم الاسترجاع في 2021-11-10 .
  • z/OS 2.5.0 في وثائق IBM (2021). "عبارة الانتقال إلى الحساب (امتداد IBM)". IBM . تم الاسترجاع في 2021-11-13 . تصف هذه الوثيقة بناء الجملة والدلالات وتنفيذ IBM z/OS XL C/C++ للغات البرمجة C وC++. للحصول على مرجع معياري عام للأغراض C أو C++، راجع cppreference.com.{{cite web}}:CS1 maint: أسماء رقمية: قائمة المؤلفين ( الرابط )
تم الاسترجاع من "https://en.wikipedia.org/w/index.php?title=انتقل إلى&oldid=1254405495"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate