일종의 스택을 사용하지 않고 함수 호출 의미론을 구현할 수 없습니다. 단어 게임 만 할 수 있습니다 (예 : "FILO return buffer"와 같은 다른 이름 사용).
함수 호출 시맨틱 (예 : 연속 전달 스타일, 액터)을 구현하지 않는 것을 사용하고 그 위에 함수 호출 시맨틱을 빌드 할 수 있습니다. 그러나 이것은 함수가 반환 될 때 제어가 전달되는 위치를 추적하기 위해 일종의 데이터 구조를 추가하는 것을 의미하며 해당 데이터 구조는 스택 유형 (또는 다른 이름 / 설명이있는 스택)이됩니다.
모두 서로를 호출 할 수있는 많은 기능이 있다고 상상해보십시오. 런타임시 각 함수는 함수가 종료 될 때 어디로 돌아갈 지 알아야합니다. first
전화 하면 second
다음이 있습니다.
second returns to somewhere in first
그런 다음 second
전화 third
하면
third returns to somewhere in second
second returns to somewhere in first
그런 다음 third
전화 fourth
하면
fourth returns to somewhere in third
third returns to somewhere in second
second returns to somewhere in first
각 함수가 호출 될 때 더 많은 "반환 위치"정보를 어딘가에 저장해야합니다.
함수가 리턴하면 "반환 위치"정보가 사용되며 더 이상 필요하지 않습니다. 예를 들어, fourth
어딘가 third
로 되돌아 가면 "돌아가는 곳"정보의 양은 다음과 같습니다.
third returns to somewhere in second
second returns to somewhere in first
원래; "함수 호출 의미론"은 다음을 의미합니다.
- "반품 장소"정보가 있어야합니다
- 함수가 호출 될 때 정보의 양이 증가하고 함수가 반환 될 때 감소
- 저장된 "반환 위치"정보의 첫 번째 부분은 폐기 된 "반환 위치"정보의 마지막 부분입니다.
FILO / LIFO 버퍼 또는 스택에 대해 설명합니다.
트리 유형을 사용하려고하면 트리의 모든 노드에 둘 이상의 자식이 없습니다. 참고 : 여러 자식이있는 노드는 함수가 동시에 두 개 이상의 함수 를 호출하는 경우에만 발생할 수 있으며 , 이는 일종의 동시성 (예 : 스레드, fork () 등)이 필요하고 "함수 호출 의미"가 아닙니다. 트리의 모든 노드에 둘 이상의 자식이없는 경우 "트리"는 FILO / LIFO 버퍼 또는 스택으로 만 사용됩니다. FILO / LIFO 버퍼 또는 스택으로 만 사용되기 때문에 "트리"가 스택이라고 주장하는 것이 공정합니다 (단, 차이점은 단어 게임 및 / 또는 구현 세부 사항입니다).
"함수 호출 의미론"을 구현하는 데 사용될 수있는 다른 데이터 구조에도 동일하게 적용됩니다. 이는 스택으로 사용될 것입니다 (단, 차이점은 단어 게임 및 / 또는 구현 세부 사항입니다). "함수 호출 의미론"을 위반하지 않는 한. 참고 : 가능하다면 다른 데이터 구조에 대한 예제를 제공하지만 약간 그럴듯한 다른 구조는 생각할 수 없습니다.
물론 스택을 구현하는 방법은 구현 세부 사항입니다. 메모리 영역 ( "현재 스택 상단"을 추적하는 위치)이거나 일종의 링크 된 목록 ( "현재 목록의 현재 항목"을 추적하는 위치) 일 수 있습니다. 다른 방법으로. 하드웨어가 기본적으로 지원되는지 여부는 중요하지 않습니다.
참고 : 한 번에 하나의 프로 시저 호출 만 활성화 될 수있는 경우; "반환 할 위치"정보를위한 공간을 정적으로 할당 할 수 있습니다. 이것은 여전히 스택입니다 (예 : FILO / LIFO 방식으로 사용되는 정적으로 할당 된 항목의 링크 된 목록).
또한 "함수 호출 의미론"을 따르지 않는 것이 있습니다. 이러한 것들은 "잠재적으로 매우 다른 의미론"(예를 들어 연속 통과, 행위자 모델); 또한 동시성 (스레드, 파이버 등), setjmp
/ longjmp
, 예외 처리 등과 같은 "함수 호출 의미"에 대한 일반적인 확장을 포함합니다 .