Mis on sabakõne?

Arvutiprogrammeerimises on sabakutse konkreetne olukord programmi lähtekoodis, kus funktsioon, alamprogramm või protseduur tagastab eeldatava väärtuse, kutsudes teist funktsiooni, selle asemel, et lihtsalt edastada tagastatavat väärtust sisaldavat muutujat. Nimi ise näitab, et tagastatava väärtuse arvutamiseks kutsutav funktsioon asub seda tagastava väärtuse andmiseks kutsuva funktsiooni lõpus või lõpus. Sabakutse pakub mõnele programmeerijale huvi, kuna teatud optimeerimiste või kompilaatori käitumise korral ei kasutata põhifunktsiooni koodiasukohtade salvestamiseks täiendavat pinuruumi; sabafunktsiooni kasutatakse selle asemel tagastusväärtuse aruannete genereerimiseks otse tagasi kõnepunkti, kus algne funktsioon kutsuti. Sabakutse kasutamine on eriti kasulik olukordades, kus kasutatakse rekursiooni, kuna helistaja aadresside salvestamiseks kasutatav pinuruum, kui rekursiivsed kõned pesitsevad väga sügavalt, võivad kiiresti lõppeda ja programmi täitmise peatada. Kuigi sabakõnede kasutamine võib aidata programmis kiirendada, mälukasutust ja tõhusust suurendada, võib see põhjustada ka olukordi, kus lähtekood struktureeritakse ümber nii, et kõnesid kasutatakse viisil, mis muudab silumise ja jälgimise keeruliseks, eriti kui rekursioon.

Sabakõne olemasolu on suuresti tingitud sellest, kuidas kõnepinn enamikus arvutiprogrammides ja süsteemiarhitektuurides töötab. Virn, mis on nagu plaatide virn, on andmestruktuur esimene sisse, viimane välja. Funktsiooni, alamprogrammi või protseduuri kutsumisel salvestatakse pinu aadress, millelt kõne tehakse, mida nimetatakse virnaraamiks. See tähendab, et programmil, mis kutsub funktsiooni A, mis kutsub seejärel funktsiooni B, on kaks pinu kaadrit, üks funktsiooni B jaoks ja teine ​​selle all funktsiooni A jaoks. Kui funktsioon B on täitmise lõpetanud, hüppatakse selle virnaader välja ülaosast. virn ja täitmine naaseb funktsiooni A juurde, mille raam hüppab virnast välja, kui see on tehtud, tagastades lõpuks programmi juhtimise punktile, kust esimene funktsioon algselt välja kutsuti.

Kui kasutatakse sabakutset, kasutab funktsiooni return-lause kutsuvale koodile saadetavate andmetena otse teise funktsiooni tagastusväärtust. Kui ülaltoodud näites kutsub funktsioon A funktsiooni B otse koos return-lausega, siis on moodustatud sabakutse. Kõnevirnas saab nii funktsiooni A kui ka B virnaadri asemel funktsioon B funktsiooni A tagastusaadressi ning funktsiooni A pinu raam hüppatakse ja kõrvaldatakse, mis tähendab, et funktsioon B edastab oma tagastusväärtuse otse tagasi. asukohta, mis kutsus funktsiooni A, ilma et oleks vaja esmalt juhtimine funktsioonile A tagasi anda. See suurendab funktsioonikutsete kiirust ja aitab hoida virnas teabe hulka.

Sabakutse omadused võivad muuta need rekursiivsete funktsioonide jaoks väga atraktiivseks võimaluseks. Rekursiivne funktsioon on funktsioon, mis kutsub end väärtuse arvutamiseks korduvalt välja, nagu võib juhtuda loendi andmestruktuuri läbimisel. Pesastatud funktsioonikutsete jaoks ei looda täiendavaid pinu kaadreid, nii et väga sügavaid rekursioonitasemeid saab ohutult teostada ilma vahetu virna ülevoolu ja võimaliku programmi lõpetamise ohuta.