Naredba povratka

S Vikipedije, slobodne enciklopedije

U programiranju, naredba povratka izaziva izvršavanje da napusti trenutnu podrutinu i da nastavi u trenutku koda odmah onde gde je podrutina pozvana, poznata kao povratna adresa. Povratna adresa je sačuvana obično na pozivnoj gomili procesa, kao deo operacije pravljenja podrutinskog poziva. Naredbe povratka u mnogim jezicima dozvoljavaju funkciji da precizira povratnu vrednost kako bi se prosledila nazad do koda koji je pozvao funkciju.

Pregled[uredi | uredi izvor]

U C/C++, return exp; (gde exp je ekspresija) je naredba koja govori funkciji da vrati izvršenje programa za poziv funkcije, i prijavljuje vrednost odexp. Ako funkcija ima vraćeni tip prazan, naredba povratka se može koristiti bez vrednosti, u kojem slučaju program prekida sa radom trenutne funkcije i vraća pozvanu.

U Paskalu ne postoji naredba povratka. Podrutina se automatski vraća kada izvršenje dostigne svoje poslednje izvršeno stanje. Vrednosti mogu biti vraćeni identifikatori koji ima isto ime kao podrutina, funkcija u Paskalovoj terminologiji. Na ovaj način identifikator funkcije se koristi za rekurzivne pozive i kao držač rezultata; ovo je sintaksno slično eksplicitnom spoljašnjem parametru. Ista sintaksa se koristila u Fortranu 66 i Fortranu 77. U nekim drugim jezicima varijabla definisana preko korisnika se koristi umesto identifikatora funkcije.

Oberon (Oberon-07) ima izraz povratka umesto naredbe povratka. Vraćeni izraz je smešten posle poslenje naredbe tela procedure. Ovo omogućuje proveravanje vremena pravilnog vraćanja i vraćanja vrednosti procedure.

Neki ekspresiono-orijentisani programski jezici kao što je Lisp, Perl i Rubi, dozvoljavaju programeru da izostavi eksplicitnu naredbu povratka, navodeći umesto toga  da  je poslednjaprocenjena ekspresija povratna vrednost podrutine.  

U drugim slučajevima prazna vrednost je vraćena ako ne postoji eksplicitna naredba povratka : u Pajtonu, vrednostNone se vraća kada je naredba povratka izostavljena, dok u Javaskripti vrednost i undefined je vraćeno.

U Windows PowerShell sve procenjene ekspresija koje nisu uhvaćene (npr., pripisan varijabli, bačen u prazninu ili zavezan za nulu)su vraćeni iz podrutine kao elementi u nizu, ili kao jedan objekat u slučaju da je samo jedan objekat uhvaćen

U Perlu, vraćena vrednost ili vrednosti podrutine mogu zavisiti od konteksta u kome je pozvana. Najfundamentalnije istrebljenje je skalarni kontekst gde pozvani kod očekuje jednu vrednost, lista konteksta gde pozvani kod očekuje listu vrednosti i kontekst praznine gde pozivani kod neočekuje bilo koju povratnu vradnost. Podrutina može proveriti kontekst koristećiwantarray funkciju. Specijalnni sintaksni povratak bez argumenata se koristi da vrati nedefinisanu vrednost u kontekstu skalara i praznu lisu u kontekstu liste. Skalarni kontekst dalje može biti podeljen u bulov tip podataka, broj, string i različiti tipovi reference konteksta. Takođe, kontekstno-senzitivan objekat može biti vraćen korišćenjem kontekstualne povratne sekvence, sa lenjom procenom skalarnih vrednosti.

Vrednosti vraćene od strane programa kada se on završi su obično uhvaćene preko serijskih programa .

Sintaksa[uredi | uredi izvor]

Naredbe povratka dolaze u mnogim oblicima. Sledeće sintakse su najčešće:

Jezik Povratna

naredba

Ako je vrednost izostavljena, Vrati
Ada, Baš,[1] C, C++, Java, PHP, C#, Javaskript, D
return value;
u Bašu, izlazna vrednost poslednje izvršene komande u funkciji

uC[2] iC++,[3] nedefinisano ponašanje ako funkcija vraća vrednost

u PHP,[4] vraća NULL

u Javaskripti,[5] vraća vrednost undefined

i Javi i C#, nije dozvoljeno ako funkcija vraća vrednost

Bejsik
RETURN
Lisp
(return value)
poslednja vrednost naredbe
Perl, Rubi
return @values;
return $value;
return;

ili konteksna povratna sekvenca

poslednja vrednost naredbe
Pajton
return value
None
Smalltalk
^ value
Visual Basic .NET
Return value
Windows PowerShell
return value;
objekat
x86 asebmler
ret
sadržaj eax registra (po običaju)

U jezicima asemblera , na primer za MOS Tehnologiju 6502, mnemonika "RTS"(Povratak iz Podrutine) je korišćeno. 

Višestruke povratne informacije[uredi | uredi izvor]

Jezici sa eksplicitnom povratnom naredbom stvaraju mogućnost višestrukih povratnih naredbi u istoj funkciji. Bez obzira da li je to dobra stvar ona je kontroverzna.

Jaki sledbenici strukturnog programiranja osiguravaju da svaka funkcija ima jedan ulaz i jedan izlaz (SESE). On je na taj način tvrdio[6] da treba izbegavati korišćenje eksplicitne povratne naredbe osim kod tekstualnog kraja podrutine, razmatrajući to, kada se koristi "da vrati ranije", može da pati od iste vrste problema koji izlaze za GOTO naredbu. Nasuprot tome, može se raspravljati da je korišćenje povratne naredbe korisno kada je alternativa komplikovaniji kod, kao što je duboko gnezdo, povređivanje čitanja.

U njegovoj svesci iz 2004, David Vat piše "jedan-ulaz više-izlaza kontrole protoka su često poželjne". Korišćenjem Tenetovog framework-a pojma sekvencera, Vat ravnomerno opisuje konstrukcije kontrole protoka nađene u savremenim programskim jezicima i pokušava da objasni zašto neki tipovi sekvensera su bolji od drugih u kontekstu više-ilzaznih kontrola protoka. Vat piše da su nedozvoljene goto naredbe (skočni sekvenceri) loše zato što destinacija skoka nije objašnjiva sama po sebi čitaocu programa sve dok čitalac ne nađe i testira stvarnu oznaku ili adresu koja je meta skoka. U suprotnom, Vat opisuje da je konceptualna namera povratka sekvencera čista iz njenog konteksta, bez potrebe da se povrati njena destinacija. Dalje, Vat piše da klasa sekvencera poznata kao sekvence bega, definisane kao "sekvencer koji raskida izvršavanje tekstualno prihvaćene komande ili procedure , obuhvata i prekid petlji (uključujući prekide višeg-nivoa) i povratne naredbe. Vat takođe naznačava da while sekvencer skoka (goto) je nekako ograničen u jezicima kao što je S, gde meta mora biti unutar lokalnog bloka ili obuhvaćenog izlaznog bloka, samo ograničenje nije dovoljno da uradi naredbu goto u S samopišućem i tako da mogu idalje da prave "špageti kod". Vat takođe ispituje kako se sekvenceri izuzetaka razlikuju od bega i skoka sekvencera; za detalje za ovo videti u artiklu strukturno programiranje. [7]

Prema empirijskim studijama napisanim od Erika S. Robertsa, studenti programeri imali su poteškoće formulirsanja tačnih rešenja za nekoliko jednostavnih problema u jeziku kao što je Paskal, koji ne dozvoljava više izlaznih tačaka. Za problem pisanja funkcije linearnog pretraživanja elementa u redu, studija iz 1980 Henrija Sapira (naveo Robert) je otkrila da korišćenjem Paskalom pruženih kontrola struktura, tačno rešenje je dato samo od strane 20% učesnika, dok nijedan učesnik ne bi napisao netačan kod ovog problema ako mu je dozvoljeno da napiše return na sredini petlje. [8]

Drugi, uključujući Kent Beka i Martina Fovlera pišu da jedna ili više zaštitnih klasa -- uslovno"raniji izlaz" povratnih naredbi blizu početka funkcije -- često čine funkciju lakšom za čitanje nego alternativa.

Najčešći problem u ranijem izlazu je taj da čišćenje ili glavne naredbe nisu izvršene - na primer, izdvojena memorija nije neizdvojena, ili otvoreni fajlovi nisu zatvoreni, što prouzrokuje curenje. Ovo se mora uraditi prilikom svakog povratnog mesta, koji je krt i može lako dovesti do bagova. Na primer, u kasnijem razvitku, povratna naredba može biti zanemarena od strane programera, i akcija koja bi trebalo da se izvrši na kraju podrutine (npr., naredba traga) se možda neće izvršiti u svim klasama. Jezici bez povratne naredbe, kao što je standardni Paskal nemaju ovakav problem. Neki jezici, kao što je S++ i Pajton, zapošljavaju koncepte koji dozvoljavaju akcijama da budu izvršene automatski nakon povratka (ili izbacivanjem izuzetaka) koja ubeležavaju neke od ovih problema - često su poznati kao "probaj/ konačno" ili slično. Ironično, funkcionalnost kao ova "konačno" klauzula može biti ubačena preko goto na prvu povratnu tačku podrutine. Alternativna solucija je koriscenje normalnog steka odmotavanja (delokacija varijable) na izlazu funkcije da odlocira resurse, kao što su preko destruktura lokalnih varijabli, ili sličnih mehanizama kao što je Pajtonova "with" naredba.

Neke ranije implementacije jezika kao što je originalni Paskal i S ograničeni tipovi koji mogu biti vraćeni preko funckije (npr., ne podržava snimanje ili strukturu tipova) da bi pojednostavio njihove kompilatore.

U Javi je moguće izvršiti kod čak posle povratne naredbe, zato što konačni blok pokušaj-uhvati strukture je uvek izvršen. Tako da ako je povratna naredba postavljena negde unutar pokušaj ili uhvati blokova kod unutar konačno(ako je dodat)će biti izvršen. Moguće je da promeni povratnu vrednost neprimitivne vrste (vlasništvo već vraćenog objekta ) zato što se izlaz izvršava posle takođe.[9]

Yield naredbe[uredi | uredi izvor]

Rođak naredbama povratka su naredbe yield : gde povratak prouzrokuje podrutinu da se završi, yield prouzrokuje da se suspenduje korutina. Korutina će kasnije nastaviti od mesta suspenzije ako je ponovo pozvana. Korutine su znatno vise uključene u implementaciju nego podrutine, i na taj način yield naredbe su ređe nego povratne naredbe, ali su nađene u mnogim jezicima.

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

  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