문제

최근에 대한 나의 대답 GOTO 및 꼬리 재귀에 대한 질문 호출 스택의 관점에서 표현되었습니다.충분히 일반적이지 않은 것 같아 질문드립니다.콜 스택이 없는 아키텍처에서 테일 콜(또는 이에 상응하는) 개념이 어떻게 유용합니까?

연속 전달에서는 호출된 모든 함수가 호출 함수를 대체하므로 꼬리 호출이므로 "꼬리 호출"은 유용한 구별이 아닌 것 같습니다.메시징 및 이벤트 기반 아키텍처에는 동등한 것이 없는 것 같습니다. 하지만 제가 틀렸다면 정정해 주십시오.후자의 두 아키텍처는 FP가 아닌 OOP와 연관되어 있기 때문에 흥미로운 사례입니다.다른 아키텍처는 어떻습니까?이전 Lisp 시스템은 콜 스택을 기반으로 했나요?

편집하다:에 따르면 "도대체 무엇입니까:연속 패스 스타일(CPS)"(그리고 아래의 Alex)에서 연속 전달 시 꼬리 호출과 동등한 것은 "호출된 함수가 호출 함수를 대체합니다"가 아니라 "호출 함수가 새로운 연속을 생성하는 대신 주어진 연속을 전달합니다"입니다.이런 유형의 테일 콜은 제가 주장한 것과는 달리 유용합니다.

또한 더 낮은 수준에서 호출 스택을 사용하는 시스템에는 관심이 없습니다. 더 높은 수준에서는 호출 스택이 필요하지 않기 때문입니다.Alex는 다른 호출 아키텍처(이게 맞는 표현인가요?) 내부 어딘가에 호출 스택이 있는 것이 아니라 동등한 호출 스택이 있는 경우가 많습니다.연속 패스의 경우 구조는 다음과 같습니다. 수목, 그러나 가장자리는 반대 방향입니다.호출 스택에 상응하는 항목은 내 관심사와 매우 관련이 있습니다.

도움이 되었습니까?

해결책 2

이 질문은 나가 아닌 다른 사람에게 관심을 가질 가능성이 있습니다. 확장 된 답변 다른 질문에 대해서도이 질문에 대답합니다. 여기에 간단하고 무성한 버전이 있습니다.

계산 시스템이 하위 컴퓨팅을 수행 할 때 (즉, 첫 번째는 두 번째의 결과에 의존하기 때문에 다른 계산이 수행되는 동안 계산이 시작되고 일시 중지되어야하는 경우, 실행 지점 사이의 종속성 관계가 자연스럽게 발생합니다. 콜 스택 기반 아키텍처에서 관계는 토폴로지로 경로 그래프. CPS에서는 루트와 노드 사이의 모든 경로가 연속적인 나무입니다. 메시지 전달 및 스레딩에서 경로 그래프 모음입니다. 동기 이벤트 처리는 기본적으로 메시지 전달입니다. 하위 계산을 시작하려면 잎이 추가되지 않고 잎을 대체하는 테일 콜을 제외하고 의존성 관계를 확장하는 것이 포함됩니다.

비동기 이벤트 처리로 꼬리 호출을 번역하는 것이 더 복잡하므로 대신 더 일반적인 버전을 고려하십시오. A가 채널 1에서 이벤트에 가입되면 B는 채널 2에서 동일한 이벤트에 가입하고 B의 핸들러는 채널 1에서 이벤트를 해고합니다 (채널을 통해 이벤트를 번역 함). 2 B. 가입 대신 B. 테일 콜에 해당하기 때문에 더 일반적입니다.

  • 채널 1에서 A의 구독이 채널 2에 A가 구독되면 취소됩니다.
  • 핸들러는 자체 구독입니다 (호출 될 때 구독을 취소).

하위 컴퓨팅을 수행하지 않는 두 시스템의 경우 Lambda Calculus (또는 일반적인 재 작성 시스템) 및 RPN. Lambda 미적분학의 경우, 꼬리 호출은 용어 길이가 O (1) 인 감소 시퀀스에 대략적으로 일치합니다 (반복 프로세스 참조 SICP 섹션 1.2). RPN을 사용하여 데이터 스택 및 작업 스택을 사용하여 (작업 스트림과는 달리, 작업은 아직 처리되지 않은 작업) 및 기호를 일련의 작업 시퀀스에 매핑하는 환경입니다. 꼬리 통화는 O (1) 스택 성장과의 프로세스에 해당 할 수 있습니다.

다른 팁

"호출 스택이 없는 아키텍처"는 일반적으로 특정 수준에서 아키텍처를 "시뮬레이트"합니다. 예를 들어 IBM 360 시대에 우리는 S형 연결 협약 특정 범용 레지스터에 의해 지정되는 레지스터 저장 영역과 인수 목록을 사용합니다.

따라서 "테일 콜"은 여전히 ​​중요할 수 있습니다.호출 함수는 호출 지점 이후에 실행을 재개하는 데 필요한 정보를 보존해야 합니까(호출된 함수가 완료된 후), 아니면 호출 지점 이후에 실행이 없을 것임을 알고 있으므로 간단히 재사용합니까? 호출자의 대신 "실행 재개 정보"?

예를 들어 꼬리 호출 최적화는 목적에 사용되는 연결된 목록에서 실행을 재개하는 데 필요한 연속을 추가하지 않음을 의미할 수 있습니다.나는 이것을 "콜 스택 시뮬레이션"으로 보고 싶습니다(어떤 수준에서는 분명히 더 유연한 배열이지만 계속해서 전달하는 팬이 내 답변 전체에 점프하는 것을 원하지 않습니다. ;-).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top