Skip to main content

Co to jest połączenie ogonowe?

W programowaniu komputerowym wywołanie ogona jest konkretną sytuacją w kodzie źródłowym programu, w której funkcja, podprogram lub procedura zwraca oczekiwaną wartość, wywołując inną funkcję zamiast po prostu przekazywanie zmiennej trzymającej wartość zwracaną.Sama nazwa oznacza, że funkcja wywoływana do obliczenia wartości do zwrócenia znajduje się na końcu lub ogon funkcji, wzywając ją do dostarczenia wartości zwracanej.Połączenie ogona jest interesujące dla niektórych programistów, ponieważ przy niektórych zachowaniach optymalizacyjnych lub kompilatorów nie służy dodatkowej przestrzeni stosu do przechowywania lokalizacji kodu głównej funkcji;Zamiast tego funkcja ogona jest używana do generowania raportów wartości zwracania bezpośrednio do punktu wywołania, w którym wywołano pierwotną funkcję.Korzystanie z połączenia ogonowego jest szczególnie przydatne w sytuacjach, w których stosuje się rekurencję, ponieważ ilość przestrzeni stosowanej do przechowywania adresów dzwoniącego w przypadkach, w których połączenia rekurencyjne gniazdo bardzo głęboko się skończy i zatrzymają wykonywanie programu.Chociaż korzystanie z połączeń ogonowych może pomóc zwiększyć szybkość, zużycie pamięci i wydajność w programie, może również prowadzić do sytuacji, w których kod źródłowy jest restrukturyzowany do korzystania z połączeń w sposób, który utrudnia debugowanie i śledzenie, szczególnie w przypadku przypadkówrekurencja.

Istnienie połączenia ogonowego wynika w dużej mierze z tego, jak działa stos połączeń w większości programów komputerowych i architektury systemu.Stos, który jest jak stos płyt, jest pierwszym, ostatnim, ostatnim, strukturze danych.Gdy wywoływana jest funkcja, podprogram lub procedura, adres, z którego wykonane jest wywołanie, zwane ramką stosu, jest przechowywany w stosie.Oznacza to, że program wywołujący funkcję A, który następnie wywołuje funkcję B, będzie miał dwie ramki stosu, jedna dla funkcji B, a druga pod nią dla funkcji A. Po zakończeniu funkcji B jest wykonywanie, jego ramka stosu jest wyskakowana z góryStos i wykonanie powraca do funkcji a, która ma swoją ramkę wyskakując ze stosu po zakończeniu, w końcu zwracając kontrolę programu do punktu, z którego pierwotnie wywołano pierwszą funkcję.

Gdy użyto wywołania ogona, instrukcja powrotu wFunkcja bezpośrednio wykorzystuje wartość zwracaną innej funkcji jako danych do wysłania do kodu wywołania.W powyższym przykładzie, jeśli funkcja funkcji wywołania B bezpośrednio z instrukcją powrotną, wówczas utworzono wywołanie ogona.W stosie wywołania, zamiast mieć ramkę stosu dla obu funkcji A i B, funkcja B odbędzie adres zwrotny z funkcji A i Funkcja A Ramka stosu zostanie wyskoczona i pozbywana, funkcja znaczenia B przekaże swoją wartość zwracaną bezpośrednio z powrotemdo lokalizacji, która nazywała funkcję A bez uprzedniej konieczności przekazywania kontroli w celu funkcji A. Zwiększa to szybkość wywołań funkcyjnych, a także pomaga utrzymać ilość informacji w stosie.Są bardzo atrakcyjną opcją dla funkcji rekurencyjnych.Funkcja rekurencyjna to taka, która wielokrotnie wzywa się do obliczenia wartości, jak to może mieć miejsce podczas przechodzenia przez strukturę danych listy.Dla zagnieżdżonych wywołania funkcji nie powstaje żadnych dodatkowych ram, więc bardzo głębokie poziomy rekurencji można wykonać bezpiecznie bez bezpośredniego zagrożenia przepełnieniem stosu i możliwego zakończenia programu.