Skip to main content

Co je to ocas?

V počítačovém programování je ocasní volání specifickou situací v rámci zdrojového kódu programu, ve kterém funkce, podprogramy nebo postup vrací očekávanou hodnotu tím, že volá jinou funkci místo toho, aby jednoduše předávala proměnnou, která drží návratovou hodnotu.Samotný název označuje, že funkce volaná pro výpočet hodnoty, která má být vrácena, je na konci nebo ocasu funkce, která ji volá, aby dodal návratovou hodnotu.U některých programátorů je zajímavý hovor ocasu, protože s určitými optimalizacemi nebo chováním kompilátoru se pro ukládání kódových umístění hlavní funkce nepoužívá žádný další prostor zásobníku;Funkce ocasu se místo toho používá ke generování zpráv o návratové hodnotě přímo zpět do bodu volání, kde byla vyvolána původní funkce.Použití ocasního hovoru je zvláště užitečné v situacích, ve kterých se používá rekurze, protože množství prostoru zásobníku použité k uložení volajícího adresy v případech, kdy rekurzivní volání hnízda velmi hluboce by mohla rychle vyběhnout a zastavit provádění programu.Ačkoli použití ocasních volání může pomoci zvýšit rychlost, využití paměti a účinnost v programu, může to také vést k situacím, ve kterých je zdrojový kód restrukturalizován tak, aby hovory používali způsobem, který ztěžuje ladění a sledování, zejména s případyRekurze.Stoh, který je jako hromada desek, je prvotřídní struktura datových datek.Když je volána funkce, podprogramový nebo postup, je v zásobníku uložena adresa, ze které je volání provedeno, nazývanou rám zásobníku.To znamená, že program, který volá funkci A, který pak nazývá funkci B, bude mít dva rámce zásobníku, jeden pro funkci B a druhý pod ní pro funkci A. Po dokončení funkce B je jeho rám zásobníku vyskočen z horní částiStack a provedení se vrací do funkce A, která má jeho rám vyskočil z zásobníku po dokončení, konečně vrátil kontrolu programu do bodu, ze kterého byla původně volána první funkce.Funkce přímo používá návratovou hodnotu jiné funkce jako data, která mají být odeslána do volacího kódu.Ve výše uvedeném příkladu, pokud funkce volá funkce B přímo s příkazem návratu, bylo vytvořeno ocasní volání.V rámci zásobníku volání bude místo toho, aby měl rám zásobníku pro obě funkce A a B, funkce B obdrží zpáteční adresu z funkce A a Function A's Stack Frame a likvidována, což znamená, že funkce B předá svou návratovou hodnotu přímo zpětna místo, které se nazývá funkce A, aniž by musela nejprve předávat ovládání zpět do funkce A. To zvyšuje rychlost funkčních volání a pomáhá udržovat množství informací v zásobníku.je velmi atraktivní možností pro rekurzivní funkce.Rekurzivní funkce je funkce, která se opakovaně volá, aby vypočítala hodnotu, jak může být v případě procházení seznamu datových struktur.Pro vnořené funkční volání nejsou vytvořeny žádné další rámečky zásobníku, takže velmi hluboké úrovně rekurze lze bezpečně provádět bez okamžitého ohrožení přetečení zásobníku a možného ukončení programu