Наредба повратка

У програмирању, наредба повратка изазива извршавање да напусти тренутну подрутину и да настави у тренутку кода одмах онде где је подрутина позвана, позната као повратна адреса. Повратна адреса је сачувана обично на позивној гомили процеса, као део операције прављења подрутинског позива. Наредбе повратка у многим језицима дозвољавају функцији да прецизира повратну вредност како би се проследила назад до кода који је позвао функцију.

ПрегледУреди

У C/C++, return exp; (где exp је експресија) је наредба која говори функцији да врати извршење програма за позив функције, и пријављује вредност одexp. Ако функција има враћени тип празан, наредба повратка се може користити без вредности, у којем случају програм прекида са радом тренутне функције и враћа позвану.

У Паскалу не постоји наредба повратка. Подрутина се аутоматски враћа када извршење достигне своје последње извршено стање. Вредности могу бити враћени идентификатори који има исто име као подрутина, функција у Паскаловој терминологији. На овај начин идентификатор функције се користи за рекурзивне позиве и као држач резултата; ово је синтаксно слично експлицитном спољашњем параметру. Иста синтакса се користила у Фортрану 66 и Фортрану 77. У неким другим језицима варијабла дефинисана преко корисника се користи уместо идентификатора функције.

Oberon (Oberon-07) има израз повратка уместо наредбе повратка. Враћени израз је смештен после послење наредбе тела процедуре. Ово омогућује проверавање времена правилног враћања и враћања вредности процедуре.

Неки експресионо-оријентисани програмски језици као што је Lisp, Перл и Руби, дозвољавају програмеру да изостави експлицитну наредбу повратка, наводећи уместо тога  да  је последњапроцењена експресија повратна вредност подрутине.  

У другим случајевима празна вредност је враћена ако не постоји експлицитна наредба повратка : у Пајтону, вредностNone се враћа када је наредба повратка изостављена, док у Јаваскрипти вредност i undefined је враћено.

У Windows PowerShell све процењене експресија које нису ухваћене (нпр., приписан варијабли, бачен у празнину или завезан за нулу)су враћени из подрутине као елементи у низу, или као један објекат у случају да је само један објекат ухваћен

У Перлу, враћена вредност или вредности подрутине могу зависити од контекста у коме је позвана. Најфундаменталније истребљење је скаларни контекст где позвани код очекује једну вредност, листа контекста где позвани код очекује листу вредности и контекст празнине где позивани код неочекује било коју повратну врадност. Подрутина може проверити контекст користећиwantarray функцију. Специјалнни синтаксни повратак без аргумената се користи да врати недефинисану вредност у контексту скалара и празну лису у контексту листе. Скаларни контекст даље може бити подељен у булов тип података, број, стринг и различити типови референце контекста. Такође, контекстно-сензитиван објекат може бити враћен коришћењем контекстуалне повратне секвенце, са лењом проценом скаларних вредности.

Вредности враћене од стране програма када се он заврши су обично ухваћене преко серијских програма .

СинтаксаУреди

Наредбе повратка долазе у многим облицима. Следеће синтаксе су најчешће:

Jezik Povratna

naredba

Ako je vrednost izostavljena, Vrati
Ада, Баш,[1] C, C++, Јава, PHP, C#, Јаваскрипт, D
return value;
у Башу, излазна вредност последње извршене команде у функцији

уC[2] иC++,[3] недефинисано понашање ако функција враћа вредност

у PHP,[4] враћа NULL

у Јаваскрипти,[5] враћа вредност undefined

и Јави и C#, није дозвољено ако функција враћа вредност

Бејсик
RETURN
Lisp
(return value)
последња вредност наредбе
Перл, Руби
return @values;
return $value;
return;

или контексна повратна секвенца

последња вредност наредбе
Пајтон
return value
None
Smalltalk
^ value
Visual Basic .NET
Return value
Windows PowerShell
return value;
објекат
x86 асебмлер
ret
садржај eax регистра (по обичају)

У језицима асемблера , на пример за MOS Технологију 6502, мнемоника "RTS"(Повратак из Подрутине) је коришћено. 

Вишеструке повратне информацијеУреди

Језици са експлицитном повратном наредбом стварају могућност вишеструких повратних наредби у истој функцији. Без обзира да ли је то добра ствар она је контроверзна.

Јаки следбеници структурног програмирања осигуравају да свака функција има један улаз и један излаз (SESE). Он је на тај начин тврдио[6] да треба избегавати коришћење експлицитне повратне наредбе осим код текстуалног краја подрутине, разматрајући то, када се користи "да врати раније", може да пати од исте врсте проблема који излазе за GOTO наредбу. Насупрот томе, може се расправљати да је коришћење повратне наредбе корисно када је алтернатива компликованији код, као што је дубоко гнездо, повређивање читања.

У његовој свесци из 2004, Давид Ват пише "један-улаз више-излаза контроле протока су често пожељне". Коришћењем Тенетовог framework-а појма секвенцера, Ват равномерно описује конструкције контроле протока нађене у савременим програмским језицима и покушава да објасни зашто неки типови секвенсера су бољи од других у контексту више-илзазних контрола протока. Ват пише да су недозвољене goto наредбе (скочни секвенцери) лоше зато што дестинација скока није објашњива сама по себи читаоцу програма све док читалац не нађе и тестира стварну ознаку или адресу која је мета скока. У супротном, Ват описује да је концептуална намера повратка секвенцера чиста из њеног контекста, без потребе да се поврати њена дестинација. Даље, Ват пише да класа секвенцера позната као секвенце бега, дефинисане као "секвенцер који раскида извршавање текстуално прихваћене команде или процедуре , обухвата и прекид петљи (укључујући прекиде вишег-нивоа) и повратне наредбе. Ват такође назначава да while секвенцер скока (goto) је некако ограничен у језицима као што је С, где мета мора бити унутар локалног блока или обухваћеног излазног блока, само ограничење није довољно да уради наредбу goto у С самопишућем и тако да могу идаље да праве "шпагети код". Ват такође испитује како се секвенцери изузетака разликују од бега и скока секвенцера; за детаље за ово видети у артиклу структурно програмирање. [7]

Према емпиријским студијама написаним од Ерика С. Робертса, студенти програмери имали су потешкоће формулирсања тачних решења за неколико једноставних проблема у језику као што је Паскал, који не дозвољава више излазних тачака. За проблем писања функције линеарног претраживања елемента у реду, студија из 1980 Хенрија Сапира (навео Роберт) је открила да коришћењем Паскалом пружених контрола структура, тачно решење је дато само од стране 20% учесника, док ниједан учесник не би написао нетачан код овог проблема ако му је дозвољено да напише return на средини петље. [8]

Други, укључујући Кент Бека и Мартина Фовлера пишу да једна или више заштитних класа -- условно"ранији излаз" повратних наредби близу почетка функције -- често чине функцију лакшом за читање него алтернатива.

Најчешћи проблем у ранијем излазу је тај да чишћење или главне наредбе нису извршене - на пример, издвојена меморија није неиздвојена, или отворени фајлови нису затворени, што проузрокује цурење. Ово се мора урадити приликом сваког повратног места, који је крт и може лако довести до багова. На пример, у каснијем развитку, повратна наредба може бити занемарена од стране програмера, и акција која би требало да се изврши на крају подрутине (нпр., наредба трага) се можда неће извршити у свим класама. Језици без повратне наредбе, као што је стандардни Паскал немају овакав проблем. Неки језици, као што је С++ и Пајтон, запошљавају концепте који дозвољавају акцијама да буду извршене аутоматски након повратка (или избацивањем изузетака) која убележавају неке од ових проблема - често су познати као "пробај/ коначно" или слично. Иронично, функционалност као ова "коначно" клаузула може бити убачена преко goto на прву повратну тачку подрутине. Алтернативна солуција је корисцење нормалног стека одмотавања (делокација варијабле) на излазу функције да одлоцира ресурсе, као што су преко деструктура локалних варијабли, или сличних механизама као што је Пајтонова "with" наредба.

Неке раније имплементације језика као што је оригинални Паскал и С ограничени типови који могу бити враћени преко фунцкије (нпр., не подржава снимање или структуру типова) да би поједноставио њихове компилаторе.

У Јави је могуће извршити код чак после повратне наредбе, зато што коначни блок покушај-ухвати структуре је увек извршен. Тако да ако је повратна наредба постављена негде унутар покушај или ухвати блокова код унутар коначно(ако је додат)ће бити извршен. Могуће је да промени повратну вредност непримитивне врсте (власништво већ враћеног објекта ) зато што се излаз извршава после такође.[9]

Yield наредбеУреди

Рођак наредбама повратка су наредбе yield : где повратак проузрокује подрутину да се заврши, yield проузрокује да се суспендује корутина. Корутина ће касније наставити од места суспензије ако је поново позвана. Корутине су знатно висе укључене у имплементацију него подрутине, и на тај начин yield наредбе су ређе него повратне наредбе, али су нађене у многим језицима.

Види јошУреди

РеференцеУреди

  1. ^ in Bash, only integers in the range 0-255 may be returned: http://tldp.org/LDP/abs/html/complexfunct.html#RETURNREF
  2. ^ https://msdn.microsoft.com/en-us/library/sta56yeb.aspx MSDN: return Statement (C)
  3. ^ https://msdn.microsoft.com/en-us/library/k68ktdwf.aspx MSDN: return Statement (C++)
  4. ^ "PHP: return - Manual".
  5. ^ "Return - Javascript".
  6. ^ C++ Notes: Function return Statement
  7. ^ David Anthony Watt; William Findlay (2004).
  8. ^ Roberts, E. [1995] “Loop Exits and Structured Programming: Reopening the Debate,” ACM SIGCSE Bulletin, (27)1: 268–272.
  9. ^ The finally Block,The Java Tutorials