Co je to ocas?
V počítačovém programování je ocasní volání konkrétní situace 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 přidržování návratové hodnoty. 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, kdy se používá rekurze, protože množství prostoru zásobníku použité k ukládání volajícího adresy v případech, kdy rekurzivní volání hnízdí velmi hluboce, by mohlo rychle vyběhnout a zastavit progrum provedení. Přestože použití ocasních hovorů 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řípady rekurze.
Existence ocasního hovoru je z velké části způsobena tím, jak zásobník hovorů funguje ve většině počítačových programů a architektur systémů. 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ámečky 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í části zásobníku a prováděníVrací se do funkce A, který má svůj rám vyskočil z zásobníku, když je hotovo, konečně vrátí kontrolu programu do bodu, ze kterého byla původně volána první funkce.
6 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í, místo toho, aby měla rámeček 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 bude vyskočena a zlikvidována, což znamená, že funkce B předává svou návratovou hodnotu přímo zpět do místa, která se nazývá funkce, aniž by musela nejprve předávat ovládání zpět do funkce A. To zvyšuje rychlost volání funkcí, stejně jako pomoc, stejně jako pomoc, stejně jako pomůže, stejně jako pomoc, stejně jako pomoc, stejně jako pomůže, stejně jako pomoc, stejně jako pomůže, stejně jako pomůže, stejně jako pomůže, stejně jako pomůže, stejně jako pomůže, stejně jako pomůže, stejně jako pomůže s tím, jak se zvyšuje.Vlastnosti ocasního volání z nich mohou být velmi učiněnyAtraktivní 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 nelze bezpečně provádět bez okamžitého ohrožení přetečení zásobníku a možného ukončení programu.