Co je to Tail Call?

V počítačovém programování je ocasní volání specifická situace v rámci zdrojového kódu programu, ve kterém funkce, podprogram nebo procedura vrací očekávanou hodnotu voláním jiné funkce namísto pouhého předání proměnné obsahující 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 na konci funkce, která ji volá, aby poskytla návratovou hodnotu. Ocasní volání je pro některé programátory zajímavé, protože s určitými optimalizacemi nebo chováním kompilátoru se k ukládání umístění kódu hlavní funkce nepoužívá žádný další zásobníkový prostor; 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í koncového volání je zvláště užitečné v situacích, ve kterých je využívána rekurze, protože množství zásobníku, které se používá k ukládání adres volajícího v případech, kdy rekurzivní volání velmi hluboko hnízdí, by mohlo rychle dojít a zastavit provádění programu. I když použití koncových volání může pomoci zvýšit rychlost, využití paměti a efektivitu v programu, může to také vést k situacím, ve kterých je zdrojový kód restrukturalizován tak, aby používal volání způsobem, který ztěžuje ladění a sledování, zejména v případech rekurze.

Existence koncového volání je z velké části způsobena tím, jak zásobník volání funguje ve většině počítačových programů a systémových architektur. Zásobník, který je jako zásobník desek, je datovou strukturou first-in, last-out. Když je vyvolána funkce, podprogram nebo procedura, je do zásobníku uložena adresa, ze které se uskutečňuje volání, nazývaná rámeček zásobníku. To znamená, že program, který volá funkci A, který potom volá funkci B, bude mít dva rámečky zásobníku, jeden pro funkci B a druhý pod ním pro funkci A. Po dokončení funkce B se jeho zásobník vyklopí z horní části zásobník a provádění se vrací k funkci A, která má svůj rámeček vyskočený ze zásobníku, když je hotovo, a nakonec vrací řízení programu do bodu, z něhož byla původně vyvolána první funkce.

Při použití koncového volání používá návratový příkaz ve funkci přímo návratovou hodnotu jiné funkce jako data, která mají být odeslána do volajícího kódu. Ve výše uvedeném příkladu, pokud funkce A volá funkci B přímo s příkazem return, bylo vytvořeno ocasní volání. V rámci zásobníku volání, namísto zásobníku zásobníku pro obě funkce A a B, funkce B obdrží zpáteční adresu z funkce A a zásobník zásobníku rámce A bude vyskočen a zlikvidován, což znamená, že funkce B předá svou návratnou hodnotu přímo zpět na místo, které volalo funkci A, aniž by bylo nutné předávat ovládání zpět do funkce A. Tím se zvyšuje rychlost volání funkcí a také se pomáhá snižovat množství informací v zásobníku.

Vlastnosti koncového volání z nich činí velmi atraktivní volbu pro rekurzivní funkce. Rekurzivní funkce je funkce, která se sama opakovaně volá, aby vypočítala hodnotu, jako je tomu v případě procházení datovou strukturou seznamu. Pro volání vnořených funkcí se nevytvářejí žádné další rámce zásobníku, takže lze velmi bezpečně provádět velmi hluboké úrovně rekurze bez bezprostředního ohrožení přetečení zásobníku a možného ukončení programu.

JINÉ JAZYKY

Pomohl vám tento článek? Děkuji za zpětnou vazbu Děkuji za zpětnou vazbu

Jak můžeme pomoci? Jak můžeme pomoci?