테일 콜이란?
컴퓨터 프로그래밍에서 테일 콜은 함수, 서브 루틴 또는 프로 시저가 단순히 리턴 값을 보유하는 변수를 전달하는 대신 다른 함수를 호출하여 예상 값을 리턴하는 프로그램 소스 코드 내의 특정 상황입니다. 이름 자체는 리턴 될 값을 계산하기 위해 호출 된 함수가 리턴 값을 제공하기 위해 호출하는 함수의 끝 또는 꼬리에 있음을 나타냅니다. 테일 호출은 특정 최적화 또는 컴파일러 동작과 함께 주 함수의 코드 위치를 저장하는 데 추가 스택 공간이 사용되지 않기 때문에 일부 프로그래머에게 관심이 있습니다. 대신 tail 함수는 원래 함수가 호출 된 호출 지점으로 직접 반환 값 보고서를 생성하는 데 사용됩니다. 재귀 호출이 매우 깊게 중첩되는 경우 호출자 주소를 저장하는 데 사용되는 스택 공간의 양이 빠르게 실행되어 프로그램 실행을 중지 할 수 있기 때문에 테일 호출을 사용하면 재귀가 사용되는 상황에서 특히 유용합니다. 테일 호출을 사용하면 프로그램에서 속도, 메모리 사용 및 효율성을 높일 수 있지만 소스 코드를 재구성하여 호출 및 디버그가 어려운 방식으로 호출을 사용하도록 재구성하는 상황이 발생할 수 있습니다. 재귀.
테일 콜의 존재는 대부분의 컴퓨터 프로그램 및 시스템 아키텍처에서 콜 스택이 작동하는 방식에 크게 영향을받습니다. 플레이트 스택과 같은 스택은 선입 선출 데이터 구조입니다. 함수, 서브 루틴 또는 프로 시저가 호출되면 스택 프레임이라고하는 호출 주소가 스택에 저장됩니다. 즉, 기능 A를 호출 한 다음 기능 B를 호출하는 프로그램은 기능 B에 대한 스택 프레임과 기능 A에 대한 스택 프레임 두 개를 갖게됩니다. 기능 B가 실행을 마치면 스택 프레임이 상단에서 팝됩니다. 스택 및 실행은 기능 A로 돌아갑니다. 기능 A는 스택이 완료되면 프레임이 스택에서 튀어 나와 마지막으로 첫 번째 기능이 처음 호출 된 지점으로 프로그램 제어를 반환합니다.
테일 호출을 사용하는 경우 함수의 return 문은 다른 함수의 반환 값을 호출 코드로 보낼 데이터로 직접 사용합니다. 위의 예에서 함수 A가 return 문을 사용하여 함수 B를 직접 호출하면 테일 호출이 형성됩니다. 콜 스택 내에서 함수 A와 B 둘 다에 대한 스택 프레임을 갖지 않고 함수 B는 함수 A로부터 리턴 주소를 수신하고 함수 A의 스택 프레임은 팝되어 폐기됩니다. 즉, 함수 B는 리턴 값을 직접 전달합니다. 먼저 제어를 기능 A로 다시 전달하지 않고 기능 A를 호출 한 위치로 이동합니다. 이렇게하면 함수 호출 속도가 빨라지고 스택의 정보량을 유지하는 데 도움이됩니다.
꼬리 호출의 속성은 재귀 함수에 매우 매력적인 옵션이 될 수 있습니다. 재귀 함수는 목록 데이터 구조를 통과 할 때와 같이 값을 계산하기 위해 반복적으로 호출되는 함수입니다. 중첩 된 함수 호출에 대해 추가 스택 프레임이 작성되지 않으므로 스택 오버 플로우 및 가능한 프로그램 종료의 위협없이 매우 깊은 수준의 재귀를 안전하게 수행 할 수 있습니다.