Бару - Goto

Бару (бару, БАРУ, БАРУ немесе бағдарламалау тіліне байланысты басқа жағдай тіркесімдері) болып табылады мәлімдеме көптеген компьютерлерде кездеседі бағдарламалау тілдері. Ол орындайды бір жақты аударым кодтың басқа жолына басқару; керісінше а функционалдық шақыру әдетте басқаруды қайтарады. Секіру орындары, әдетте, анықталады жапсырмалар дегенмен, кейбір тілдер қолданады жол нөмірлері. At машина коды деңгей, а бару формасы болып табылады тармақ немесе секіру туралы мәлімдеме, кейбір жағдайларда стек түзетумен үйлеседі. Көптеген тілдер қолдайды бару мәлімдеме, ал көпшілігі жоқ (қараңыз) § тілдік қолдау ).

The бағдарламаның құрылымдық теоремасы екенін дәлелдеді бару операторын білдіруге болатын бағдарламаларды жазу үшін қажет емес ағындық диаграммалар; бағдарламалаудың үш дәйектілігі, таңдау / таңдау және қайталау / қайталау конструкцияларының кейбір тіркесімі а орындай алатын кез-келген есептеу үшін жеткілікті. Тьюринг машинасы, ескертуімен кодтың қайталануы және қосымша айнымалыларды енгізу қажет болуы мүмкін.[1]

Бұрын академиялық ортада және өндірісте оларды қолдану тиімділігі туралы айтарлықтай пікірталастар болды бару мәлімдемелер. Готоны қолдану бұрын кең таралған, бірақ 1960-1970 жж құрылымдық бағдарламалау пайда болғаннан бастап оны қолдану едәуір төмендеді. Бастапқы сын goto операторларын қолданатын кодты балама конструкцияларға қарағанда түсіну қиын. Goto белгілі бір қолданыста қалады жалпы пайдалану үлгілері, бірақ балама бар болса, әдетте қолданылады. Оны (шектеулі) пайдалану туралы пікірталас академиялық ортада және бағдарламалық жасақтама индустриясында жалғасуда.

Пайдалану

бару заттаңба

The бару мәлімдеме көбінесе егер мәлімдеме бақылауды шартты түрде беруді тудыруы керек.

Егер жағдай ОНДА бару заттаңба

Бағдарламалау тілдері a мақсатына қатысты әртүрлі шектеулер қояды бару мәлімдеме. Мысалы, C бағдарламалау тілі басқа функцияның құрамындағы затбелгіге секіруге жол бермейді,[2] дегенмен, бір қоңырау тізбегіне секіру мүмкін setjmp / longjmp функциялары.

Сын

ALGOL алдындағы кеңесте 1959 ж Хайнц Земанек GOTO мәлімдемелерінің қажеттілігі туралы күмән тудырды; ол кезде ешкім жоқ[дәйексөз қажет ] оның ескертуіне назар аударды, оның ішінде Эдсгер В. Дейкстра, кейінірек ол GOTO-ның әйгілі қарсыласы болды.[3] 1970-80 жж. GOTO мәлімдемелерін «құрылымдық бағдарламалау " парадигма, Гото сынды «жеңуге болмайтындығына» әкеліп соқтырды спагетти коды «(төменде қараңыз). Кейбіреулер бағдарламалау стилі кодтау стандарттары, мысалы GNU Pascal кодтау стандарттары, GOTO мәлімдемелерін қолдануға кеңес бермейді.[4] The Бохм-Джакопини дәлелі (1966) бағдарламалық жасақтаманы әзірлеу үшін құрылымдалған бағдарламалауды қабылдау туралы мәселені шешкен жоқ, өйткені ішінара құрылысты жақсартудан гөрі бағдарламаны бүркемелеу мүмкін болды, өйткені оны қолдану қосымша жергілікті айнымалыларды енгізуді талап етеді.[5] Алайда бұл компьютерлік ғалымдар, оқытушылар, тіл дизайнерлері мен қолданбалы бағдарламашылар арасында маңызды пікірталас тудырды, олар GOTO-ны бұрын-соңды қолданудан баяу, бірақ тұрақты түрде ауысқанын көрді. GOTO-ның ең танымал сыны 1968 жылы Эдсгер Дайкстраның жазған хаты шығар Мәлімдемеге өтіңіз Зиянды деп саналады.[3][6] Бұл хатта Дайкстра шектеусіз GOTO тұжырымдамаларын жоғары деңгейдегі тілдерден алып тастау керек деп тұжырымдады, өйткені олар бағдарламалардың дұрыстығын (әсіресе, ілмектерді) талдау мен тексеруді қиындатты. Хаттың өзі пікірталас тудырды, оның ішінде «'GOTO зиянды деп саналады' зиянды деп саналады»[7] жіберу Байланысы ACM (CACM) 1987 жылғы наурызда, сондай-ақ басқа адамдардың, соның ішінде Дайкстра жауаптарының Біршама көңіл көншітпейтін хат-хабар туралы.[8]

Балама көзқарас Дональд Кнут Келіңіздер Мәлімдемеге өту арқылы құрылымдалған бағдарламалау, көптеген жалпы бағдарламалау тапсырмаларын талдайды және олардың кейбірінде GOTO оңтайлы болып табылады тілдік құрылым қолдану.[9] Жылы С бағдарламалау тілі, Брайан Керниган және Деннис Ричи ескерту бару «шексіз қолданыста», сонымен қатар оны функцияны аяқтаған кездегі қателер өңдеушілері үшін және циклдардан көп деңгейлі үзілістер үшін қолдануға болатындығын болжайды.[10] Бұл екі заңдылықты басқа авторлардың С кітабынан табуға болады;[11][12][13][14] 2007 ж. кіріспе оқулықта қателермен жұмыс жасау үлгісі «Си тілінде кіріктірілген ерекшеліктерді өңдеудің жетіспеушілігі» бойынша жұмыс істеу әдісі екендігі жазылған.[11] Басқа бағдарламашылар, соның ішінде Linux Ядро дизайнері және кодтаушысы Линус Торвалдс немесе бағдарламалық жасақтама инженері және кітап авторы Стив МакКоннелл, сонымен қатар Дайкстра көзқарасына қарсылық білдіріп, GOTO-лар бағдарламаның жылдамдығын, өлшемін және кодтың анықтығын жақсартады, бірақ салыстырмалы түрде программист ақылға қонымды түрде қолданған кезде ғана пайдалы тілдік мүмкіндік бола алады.[15][16] Информатика профессорының айтуынша Джон Регер, 2013 жылы Linux ядросының кодында 100 000-ға жуық мысалдар болған.[17]

Басқа академиктер шектен тыс көзқараспен қарап, тіпті нұсқауларға ұқсас екенін алға тартты үзіліс және қайту ілмектердің ортасынан жаман тәжірибе, өйткені олар Бохм-Джакопини нәтижелерінде қажет емес және осылайша ілмектердің бір шығу нүктесі болуы керек деп сендірді.[18] Мысалы, Бертран Мейер сияқты өзінің 2009 оқулығында нұсқаулар сияқты жазылған үзіліс және жалғастыру «тек ескі бару қой терісін жамылған ».[19] Böhm-Jacopini нәтижесінің сәл өзгертілген формасы, бірақ циклдардан көп деңгейлі үзілістерге жол берілсе, құрылымдалған бағдарламалауда қосымша айнымалылардан аулақ болуға мүмкіндік береді.[20] C сияқты кейбір тілдер олар арқылы көп деңгейлі үзілістерге жол бермейді үзіліс кілт сөз, кейбір оқулықтар бағдарламалаушыға қолдануға кеңес береді бару осындай жағдайларда.[14] The MISRA C 2004 жылғы стандартты тыйымдар бару, жалғастыру, сонымен қатар бірнеше қайту және үзіліс мәлімдемелер.[21] MISRA C стандартының 2012 жылғы шығарылымы тыйым салуды төмендетті бару «қажет» -тен «кеңес беруші» мәртебесіне; 2012 жылғы шығарылымда тек артқа, бірақ алға секіруге тыйым салатын қосымша, міндетті ереже бар бару.[22][23]

FORTRAN 1978 жылы бағдарламаланған құрылымдық құрылымдар енгізілді, ал кезекті қайта қарау кезінде goto-ның рұқсат етілген қолданысын реттейтін салыстырмалы түрде бос семантикалық ережелер күшейтілді; 1978 жылы тілден әлі де орындалатын DO циклына кіру және шығу үшін бағдарламашы GOTO қолдана алатын «кеңейтілген диапазон»,[24] және 1995 жылға қарай Фортран ГОТО-ның бірнеше түрлері, соның ішінде Есептелген ГОТО және тағайындалған ГОТО жойылды.[25] Сияқты кеңінен қолданылатын кейбір заманауи бағдарламалау тілдері Java және Python GOTO мәлімдемесінің жоқтығы - қараңыз тілдік қолдау - дегенмен көпшілігі таңдаудың кейбір тәсілдерін ұсынады немесе екеуін де ұсынады бұзу тыс немесе қозғалмалы қайталанудың келесі қадамына. Кодтағы басқару ағынын бұзатын көзқарас кейбір бағдарламалау тілдерінің дизайнынан көрінеді, мысалы Ада[26] пайдалану арқылы жапсырма анықтамаларын көрнекі түрде атап көрсетеді бұрыштық жақшалар.

17.10. comp.lang.c жиі қойылатын сұрақтар тізіміндегі жазба[27] GOTO пайдалану мәселесін тікелей қарастырады

Бағдарламалау стилі, жазу стилі сияқты, белгілі бір дәрежеде өнер болып табылады және оны икемсіз ережелермен кодтау мүмкін емес, дегенмен стиль туралы пікірталастар тек осындай ережелер негізінде жүреді. Гото мәлімдемесінде готоны шектеусіз пайдалану тез арада спагетти кодына әкелетіні бұрыннан байқалған. Алайда, goto тұжырымына қарапайым, ойланбаған тыйым міндетті түрде бірден әдемі бағдарламалауға әкелмейді: құрылымдалмаған бағдарламашы кез-келген готоны қолданбай византиялық орамал құра алады (оның орнына таңғажайып циклдар мен бульдік басқару айнымалыларын алмастыратын шығар). . Көптеген бағдарламашылар қалыпты позицияны ұстанады: әдетте готодан аулақ болу керек, бірақ қажет болған жағдайда бірнеше шектеулі жағдайларда қолайлы: көп деңгейлі үзіліс мәлімдемелері ретінде, коммутатордың ішіндегі жалпы әрекеттерді біріктіру немесе тазарту міндеттерін орталықтандыру бірнеше қателіктері бар функция. (...) Белгілі бір конструкциялардан соқыр түрде аулақ болу немесе оларды түсінбей ережелерді сақтау ережелер болдырмағандай көп қиындықтарға әкелуі мүмкін. Сонымен қатар, бағдарламалау стилі туралы көптеген пікірлер тек қана: пікірлер. Оларды қатты дәлелдеуі және қатты сезінуі мүмкін, оларды дәлелді дәлелдер мен дәйектер дәлелдейді, бірақ қарама-қайшы пікірлер дәл сондай қатты сезіліп, қолдау және дәлелдер келтірілуі мүмкін. Әдетте «стилді соғыстарға» апару бекер, өйткені белгілі бір мәселелерде қарсыластар ешқашан келісе алмайтын, келіспейтін немесе келіспеушіліктерді тоқтататын болып көрінбейді.

Жалпы пайдалану үлгілері

Gotos-тің жалпы қолданысы азайып келе жатқанымен, кейбір тілдерде goto бағдарламаның логикасын білдірудің ең қысқа және қарапайым әдісін ұсынатын жағдайлар бар (егер сол логиканы gotosсыз білдіруге болатын болса, баламалы код ұзағырақ болады) және көбінесе түсіну қиын). Басқа тілдерде құрылымдық баламалар бар, атап айтқанда ерекшеліктер мен құйрық қоңыраулар.

Гото жиі пайдалы болатын жағдайларға мыналар жатады:

  • Кодты оқылымды ету және оны орындау оңай болу үшін[28][29]
  • Кішірек бағдарламалар жасау және кодтың қайталануынан құтылу [28][29]
  • Жүзеге асыру ақырғы күйдегі машина, пайдаланып күйдің ауысу кестесі және күйлер арасында ауысу керек (жоқ болған жағдайда) құйрықты шақыруды жою ), әсіресе автоматты түрде жасалған C кодында.[30] Мысалға, канондық LR талдағышында.
  • Көп деңгейлі үзілісті жүзеге асыру және егер тілде тікелей қолдау болмаса, жалғастыру; бұл С-да кездесетін идиома.[14] Java goto кілт сөзін сақтағанымен, іс жүзінде оны жүзеге асырмайды. Оның орнына, Java белгіленген және үзіліссіз жалғасқан сөйлемдерді жүзеге асырады.[31] Java құжаттамасына сәйкес, көп деңгейлі үзілістерге арналған gotos қолданылуы С-дағы gotos-тің ең көп қолданылған (90%) болды.[32] Java бұл тәсілді қабылдаған бірінші тіл емес, ол готоға тыйым салады, бірақ көп деңгейлі үзілістерді ұсынады БЛИС Бағдарламалау тілі (дәлірек айтқанда, оның BLISS-11 нұсқасы) осыған қатысты болды.[33]:960–965
  • Қосымша ілмектерді енгізу басқару ағынына қате әсер етуі мүмкін болған кезде бір деңгейлі үзілістерге немесе жалғастыруға (қайталауға) арналған суррогаттар. Бұл тәжірибе байқалды Netbsd код.[34]
  • Қате өңдеу (ерекшеліктер болмаса), әсіресе ресурстарды бөлу сияқты тазарту коды.[11][14][34][30][35] C ++ осы жағдай үшін goto операторына балама ұсынады, ол: Ресурстарды сатып алу инициализация болып табылады (RAII) деструкторларды пайдалану немесе қолданылған ерекшеліктерді пайдалану арқылы Ерекше жағдайларды өңдеу.[36] setjmp және longjmp - бұл басқа альтернатива, және оның бөлігін ашуға болатын артықшылығы бар шақыру стегі.
  • стаканы орналастыру, мысалы, Algol, PL / I.

Бұл қолданыстар С тілінде салыстырмалы түрде жиі кездеседі, бірақ C ++ немесе басқа деңгейлі ерекшеліктері бар басқа тілдерде аз кездеседі.[35] Алайда, функцияның ішіндегі ерекшелікті лақтыру және ұстау кейбір тілдерде әдеттен тыс тиімсіз болуы мүмкін; ең жақсы мысал Мақсат-С, мұнда гото - әлдеқайда жылдам балама.[37]

Гото операторларының тағы бір қолданысы - нашар фактураланған модификациялау ескі код, мұнда готодан аулақ болу кең ауқымды қажет етеді қайта өңдеу немесе кодтың қайталануы. Мысалы, белгілі бір код қана қызығушылық тудыратын үлкен функция берілген, goto операторы функцияны басқаша өзгертпестен тек тиісті кодқа өтуге немесе одан өтуге мүмкіндік береді. Бұл қолдану қарастырылады код иісі, бірақ кездейсоқ қолдануды табады.

Балама нұсқалар

Құрылымдық бағдарламалау

Туралы қазіргі заманғы түсінік ішкі программа ойлап тапқан Дэвид Уилер бағдарламалау кезінде EDSAC.[38] Қоңырауды жүзеге асыру және машинасыз стекке оралу үшін ол Wheeler секіру деп аталатын өзін-өзі өзгертетін кодтың арнайы үлгісін қолданды.[39] Нәтижесінде кітапханадан алынған әдеттегі процедураларды жақсы орындау арқылы бағдарламаларды құру мүмкіндігі пайда болды. Бұл тек пайдалану арқылы мүмкін болмас еді бару, кітапханадан алынған мақсатты код қайда секіру керектігін білмейді.

Кейінірек жоғары деңгейдегі тілдер сияқты Паскаль қолдаудың айналасында жасалған құрылымдық бағдарламалау, бастап жалпыланған ішкі бағдарламалар (процедуралар немесе функциялар деп те аталады) әрі қарай басқару құрылымдары сияқты:

Бұл жаңа тілдік механизмдер бұрын қолданылған баламалы ағындарды алмастырды баруs және егерс. Көп бағытты тармақталу «есептелген готоны» ауыстырады, онда секіру нұсқауы динамикалық түрде анықталады (шартты түрде).

Ерекшеліктер

Іс жүзінде құрылымдық бағдарламалаудың негізгі үш құрылымды шаблонын қатаң сақтау құрылымдалған блоктан мерзімінен бұрын шыға алмауына байланысты жоғары кірістірілген кодты береді, және комбинаторлық жарылыс барлық ықтимал шарттарды өңдеуге арналған өте күрделі бағдарлама күйінің деректерімен.

Әдетте екі шешім қабылданды: құрылымдық бөлімшеден мерзімінен бұрын шығу тәсілі және жалпы ерекшеліктер - екі жағдайда да жоғары құрылым, блокты немесе функцияларды басқаруға қайтарады, бірақ ерікті код орындарына секірмейді. Бұлар терминалды емес жағдайда қайтару операторының қолданылуымен ұқсас - қатаң құрылымданбаған, себебі ерте шығу, бірақ құрылымдалған бағдарламалаудың қатаңдықтарының жұмсақ релаксациясы. С, үзіліс және жалғастыру рұқсат етіңіз циклды тоқтату немесе келесі қайталануды жалғастырыңыз, қосымша талап етпестен уақыт немесе егер мәлімдеме. Кейбір тілдерде көп деңгейлі үзілістер де мүмкін. Ерекше жағдайларды шешу үшін, мамандандырылған ерекше жағдайларды өңдеу сияқты құрылымдар қосылды тырысу/аулау/ақыры Java-да.

Ерекшеліктерді өңдеу тетіктерін де мөлдір емес басқару құрылымдарын құру үшін оңай пайдалануға болады, мысалы, goto-ны пайдалану мүмкін емес.[40]

Қоңырау

1977 жылы Сиэтлдегі ACM конференциясына жіберілген мақалада, Гай Л. Стил GOTO және құрылымдық бағдарламалау туралы пікірталастарды қорытындылады және процедураның артқы жағындағы процедураларды басқаруды шақырылған процедураға тікелей беру ретінде оңтайлы деп санауға болатындығын байқады, әдетте стек манипуляциясының қажетсіз әрекеттерін жояды.[41] Мұндай «құйрық қоңыраулар» өте жиі кездесетіндіктен Лисп, процедуралық қоңыраулар барлық жерде қолданылатын тіл, бұл оңтайландыру формасы басқа тілдерде қолданылатын GOTO-мен салыстырғанда процедуралық шақырудың құнын едәуір төмендетеді. Стил процедуралық қоңыраулардың нашар орындалуы GOTO процедуралық шақырумен салыстырғанда арзан деген жасанды түсінікке әкелді деп сендірді. Стил бұдан әрі «жалпы процедурада қоңыраулар GOTO операторлары ретінде қарастырылуы мүмкін, олар да параметрлерді қабылдайды және біркелкі кодталуы мүмкін» деп тұжырымдады. машина коды JUMP нұсқаулары «машиналық код стегімен жұмыс жасау нұсқауларымен» оңтайландыруды қарастырды (керісінше емес!) «.[41] Стил Лисптегі оңтайландырылған сандық алгоритмдердің сол кездегі коммерциялық Fortran компиляторлары жасаған кодқа қарағанда жылдамырақ орындай алатындығына дәлел келтірді, өйткені Лиспта процедуралық қоңырау құны әлдеқайда төмен болды. Жылы Схема, бірге Стил жасаған Лисп диалектісі Джералд Джей Сусман, құйрықты шақыруды оңтайландыру міндетті болып табылады.[42]

Стилдің мақаласы информатика үшін көп жаңалық енгізбесе де, ең болмағанда MIT-да тәжірибе жүзінде қолданғанымен, процедураларды оңтайландыру кеңістігін ашты, бұл процедуралардың модульдікке ықпал ететін қасиеттерін компьютердің баламасына айналдырды. содан кейін күрделі ішкі бақылау құрылымдары мен ауқымды мемлекеттік деректері бар үлкен монолитті процедураларды кодтау әдеттері. Атап айтқанда, Steele талқылайтын құйрықты шақыруды оңтайландыру процедураны жалғыз арқылы қайталануды жүзеге асырудың сенімді әдісіне айналдырды құйрық рекурсиясы (сол функцияны шақыратын құйрықты рекурсия). Одан әрі, құйрықты шақыруды оңтайландыру мүмкіндік береді өзара рекурсия құйрық қоңырауларын ескере отырып, шексіз тереңдікте - бұл басқаруды беруге мүмкіндік береді ақырғы күйдегі машиналар, бұл, әдетте, goto операторларымен орындалады.

Короутиндер

Короутиндер бұл бірнеше шығу нүктелерін ғана емес, сонымен қатар goto операторларына ұқсас бірнеше кіру нүктелерін де құруға мүмкіндік беретін құрылымдық бағдарламалаудың радикалды релаксациясы. Горотаға гороға қарағанда шектеулер бар, өйткені олар мүмкін түйіндеме кодтағы ерікті нүктеге секіруден гөрі, берілген нүктелерде жұмыс істеп тұрған коруотин - кірістіліктен кейін жалғасу. Коруотиндердің шектеулі түрі болып табылады генераторлар, кейбір мақсаттар үшін жеткілікті. Одан да шектеулі жабылу - күйді сақтайтын ішкі бағдарламалар (арқылы) статикалық айнымалылар ), бірақ орындалу жағдайы емес. Күйдің айнымалылары мен құрылымдық басқарудың тіркесімі, атап айтқанда коммутатордың жалпы мәлімдемесі, ішкі бағдарламаға келесі қоңыраулардың ерікті нүктесінде орындалуын қалпына келтіруге мүмкіндік береді және коротиндер болмаған жағдайда, goto операторларына құрылымдық балама болып табылады; бұл, мысалы, С-де кездесетін идиома.

Жалғасы

A жалғасы GOTO-ға ұқсас, өйткені басқаруды бағдарламадағы ерікті нүктеден бұрын белгіленген нүктеге ауыстырады. Жалғасы оны қолдайтын тілдерде GOTO-ға қарағанда икемді, өйткені ол басқару функциясын қолданыстағы функциядан ауыстыра алады, ал GOTO көптеген құрылымдық бағдарламалау тілдерінде орындай алмайды. Жергілікті айнымалылар мен функциялардың аргументтерін сақтауға арналған стек шеңберлерін қолдайтын тілдік қосымшаларда жалғасын орындау бағдарламаның күйін келтіреді шақыру стегі секіруден басқа. The longjmp функциясы C бағдарламалау тілі қазіргі контексттен қоршағанға өту үшін қолданылуы мүмкін қашудың жалғасының мысалы. The Жалпы Лисп GO операторында конструкция болғанына қарамастан, бұл стектерді босату қасиеті бар лексикалық ауқымы бар, секірілетін белгіге а сілтемесін жасауға болатындықтан жабу.

Жылы Схема, егер қаласаңыз, жалғасулар басқаруды сыртқы контексттен ішкі жағдайға ауыстыра алады. Осыдан кейін қандай кодтың орындалатындығына шексіз бақылау коруотиндер және ынтымақтастықтың көп тапсырмасы сияқты күрделі басқару құрылымдарын жазуды салыстырмалы түрде жеңілдетеді.[43]

Хабарлама жіберілді

Процедуралық емес парадигмаларда гото онша маңызды емес немесе мүлдем жоқ. Негізгі баламалардың бірі болып табылады хабарлама жіберу, бұл ерекше маңызды бір уақытта есептеу, процессаралық байланыс, және объектіге бағытталған бағдарламалау. Бұл жағдайларда жекелеген компоненттерде басқарудың ерікті берілуі болмайды, бірақ жалпы бақылау күрделі тәсілдермен жоспарлануы мүмкін, мысалы алдын-ала ескерту. Ықпалды тілдер Симула және Smalltalk хабарламалар мен объектілер ұғымдарын алғашқылардың бірі болып енгізді. Авторы инкапсуляциялық мемлекеттік деректер, объектіге бағытталған бағдарламалау объектілер арасындағы өзара әрекеттесуге (хабарламаларға) бағдарламалық жасақтаманың күрделілігін төмендету.

Вариациялар

Класы бойынша бірқатар әртүрлі тілдік құрылымдар бар бару мәлімдемелер.

Есептелген GOTO және GOTO тағайындалды

Жылы Фортран, а есептелген БАРУ өрнектің мәніне негізделген тізімдегі бірнеше белгілердің біріне секіреді. Мысалы goto (20,30,40) i. C-дегі эквивалентті құрылым - бұл ауысу мәлімдемесі және жаңа Фортран а ІС мәлімдеме синтаксистік балама болып табылады.[44] НЕГІЗГІ бар ҚОСУЛЫ ... ГОТО сол мақсатқа жететін құрылыс.[45]

Fortran 95 дейінгі нұсқаларында Fortran-да an тағайындалды басқару элементін бүтін айнымалыда сақталған (тағайындалған) мәлімдеме жапсырмасына (жол нөміріне) беретін нұсқа. Тағайындалмаған бүтін айнымалыға өту, өкінішке орай мүмкін болды және тағайындалған готосқа қатысты қателердің негізгі көзі болды.[46] Фортран тағайындау оператор тек бүтін айнымалыға тұрақты (бар) жол нөмірін тағайындауға мүмкіндік береді. Алайда кейіннен бұл айнымалыны кездейсоқ бүтін сан ретінде қарастыру мүмкін болды, мысалы, оны көбейтіп, нәтижесінде анықталмаған мінез-құлыққа әкелді бару уақыт. Келесі код мен и қашан сызық мен анықталмаған:[47]

    тағайындау 200 дейін мен    мен = мен+1    бару мен ! анықталмаған мінез-құлық200 жазу(*,*) «бұл дұрыс жол нөмірі»

Бірнеше C компиляторлары бастапқыда енгізілген gotos-қа қатысты екі стандартты емес C / C ++ кеңейтімдерін жүзеге асырады gcc.[48][49] GNU кеңейтімі ағымдағы функцияның ішіндегі белгінің адресін а түрінде алуға мүмкіндік береді жарамсыз * унарлы, префиксті қолдану жапсырма мәні операторы &&. Goto нұсқауы ерікті секіруге мүмкіндік беретін кеңейтіледі жарамсыз * өрнек. Бұл С кеңейтімі а деп аталады есептелген гото оны қолдайтын С компиляторларының құжаттамасында; оның семантикасы Фортранның тағайындалған гетоның суперсеті болып табылады, өйткені ол мақсатты сілтеме өрнектерін goto нысаны ретінде береді, ал Fortran тағайындалған гото секіру нысаны ретінде еркін өрнектерге жол бермейді.[50] С-тегі стандартты goto сияқты, GNU C кеңейтілуі есептелген goto-ның мақсатына тек ағымдағы функцияда орналасуға мүмкіндік береді. Ағымдағы функциядан тыс секіруге тырысу анықталмаған әрекетке әкеледі.[50]

BASIC-тің кейбір нұсқалары GNU C-да қолданылатын, яғни мақсатты болуы мүмкін GOTO-ны қолдайды. кез келген жол нөмірі, тізімнен бір емес. Мысалы, in МТС BASIC жазуы мүмкін GOTO i * 1000 айнымалының мәнінен 1000 есе көп жолға өту мен (мысалы, таңдалған мәзір параметрін көрсетуі мүмкін).[51]

PL / I айнымалы белгілер есептелген немесе тағайындалған әсерге қол жеткізу БАРУс.

АЛТЕР

1985 ANSI дейін COBOL стандартта ALTER етістігі болған, ол абзацта болуы керек GO TO баратын жерді өзгерту үшін қолданыла алады.[52] Мүмкіндік полиморфизм, жиі айыпталып, сирек қолданылған.[53]

Перл ГОТО

Жылы Перл, нұсқасы бар бару бұл дәстүрлі GOTO мәлімдемесі емес мәлімдеме. Ол функция атауын алады және басқару функциясын бір функционалдық шақыруды басқасына тиімді ауыстыру арқылы береді (а қоңырау ): жаңа функция GOTO-ға оралмайды, оның орнына бастапқы функция шақырылған жерге келеді.[54]

GOTO-ға еліктеу

Әдепкі бойынша GOTO-ны қолдамайтын бірнеше бағдарламалау тілдері бар. GOTO эмуляциясын қолдану арқылы GOTO-ны осы бағдарламалау тілдерінде кейбір шектеулермен болса да қолдануға болады. Java-да GOTO-ны еліктеуге болады,[55] JavaScript,[56] және Python.[57][58]

PL / I белгісінің айнымалылары

PL / I деректер типіне ие ЗАТТАҢБА, ол «тағайындалған готоны» және «есептелген готоны» жүзеге асыру үшін қолданыла алады. PL / I филиалдарға ағымдық блоктан шығуға мүмкіндік береді. Шақыру процедурасы белгіні шақырылған процедураның аргументі ретінде бере алады, содан кейін филиалмен бірге шығады. Жапсырманың айнымалы мәніне стек жақтауының адресі кіреді, ал блоктан шығу стекті шығарады.

 / * Бұл * / / * тағайындалған goto * / баламасының қайда екенін білдіреді; Мұндағы = бір жерде; қайда; ... бір жерде: / * мәлімдеме * /; ...
 / * Бұл * / / * есептелген goto * / баламасының баламасын жүзеге асырады, онда (5) жапсырма; inx тіркелгенін жариялау; Мұндағы (1) = abc; Мұндағы (2) = xyz; ... goto қайда (inx); ... abc: / * мәлімдеме * /; ... xyz: / * мәлімдеме * /; ...

MS / DOS GOTO

Goto орындалуын қос нүктеден басталатын белгіге бағыттайды, ал Goto мақсаты айнымалы болуы мүмкін.

@жаңғырық өшіруліОРНАТУ D8str=% күн%ОРНАТУ D8dow=% D8str: ~ 0,3%ҮШІН %%Д. жылы (Дс Ср Жм) істеу егер "%%D « == "% D8dow%" бару ДҮКЕН%% Dжаңғырық Бүгін, % D8dow%, сауда күні емес.бару Соңы:ДҮКЕНжаңғырық түскі асқа пицца сатып алыңыз - дүйсенбі - пицца күні.бару Соңы:SHOPWedжаңғырық үйге алып кету үшін Calzone сатып алыңыз - бүгін сәрсенбі.бару Соңы:SHOPFriжаңғырық біреу нөлдік калориялы сусын алғысы келсе, Seltzer сатып алыңыз.:Соңы

Тілдерді қолдау

Көптеген тілдер қолдайды бару мәлімдеме, ал көпшілігі жоқ. Жылы Java, бару Бұл сақталған сөз, бірақ қолданылмайды, дегенмен жинақталған file.class GOTOs және LABELs жасайды.[59][60] Python-да goto үшін қолдау жоқ, дегенмен оны беретін бірнеше әзіл-қалжың модульдері бар.[57][58] Кіру туралы ешқандай мәлімдеме жоқ 7. Тұқым және үзіліс пен жалғасулар сияқты жасырын готалар да алынып тасталады.[61] Жылы PHP жергілікті қолдау болған жоқ бару 5.3 нұсқасына дейін (кітапханалар оның функционалдығын еліктеуге қол жетімді болды).[62]

The C # бағдарламалау тілі бар бару. Алайда, ол қазіргі таңбадан тыс затбелгіге секіруге мүмкіндік бермейді, сондықтан оны айтарлықтай аз қуатты және қауіпті етеді бару басқа бағдарламалау тілдеріндегі кілт сөз. Ол сондай-ақ жасайды іс және әдепкі қолдану аймағы болып табылатын мәлімдемелер жапсырмалары ауысу мәлімдемесі; іс бар немесе әдепкі көбінесе C # рұқсат етпейтін жасырын құлдыраудың айқын ауыстыруы ретінде қолданылады.

Басқа тілдерде нақты құлдырау үшін жеке кілт сөздері болуы мүмкін, оны нұсқасы деп санауға болады бару осы нақты мақсатпен шектелген. Мысалы, Go қолданбасын қолданады құлау Перл 5 қолданады, ал кілт сөз және жасырын құлдырауға мүлдем жол бермейді Келесі әдепкі бойынша анық құлдырау үшін, сонымен қатар модуль үшін әдепкі тәртіп ретінде айқын емес құлдырауды орнатуға мүмкіндік береді.

Гото сөйлемдері бар тілдердің көпшілігі оны осылай атайды, бірақ есептеудің алғашқы кезеңінде басқа атаулар қолданылды. Мысалы, in MAD TRANSFER TO операторы қолданылды.[63] APL оңға бағытталған көрсеткіні қолданады, Гото үшін.

C goto бар, және ол жоғарыда қарастырылғандай әр түрлі фразеологизмдерде қолданылады.

Бар бару функциясы Перл сонымен қатар.

Схема сияқты функционалды бағдарламалау тілдерінде, әдетте, жалғасуды қолданудың қажеті жоқ.

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ Дэвид Энтони Уотт; Уильям Финдлей (2004). Бағдарламалау тілдік дизайн тұжырымдамалары. Джон Вили және ұлдары. б.228. ISBN  978-0-470-85320-7.
  2. ^ «Жаңа С стандарты: 6.8.6.1». c0x.coding-guidelines.com.
  3. ^ а б Dijkstra 1968 ж.
  4. ^ «GNU Паскаль кодтау стандарттары». www.gnu-pascal.de.
  5. ^ Кеннет Луден, Ламберт (2011). Бағдарламалау тілдері: принциптері мен практикасы. Cengage Learning. б.422. ISBN  978-1-111-52941-3.
  6. ^ «EWD 215: GO TO тұжырымына қарсы іс» (PDF).
  7. ^ Фрэнк Рубин (1987 ж. Наурыз). ""ГОТО «зиянды деп саналады» (PDF). ACM байланысы. 30 (3): 195–196. дои:10.1145/214748.315722. Архивтелген түпнұсқа (PDF) 2009-03-20.
  8. ^ Дейкстра, Эдсгер В. Біршама көңіл көншітпейтін хат-хабар туралы (EWD-1009) (PDF). Diwkstra архиві. Америка тарихы орталығы, Остиндегі Техас университеті. (транскрипция ) (Мамыр, 1987)
  9. ^ Дональд Кнут (1974). «Мәлімдемеге өту арқылы құрылымдалған бағдарламалау» (PDF). Есептеу сауалнамалары. 6 (4): 261–301. CiteSeerX  10.1.1.103.6084. дои:10.1145/356635.356640.
  10. ^ Брайан В.Керниган; Деннис Ричи (1988). C Бағдарламалау тілі (2-ші басылым). Prentice Hall. бет.60–61. ISBN  978-0-13-308621-8.
  11. ^ а б c Майкл А. Вайн (2007). C Абсолютті бастаушыға арналған бағдарламалау. Cengage Learning. б. 262. ISBN  978-1-59863-634-5.
  12. ^ Сандра Гейзлер (2011). C Думиндерге арналған «барлығы-біреуінде» жұмыс үстелінің анықтамасы. Джон Вили және ұлдары. 217–220 бб. ISBN  978-1-118-05424-6.
  13. ^ Стивен Прата (2013). C Primer Plus. Аддисон-Уэсли. 287–289 бет. ISBN  978-0-13-343238-1.
  14. ^ а б c г. Сартадж Сахни; Роберт Ф. Смелик; Боб Смелик (1995). Бағдарламалық жасақтаманы C-де дамыту. Silicon Press. б. 135. ISBN  978-0-929306-16-2.
  15. ^ «Мұрағатталған көшірме». Архивтелген түпнұсқа 2010-02-14. Алынған 2010-01-30.CS1 maint: тақырып ретінде мұрағатталған көшірме (сілтеме)
  16. ^ «Код толық, бірінші басылым». Stevemcconnell.com. Алынған 2014-07-22.
  17. ^ «Goto-ны академиялық жүйеге енгізілген жүйелік кодта қолдану». blog.regehr.org.
  18. ^ Робертс, Э. [1995] “Циклдан шығу және құрылымдық бағдарламалау: Пікірсайысты қайта құру”, ACM SIGCSE бюллетені, (27) 1: 268–272.
  19. ^ Бертран Мейер (2009). Сабақтың сенсоры: нысандармен және келісімшарттармен жақсы бағдарламалауды үйрену. Springer Science & Business Media. б. 189. ISBN  978-3-540-92144-8.
  20. ^ Декстер Козен және Wei-Lung Дастин Ценг (2008). Бохм-Джакопини теоремасы болжам бойынша жалған (PDF). Mpc 2008. Информатика пәнінен дәрістер. 5133. 177–192 бб. CiteSeerX  10.1.1.218.9241. дои:10.1007/978-3-540-70594-9_11. ISBN  978-3-540-70593-2.
  21. ^ «Неліктен» жалғастыру «MISRA C: 2004-те С ережелерін бұзу ретінде қарастырылады?». Stack overflow. 2012-06-11. Алынған 2014-07-22.
  22. ^ Марк Питчфорд; Крис Тапп (2013-02-25). «MISRA C: 2012: өзгертуге көптеген жақсы себептер». Электрондық дизайн. Алынған 2014-07-22.
  23. ^ Том Уильямс (наурыз 2013). «C ережелерін тексеру: сенімділік пен қауіпсіздікті қамтамасыз ету». RTC журналы. Алынған 2014-07-22.
  24. ^ ANSI X3.9-1978. Американдық ұлттық стандарт - FORTRAN бағдарламалау тілі. Американдық ұлттық стандарттар институты. Сондай-ақ ISO 1539-1980 ретінде белгілі, ресми емес түрде FORTRAN 77 ретінде белгілі
  25. ^ ISO / IEC 1539-1: 1997. Ақпараттық технологиялар - Бағдарламалау тілдері - Fortran - 1 бөлім: Негізгі тіл. Бейресми түрде Fortran 95 деп аталады. Осы стандарттың тағы екі бөлігі бар. 1 бөлімді ресми түрде ANSI қабылдады.
  26. ^ Джон Барнс (2006-06-30). Ada 2005 бағдарламалау. Аддисон Уэсли. б. 114–115. ISBN  978-0-321-34078-8.
  27. ^ «17.10 сұрақ». C-faq.com. Алынған 2014-07-22.
  28. ^ а б «Linux: ядро ​​кодын пайдалану». 28 қараша 2005. мұрағатталған түпнұсқа 2005 жылғы 28 қарашада.
  29. ^ а б https://www.kernel.org/doc/Documentation/CodingStyle
  30. ^ а б Готоны жақсы пайдалану, Саймон Козенс
  31. ^ «Тармақталған мәлімдемелер (Java ™ оқулықтары> Java тілін үйрену> тіл негіздері)». Docs.oracle.com. 2012-02-28. Алынған 2014-07-22.
  32. ^ «Java тілдік орта». Oracle.com. Алынған 2014-07-22.
  33. ^ Брендер, Рональд Ф. (2002). «BLISS бағдарламалау тілі: тарих» (PDF). Бағдарламалық жасақтама: тәжірибе және тәжірибе. 32 (10): 955–981. дои:10.1002 / спе.470.
  34. ^ а б Диомидис Спинеллис (2003 ж. 27 мамыр). Кодты оқу: ашық қайнар көз. Аддисон-Уэсли. 43-44 бет. ISBN  978-0-672-33370-5.
  35. ^ а б C-де бағдарламалау кезінде Goto-ны қашан қолдану керек, Алекс Аллен
  36. ^ «1-ші күн - Bjarne Stroustrup: C ++ 11 Style | GoingNative 2012 | 9-канал». Channel9.msdn.com. 2012-02-02. Алынған 2014-07-22.
  37. ^ Дэвид Чисналл (2012). Objective-C сөйлемшесі. Аддисон-Уэсли. б.249. ISBN  978-0-321-81375-6.
  38. ^ «Дэвид Дж. Уилер • IEEE компьютерлік қоғамы». www.computer.org.
  39. ^ Уилкс, М.В .; Уилер, Д. Дж .; Гилл, С. (1951). Электрондық сандық компьютерге бағдарламалар дайындау. Аддисон-Уэсли.
  40. ^ Дж.Сидерслебен (2006). «Қателіктер мен ерекшеліктер - құқықтар мен міндеттер». Кристоф Дониде (ред.) Ерекше жағдайларды өңдеу әдістерінің жетілдірілген тақырыптары. Springer Science & Business Media. б.277. ISBN  978-3-540-37443-5.
  41. ^ а б Гай Льюис Стил, кіші. «Қымбат процедураларды шақыру» туралы аңызды бұзу немесе зиянды деп саналатын процедураларды жүзеге асыру, немесе, Lambda: The Ultimate GOTO «. MIT AI зертханасы. AI-зертханалық ескертпе AIM-443. Қазан 1977.
  42. ^ R5RS сек. 3.5, Ричард Келси; Уильям Клингер; Джонатан Рис; т.б. (Тамыз 1998). «Қайта қаралды5 Алгоритмдік тіл схемасы туралы есеп ». Жоғары ретті және символдық есептеу. 3 (1): 7–105. дои:10.1023 / A: 1010051815785.
  43. ^ «Алгоритмдік тіл схемасы бойынша қайта қаралған ^ 5 есеп». schemers.org.
  44. ^ «GOTO есептелген мәлімдемесі (ескірген)». Lahey.com. Архивтелген түпнұсқа 2016-05-26. Алынған 2014-07-22.
  45. ^ «Microsoft QuickBASIC: ON ... GOSUB, ON ... GOTO Statements QuickSCREEN». Microsoft. 1988. Алынған 2008-07-03.
  46. ^ http://www.personal.psu.edu/jhm/f90/statements/goto_a.html
  47. ^ «ASSIGN - белгіні тағайындау». Software.intel.com. Алынған 2014-07-22.
  48. ^ Есептелген гото, IBM XL C / C ++ компиляторы
  49. ^ «Intel® Composer XE 2013 SP1 компиляторларының түзетулер тізімі | Intel® Developer Zone». Software.intel.com. 2013-08-12. Алынған 2014-07-22.
  50. ^ а б «Белгілер құндылық ретінде - GNU Compiler Collection (GCC) пайдалану» «. Gcc.gnu.org. Алынған 2014-07-22.
  51. ^ Мичиган Университетінің есептеу орталығы (қыркүйек 1974). МТС, Мичиган терминалы жүйесі. UM кітапханалары. б. 226. UOM: 39015034770076.
  52. ^ HP COBOL II / XL анықтамалық нұсқаулығы, «ALTER тұжырымы 1985 жылғы ANSI COBOLstandard стандартының ескірген ерекшелігі болып табылады.»
  53. ^ Ван Тассель, Денни (2004 ж. 8 шілде). «Бағдарламалау тілдеріндегі белгілер тарихы». Алынған 4 қаңтар 2011.
  54. ^ Бару, perl.syn (Perl синтаксисі) нұсқаулығынан
  55. ^ «GOTO for Java». стик. 6 шілде 2009. мұрағатталған түпнұсқа 2012 жылғы 15 маусымда. Алынған 28 сәуір, 2012.
  56. ^ Секстон, Алекс. «Гото жазы | Goto.js ресми үйі». Алынған 28 сәуір, 2012.
  57. ^ а б Хиндл, Ричи (1 сәуір, 2004). «Gyto for Python». Entrian Solutions. Хертфорд, Ұлыбритания: Entrian Solutions Ltd.. Алынған 28 сәуір, 2012. 'Goto' модулі 2004 жылдың 1 сәуірінде жарияланған сәуірдің әзілі болды. Ия, ол жұмыс істейді, бірақ бәрібір бұл әзіл. Өтінемін, оны нақты кодта қолданбаңыз!
  58. ^ а б снак (19.09.2015). «snoack / python-goto: Python-да goto мүмкіндігін қосу үшін байт-кодты қайта жазатын функционалды декор». Алынған 24 ақпан, 2017.
  59. ^ «Java тілінің ерекшелігі, үшінші басылым». Const және goto кілт сөздері қазіргі уақытта қолданылмаса да, сақталған. Бұл Java компиляторына қателік туралы жақсы хабарламалар шығаруға мүмкіндік беруі мүмкін, егер бұл C ++ кілт сөздері бағдарламаларда қате пайда болса.
  60. ^ «Java тілінің ерекшелігі, үшінші басылым». C және C ++ тілдерінен айырмашылығы, Java бағдарламалау тілінде goto операторы жоқ; идентификатор мәлімдемесінің белгілері белгіленген (§14.15) немесе жалғасқан (§14.16) сөйлемдердің кез келген жерінде пайда болған мәлімдемелерде қолданылады.
  61. ^ «Seed7 нұсқаулығы». Томас Мертес. Алынған 2019-09-19.
  62. ^ «goto - нұсқаулық». PHP. Алынған 2014-07-22.
  63. ^ Бернард А. Галлер, Компьютерлер тілі, Мичиган университеті, МакГрав-Хилл, 1962; 26-28, 197, 211 беттер.