내가 프로그래밍 언어에 대한 구현 기술로보고, 최근 가정 (예를 들어, 자신의 사용 주어진 연속 통과 스타일의 모델에 적합하다 스파게티 스택, 건너 온거야 계획 및 SML / NJ ). 간단히하기 위해이 질문에 대한 단일 스레드 프로세스 만 고려해 봅시다.
그러나 Wikipedia 의 다이어그램 ( 다른 곳 에서도 찾을 수 있음 ) 에 약간 혼란 스럽습니다 . 특히, 나는 그러한 상황이 어떻게 일어날 수 있는지 이해하지 못한다. 회색으로 된 가지에 도달 할 수 없으며 가비지 수집해야한다고 상상할 수 있습니다. 반면에 스파게티 스택을 사용하여 CPS를 구현하는 방법에 대한 모호한 이해를 통해 그 구조에서 루프를 얻는 방법을 상상할 수 없습니다. "부모 포인터 트리"가 아니라 스레드가있는 수 많은 비가 비지 소스와 (잠재적) "종료 지점"이있는 싱크가 많은 방향성 비순환 그래프라는 결론을 내 렸습니다.
그러나이 구현에 대한 나의 이해는 모호하기 때문에 아마도 뭔가 빠진 것 같습니다. 누군가가 "스파게티 콜 스택"에 대해 나를 깨달을 수 있기를 희망합니다. 이는 CPS 기반 프로세스를 구현하기 위해 Scheme 및 / 또는 SML / NJ에서 사용되는 데이터 구조를 의미합니다.
다음과 같은 스파게티 호출 스택이 주어집니다.
[exit point] <-- ... <-- [frame A] <-- [frame B (active)] ^ `---- [frame C]
내가 이해하는 한, B의 흐름 제어는 부모로 점프하여 스택을 풀거나 (A는 활성 상태가되고 연결할 수없는 B는 가비지가 됨) 활성 프레임을 하위 그래프로 교체하거나 B 또는 참조가 보유한 참조 만 사용하여 연결합니다 새로운 프레임에. 실행은 프레임 C로 흐를 수 없습니다 . 즉, 프레임 C가 가비지 여야합니다 .
이전 상황이 아니라 다음과 같은 쓰레기가없는 상황이 발생할 수 있다고 생각합니다.
[exit point] <-- ... <-- [frame W] <-- [frame X] <-- [frame Z (active)] ^ | `---- [frame Y] <---´
예를 들어, 프레임 Z가 일부 결정 함수에 속한다고 생각할 수 있는데, 이는 결정 프레임 X 또는 프레임 Y (둘 중 어느 것이 W로 돌아갈 것인지)로 계속됩니다. 이것은 스파게티 호출 스택이 "부모 포인터 트리 " 가 아님을 의미합니다 .
그러나 루프를 구성 할 수있는 상황은 상상할 수 없습니다. 예를 들어 다음과 같은 상황을 고려하십시오.
[exit point] <-- ... <-- [frame P] --> [frame Q (active)] ^ | | v `---- [frame R]
나는 재귀 바인딩이 중요하다는 것을 알고 있지만 이것이 합리적이라고 의심합니다. Q가 R로 돌아 오면 프레임 Q는 "소비"됩니다. R이 P로 돌아가고 P를 먼저 다시 초기화해야하기 때문에 P는 단순히 Q로 돌아갈 수 없습니다. 따라서 루프는 일관성이없는 상태를 유발합니다. (물론이 데이터 구조의 목적을 이해하지 못하면, 현재 프레임의 템플릿으로 만 노드를 사용할 것입니다.)
이러한 관찰을 통해 스파게티 호출 스택 (쓰레기 없음)이 실제로 DAG라는 결론을 내 렸습니다. 이 올바른지? 아니면이 데이터 구조의 목적을 오해하고 있습니까?
업데이트 :
다음 논문 의 사본 을 살펴 보았습니다 .
EA Hauck 및 BA Dent. 1968. 버로우즈의 B6500 / B7500 스택 메커니즘. 년 4 월 30 논문집 월 - 2, 1968 년 봄 합동 컴퓨터 회의 (AFIPS 68 년 (봄)). ACM, 뉴욕, 뉴욕, 미국, 245-251. DOI = http://dx.doi.org/10.1145/1468075.1468111
이 백서는 Suguaro Stack System을 정의한 것으로 보입니다. 이 Suguaro Stack System은 여러 개의 "작업"이 부분적으로 공유 된 스택의 프레임을 통과 할 수있는 전통적인 호출 스택입니다. 계속과는 전혀 관련이 없습니다.
다음의 논문 (및 1996 년의 동반자 논문)은 SML / NJ 컴파일러에서 무슨 일이 일어나고 있는지 분명히 설명합니다.
Zhong Shao와 Andrew W. Appel. 2000. 효율적이고 안전한 공간 폐쇄 변환. ACM 거래 프로그램. 랭 시스. 22, 1 (2000 년 1 월), 129-161. DOI = http://dx.doi.org/10.1145/345099.345125
이 질문으로 다른 작업을하기 전에이 논문 ( 저자 웹 사이트에 복사)을 읽어야한다고 생각합니다 . "안전하게 연결된 폐쇄"개념은 Suguaro Stack System과 매우 유사하며, 항상 매우 얕고 자유 변수 만 공유 할 수 있습니다.
우리의 새로운 폐쇄 - 변환 알고리즘의 사용은 안전하게 폐쇄 연결 실제로 같은과 변수를 그룹화하여 기능하지만 피할 폐쇄 복사에 필요한 변수 만 포함 (그림 1의 3 열) 수명을 공유 가능한 기록으로합니다. [...] 연결된 클로저와 달리, 안전하게 연결된 클로저의 중첩 수준은 두 개 (클로저 자체의 한 계층, 다른 수명 시간 기록의 다른 계층)를 초과하지 않으므로 여전히 매우 빠른 가변 액세스 시간을 즐길 수 있습니다.
이 백서는 또한 "모든 런타임 스택"을 사용하지 않는다고 명시 적으로 언급합니다.
대신, 모든 활성화 레코드를 연속 함수의 클로저로 취급하여 힙의 레지스터에 할당합니다.
스파게티 스택이 흐름 제어에 사용되지 않기 때문에 Wikipedia 기사를 오해하거나 잘못 읽은 것 같습니다. 그러나 Appel과 Shao의 논문을주의 깊게 읽은 후 "스파게티 콜 스택"(아마도 중요하지 않음)보다는 클로저의 종속성 그래프를 참조하여 질문을 다시 말할 수 있습니다.