속행
Continuation컴퓨터 과학에서 연속은 컴퓨터 프로그램의 제어 상태를 추상적으로 표현한 것입니다.계속은 프로그램 제어 상태를 구현(재현)한다. 즉, 계속은 프로세스 실행의 특정 지점에서 연산 프로세스를 나타내는 데이터 구조이다. 생성된 데이터 구조는 런타임 환경에 숨겨지는 대신 프로그래밍 언어로 액세스할 수 있다.연속은 예외, 생성기, 코루틴 등의 프로그래밍 언어로 다른 제어 메커니즘을 인코딩하는 데 유용합니다.
"current continuation" 또는 "computation step의 continuation"은 실행 코드의 관점에서 프로그램 실행의 현재 지점에서 도출되는 연속이다.continuations라는 용어는 1등급 연속을 지칭하는 데 사용될 수도 있습니다.이것은 프로그래밍 언어가 임의의 시점에서 실행 상태를 저장하고 프로그램의 나중에 그 시점으로 되돌아갈 수 있는 기능을 제공하는 구조이며, 경우에 따라서는 여러 번 사용할 수 있습니다.
역사
연속에 대한 최초의 설명은 1964년 9월에 Adrian van Vijngaarden에 의해 만들어졌다.빈가덴은 오스트리아 바덴비엔에서 열린 IFIP 공식 언어 기술 실무 회의에서 연설했다.Algol 60 프리프로세서를 위한 공식의 일부로서, 그는 비록 이 이름을 사용하지 않았지만, 적절한 절차를 연속 통과 [1]스타일로 바꿀 것을 요구했고, 그의 의도는 프로그램을 단순화하고 그 결과를 더 명확하게 하는 것이었다.
크리스토퍼 스트레이시, 크리스토퍼 P. 워즈워스와 존 C. 레이놀즈는 연속 프로그램을 함수 프로그래밍 [1]의미론 측면에서 분석할 수 있도록 하기 위해 연속을 광범위하게 사용하는 표현 의미론 분야에서 연속이라는 용어를 부각시켰다.
Steve[2] Russell은 IBM 704를 위한 두 번째 리스프 구현에서 연속체를 발명했습니다.[3]
레이놀즈(1993)는 연속성의 발견에 대한 완전한 역사를 제공한다.
최고 수준의 연속성
퍼스트 클래스 연속은 명령의 실행 순서를 완전히 제어하는 언어의 능력입니다.현재 함수에 대한 호출을 발생시킨 함수 또는 이전에 종료된 함수로 점프하기 위해 사용할 수 있습니다.1등급 연속은 프로그램의 실행 상태를 저장하는 것이라고 생각할 수 있다.진정한 퍼스트 클래스 연속성은 프로세스 이미지와 달리 실행 컨텍스트만 저장하는 것이 아닙니다.이는 "계속 샌드위치" 설명에서 확인할 수 있습니다.
냉장고 앞에 있는 부엌에서 샌드위치를 생각하고 있다고 합시다.바로 거기다 계속해서 주머니에 넣으세요.그리고 냉장고에서 칠면조와 빵을 꺼내서 샌드위치를 만들어요. 샌드위치는 지금 카운터에 있어요.주머니 속의 계속을 호출하면 냉장고 앞에 다시 서서 샌드위치를 생각하게 됩니다.하지만 다행히도, 카운터 위에 샌드위치가 있고, 그것을 만드는 데 사용된 재료들이 모두 없어졌어요.그럼 네가 먹어. :-)[4]
이 설명에서 샌드위치는 프로그램 데이터의 일부이며(예: 힙 상의 객체), "샌드위치 만들기" 루틴을 호출하고 반환하는 대신 "현재 계속으로 샌드위치 만들기" 루틴을 호출하여 샌드위치를 만든 다음 실행이 중단된 위치에서 계속됩니다.
스킴은 최초의 완전한 생산 시스템(1969-1970)으로, 첫 번째 "캐치"[1]와 그 다음 콜/cc를 제공한다.Bruce Duba는 SML에 call/cc를 도입했습니다.
연속은 표현 의미론, 행위자 모델, 프로세스 계산 및 람다 미적분을 포함한 계산 모델에도 사용됩니다.이러한 모델은 프로그래머 또는 의미론 엔지니어에 의존하여 소위 연속 통과 스타일로 수학 함수를 작성합니다.즉, 각 함수는 이 함수 호출에 대한 계산의 나머지 부분을 나타내는 함수를 소비합니다.값을 반환하려면 함수는 반환 값을 사용하여 이 "계속 함수"를 호출하고 계산을 중단하려면 값을 반환합니다.
프로그램을 연속 통과 스타일로 작성하는 기능성 프로그래머는 제어 흐름을 임의의 방법으로 조작할 수 있는 표현력을 얻습니다.비용은 제어와 연속성의 불변성을 수작업으로 유지해야 하기 때문에 매우 복잡한 작업이 될 수 있습니다(단, 아래의 '연속 통과 스타일' 참조).
사용하다
연속성을 통해 코루틴/녹색 스레드 및 예외 처리를 포함한 몇 가지 일반적인 설계 패턴의 구현을 단순화하고 명확하게 할 수 있습니다.이러한 패턴은 연결되지 않은 것처럼 보이는 패턴을 통합하는 기본적이고 낮은 수준의 프리미티브를 제공합니다.계속하면 여러 페이지를 지원하는 웹 서버를 프로그래밍하거나 앞으로/뒤로 버튼을 사용하거나 다음 링크를 사용하여 액세스할 수 있는 등 일부 어려운 고급 문제에 대해 우아한 해결책을 제공할 수 있습니다.Smalltalk Seaside 웹 프레임워크는 페이지 전환 시 연속성을 전환함으로써 웹 서버를 절차 방식으로 프로그래밍할 수 있도록 하기 위해 연속성을 매우 효과적으로 사용합니다.
"계속은 우아한 [1]묘사를 제공한다"는 보다 복잡한 구조도 존재한다.예를 들어 C에서는 두 번째 함수가 스택 안쪽(첫 번째 함수가 반환되기를 기다리는 경우 등)에 있는 한 함수의 중간에서 다른 함수로 점프하기 위해 longjmp를 사용할 수 있습니다.더 복잡한 예로는 Simula 67, Lua 및 Perl의 코루틴, Stackless Python의 태스크렛, Icon 및 Python의 제너레이터, Scala의 연속성(2.8부터), Ruby의 파이버(1.9.1부터), Prolog의 백트랙 메커니즘, 기능 프로그래밍의 모노드, 스레드 등이 있습니다.
예
Scheme 프로그래밍 언어에는 제어 오퍼레이터의 call-with-current-continuation(약칭: call/cc)이 포함되어 있으며, 이를 통해 Scheme 프로그램이 제어 흐름을 조작할 수 있습니다.
(정의하다속행 #f) (정의하다(시험) (허락하다((i 0)) ; call/cc가 첫 번째 함수 인수를 호출하여 전달 ; 의 이 점을 나타내는 연속 변수 ; 프로그램은 해당 함수에 대한 인수입니다. ; ; 이 경우 function 인수에 의해 다음이 할당됩니다. ;변수로의 계속-the-continuation. ; (콜/참조회(람다(k) (세트!속행 k))) ; ; 다음에 계속이 호출되면 여기서 시작합니다. (세트!i (+i 1)) i))
위의 내용을 사용하여 다음 코드 블록은 함수를 정의합니다.test
그것이 설정되다the-continuation
향후의 실행 상태로 이행합니다.
> (시험) 1 > (속행) 2 > (속행) 3 > ;는 현재 계속(다음 번에 4개 인쇄)을 저장합니다. > (정의하다또 하나의 속행) > (시험) ;는, 계속을 리셋 합니다. 1 > (속행) 2 > (또 하나의) ;는 이전에 저장된 계속을 사용합니다. 4
이 메커니즘에 대한 자세한 내용은 call-with-current-continuation을 참조하십시오.
코루틴
이 예에서는 코루틴을 개별 [5]스레드로 구현하기 위한 연속 사용 가능성을 보여 줍니다.
;;;; 스레드 스케줄링을 위한 순진한 큐. ;;; "실행 대기 중"의 연속 목록이 있습니다. (정의하다*스태프* '()) (정의하다(빈집털이?) (특수 절차입니까?*스태프*)) (정의하다(큐잉 x) (세트!*스태프* (추가하다*스태프* (목록.x)))) (정의하다(큐잉을 해제하다) (허락하다((x (차*스태프*))) (세트!*스태프* (CDR*스태프*)) x)) ;;; 새로운 스레드 실행(proc)이 시작됩니다. (정의하다(포크 프로세서) (콜/참조회 (람다(k) (큐잉 k) (프로세서)))) ;; 프로세서가 다른 스레드(있는 경우)에 도달합니다. (정의하다(산출하다) (콜/참조회 (람다(k) (큐잉 k) ((큐잉을 해제하다))))) ;; 이로 인해 현재 스레드 또는 전체 프로그램이 종료됩니다. ;;; 다른 스레드가 남아 있지 않은 경우. (정의하다(실밥) (한다면(빈집털이?) (퇴장) ((큐잉을 해제하다))))
위에서 정의한 함수를 통해 공동 멀티태스킹을 통해 스레드를 정의하고 실행할 수 있습니다.즉, 큐 내의 다음 스레드에 제어를 부여하는 스레드입니다.
;;;; 다음 작업을 수행하는 일반적인 Scheme 스레드 본문: (정의하다(인쇄하다 스트레이트) (람다() (허락하다고리 ((n 0)) (포맷 #t "~A~A\n" 스트레이트 n) (산출하다) (고리 (+n 1))))) ;;; 2개의 스레드를 생성하여 실행을 시작합니다. (포크 (인쇄하다 "이건 AAA야")) (포크 (인쇄하다 "안녕하세요 BBB")) (실밥)
이전 코드에서는 다음과 같은 출력이 생성됩니다.
BBB 0의 AAA 0 헬로 BBB 1의 AAA 1 헬로 BBB 2의 AAA 2 헬로...
실행
프로그램은 함수에서 사용하는 변수에 대해 메모리 공간을 할당해야 합니다.대부분의 프로그래밍 언어에서는 콜스택을 사용하여 필요한 변수를 저장합니다.이는 콜스택을 사용하면 빠르고 간단한 메모리 할당 및 자동 할당 해제가 가능하기 때문입니다.다른 프로그래밍 언어에서는 이를 위해 힙을 사용하므로 메모리 할당 및 할당 해제를 위해 더 높은 비용으로 유연성을 확보할 수 있습니다.이 두 구현 모두 [6]연속성과 관련하여 장점과 단점이 있습니다.
프로그래밍 언어 지원
많은 프로그래밍 언어가 다양한 이름으로 퍼스트 클래스 연속성을 표시합니다. 구체적으로는 다음과 같습니다.
- 일반 리스프: cl-cont.커스텀 매크로를 사용할 수도 있습니다.
- C# / VB네트워크:
async
그리고.await
: "나머지 메서드를 계속으로 등록한 후 즉시 발신자에게 돌아갑니다.작업이 완료되면 계속이 호출됩니다."C#의 비동기 프로그래밍 - 요인:
callcc0
그리고.callcc1
- 해스켈:의 속행 모나드
Control.Monad.Cont
- Haxe: Haxe-계속
- 아이콘, 유니콘:
create, suspend, @
연산자: coexpressions(공현식) - Java: Lightwolf javaflow(실행시 또는 컴파일 시 바이트 코드 조작 필요)
- 코틀린:
Continuation
- JavaScript Rhino:
Continuation
- 앵무새:
Continuation
PMC, 모든 제어 흐름에 연속 통과 스타일 사용 - Perl: Coro와 연속성
- Pico:
call(exp())
그리고.continue(aContinuation, anyValue)
- Python: PyPy's
_continuation.continulet
- 라켓:
call-with-current-continuation
(단축:call/cc
) - 루비:
callcc
- 스칼라:
scala.util.continuations
제공하다shift
/reset
- 스킴:
call-with-current-continuation
(단축:call/cc
) - 스몰토크:
Continuation currentDo:
; 대부분의 최신 Smalltalk 환경에서는 VM의 추가 지원 없이도 계속 구현할 수 있습니다. - 뉴저지 표준 ML:
SMLofNJ.Cont.callcc
- 언람다:
c
, 현재 계속 콜의 흐름 제어 조작
클로저 및 적절한 테일콜을 지원하는 언어에서는 프로그램을 연속통과형으로 쓰고 call/cc를 수동으로 구현할 수 있다(연속통과형에서 call/cc는 람다로 쓸 수 있는 단순한 함수가 된다).이것은 Haskell에서 특히 일반적인 전략으로, 여기서 "계속 전달 모나드"(예를 들어,Cont
monad 및ContT
의 모나드 트랜스mtl
라이브러리)적절한 테일콜 지원이 필요한 것은 연속 패스 스타일에서는 함수가 반환되지 않기 때문입니다.모든 콜은 테일콜입니다
웹 개발 중
연속성이 [7][8]실제로 사용된 분야 중 하나는 웹 프로그래밍입니다.연속성을 사용하면 프로그래머가 HTTP 프로토콜의 상태 비저장 특성으로부터 보호됩니다.전통적인 웹 프로그래밍 모델에서는 상태 부족이 프로그램 구조에 반영되어 계산 문제 표현에 매우 적합하지 않은 모델을 중심으로 구성된 코드가 생성됩니다.따라서 연속성을 통해 제어의 반전과 관련된 유용한 속성을 가진 코드를 활성화하고 문제를 방지합니다.Inverting back the inversion of control or, Continuations versus page-centric programming 는 웹 프로그래밍에 적용되는 연속성을 소개하는 문서입니다.
종류.
계속에 대한 지원은 매우 다양합니다.(이미 반환된 후에도) 계속이 반복적으로 호출될 수 있는 경우 프로그래밍 언어는 다시 호출할 수 있는 연속을 지원합니다.다시 호출할 수 있는 연속은 J(점프용) 연산자를 사용하여 Peter J. Landin에 의해 도입되었습니다.이 연산자는 제어 흐름을 절차 호출의 중간으로 되돌릴 수 있습니다.재호출 가능한 연속은 라켓 언어로 "재호출"이라고도 불립니다.그러나 "재진입"이라는 용어의 사용은 멀티스레딩에 대한 논의에서 사용되는 용어와 혼동하기 쉽다.
좀 더 제한적인 종류는 현재 상황을 벗어나 주변 상황으로 도피하기 위해 사용될 수 있는 탈출 연속이다.연속성을 명시적으로 지원하지 않는 많은 언어가 예외 처리를 지원합니다. 예외 처리는 연속성을 이스케이프하는 것과 동등하며 동일한 목적으로 사용할 수 있습니다.C의setjmp/longjmp
또, 스택의 언바인드에만 사용할 수 있습니다.이스케이프 연속은 테일콜 제거를 구현하기 위해서도 사용할 수 있습니다.
연속의 한 가지 일반화는 구분된 연속입니다.계속 연산자는 다음과 같습니다.call/cc
프로그램의 특정 시점에서 나머지 계산 전체를 캡처하고 이 캡처의 범위를 지정하는 방법을 제공하지 않습니다.구분된 연속 연산자는 연속 연산을 구분하는 프롬프트와 다음과 같은 인증 연산자의 두 가지 개별 제어 메커니즘을 제공함으로써 이 문제에 대처합니다.shift
또는control
.따라서 구분 연산자를 사용하여 캡처된 연속은 프로그램 컨텍스트의 일부에 불과합니다.
단점들
속행은 GOTO 문의 함수 표현으로, 같은 경고가 적용됩니다.[9]웹 프로그래밍과 같은 일부 특수한 경우에는 이러한 옵션이 합리적인 옵션이지만 연속성을 사용하면 따라하기 어려운 코드가 발생할 수 있습니다.사실 난해한 프로그래밍 언어 Unlambda는 단순히 "추적이 [10]절망적으로 어려운 경향이 있다"는 이유만으로 call-with-current-continue를 그 특징 중 하나로 포함하고 있다.다음 외부 링크에서 개념을 자세히 설명합니다.
언어학
"계속과 정량화의 본질"에서 Chris Barker는 다음과 같은 "계속 가설"을 소개했다.
일부 언어적 표현(특히 QNP[수치명사구])은 자신의 [11]연속성을 조작하는 표기가 있다.
바커는 이 가설을 NP 의미의 이중성(예를 들어, QNP "모두"가 비양적 명사 구절인 "밥"과 매우 다르게 행동한다는 사실)과 같은 현상을 설명하는데 사용할 수 있다고 주장했다.very car'는 일반적으로 가 아니라 " "", "r", "r " " " "r 등으로 해석되며, " " "r", "r "로 됩니다., \ x , {\ {saw}}, {\{saw}},{\ { {saw {\, y그는 또한 이 생각이 "일반 영어에서의 계량화의 적절한 처리"(PTQ)에서 리처드 몬태규의 접근방식의 자연스러운 연장일 뿐이라는 것을 관찰했다. "뒤늦은 깨달음의 혜택으로, 지속-통과의 제한된 형태는 몬태규의 NP 취급(1973년) PTQ의 핵심에서 분명히 식별할 수 있다.uantifiers"를 클릭합니다.
자연어로 다른 일반적인 현상을 설명하기 위해 연속성을 사용할 수 있는 정도는 현재 [12]연구의 주제이다.
「 」를 참조해 주세요.
- 콜 with current-continuation(전류 포함)
- 클로즈
- ~에서 온
- 연속 통과 스타일
- 흐름 제어
- 코루틴
- 구분된 계속
- 표기 의미론
- 에 가다
- 스파게티 스택
- Quajects는 의존성 주입을 통해 개체 단위로 메서드에 대해 선택 가능한 연속성('콜아웃'이라고 함)을 설정할 수 있는 개체의 유형입니다.
레퍼런스
- ^ a b c d 레이놀즈 1993
- ^ S.R. 러셀은 평가가 LISP의 통역 역할을 할 수 있다는 것을 알고 즉시 손으로 코드화했습니다. 그래서 우리는 통역사와 프로그래밍 언어를 갖게 되었습니다.: John McCarthy, LISP의 역사
- ^ "Steve "Slug" Russell". Computer History.
- ^ Palmer, Luke (June 29, 2004). "undo()? ("continuation sandwich" example)". perl.perl6.language (newsgroup). Retrieved 2009-10-04.
- ^ 헤인즈, C. T., 프리드먼, D. P., 완드, 1984.연속과 코루틴.1984년 LISP 및 기능 프로그래밍에 관한 ACM 심포지엄의 속행(Austin, Texas, 미국, 8월 6일-08일)LFP 84.ACM, 뉴욕, 뉴욕, 293-298
- ^ "Call with current continuation for C programmers". Community-Scheme-Wiki. 12 October 2008.
- ^ "Reading list on XML and Web Programming". Archived from the original on 2010-06-14. Retrieved 2006-08-03.
- ^ "Web Programming with Continuations" (PDF). Archived from the original (PDF) on 2012-09-05. Retrieved 2012-09-05.
- ^ Quigley, John (September 2007). "Computational Continuations" (PDF). p. 38.
- ^ Madore, David. "The Unlambda Programming Language". www.madore.org. Retrieved 19 June 2021.
- ^ Chris Barker, Continuations and Nature of Quantization, 2002 Natural Language Symantics 10:211-242.
- ^ 예를 들어 Chris Barker, Continuations in Natural Language (Continuations Workshop 2004)또는 Chung-chieh Shan, Language Side Effects ("직접 합성, ed")를 참조하십시오. Chris Barker와 Pauline Jacobson, 132-163페이지, Oxford University Press, 2007).
추가 정보
- 피터 랜딘.점프 및 라벨의 일반화 보고서.UNIVAC 시스템 프로그래밍 연구.1965년 8월High Order and Symbolic Computation, 11(2):125-143, 1998년 하요 티엘레케의 서문으로 전재.
- 드류 맥더못과 게리 서스먼입니다Conniver 참조 매뉴얼 MIT AI 메모 259.1972년 5월
- 다니엘 보브로:인공지능 프로그래밍 언어 제어 구조 모델 IJCAI 1973.
- 칼 휴이트, 피터 비숍, 리처드 스타이거.인공지능 IJCAI 1973을 위한 유니버설 모듈러 액터 형식주의.
- 크리스토퍼 스트레이시와 크리스토퍼 P. 워즈워스.계속: 풀점프 테크니컬 모노그래프 PRG-11을 다루기 위한 수학적 의미론.옥스퍼드 대학 컴퓨터 연구소.1974년 1월Christopher P의 서문에 따라 고차 및 심볼릭 계산, 13 (1/2) : 135 - 152, 2000으로 전재.워즈워스.
- 존 C. 레이놀즈제25회 ACM National Conference, 717–740, 1972년 고차 프로그래밍 언어 진행을 위한 정의 통역자.고차 및 심볼릭 계산 11(4): 363-397, 1998년 서문에 전재.
- 존 C. 레이놀즈오토마타, 언어, 프로그래밍에 관한 제2회 토론회의 직접적 의미론과 계속적 의미론의 관계에 대하여LNCS 제14권, 페이지 141-156, 1974.
- Reynolds, John C. (1993). "The discoveries of continuations" (PDF). Lisp and Symbolic Computation. 6 (3/4): 233–248.
- 제럴드 서스먼과 가이 스틸입니다스킴: 확장 람다 미적분 AI 메모 349, MIT 인공지능 연구소, 매사추세츠, 캠브리지, 1975년 12월.고차 및 심볼릭 계산 11(4): 405-439, 1998년에 서문과 함께 전재되었습니다.
- 로버트 히엡, R. 켄트 다이비그, 칼 브루거먼ACM SIGPLAN '90 프로그래밍 언어 설계 및 구현에 관한 회의, 페이지 66-77의 퍼스트 클래스 계속 절차의 존재에 대한 통제를 나타낸다.
- 윌 클링거, 앤 하트하이머, 에릭 오스트1988년 LISP 및 기능 프로그래밍에 관한 ACM 회의의 계속 진행을 위한 구현 전략, 페이지 124–131, 1988.저널 버전:고차 및 심볼릭 계산, 12 (1): 7-45, 1999.
- 크리스티안 퀴넥.제어의 반전, 또는 「계속과 페이지 중심 프로그래밍의 비교」SIGPLAN 통지 38(2), 페이지 57~64, 2003.
외부 링크
- ICFP에서의 ACM SIGPLAN 2011 계속에 관한 워크숍.
- 샘 루비의 커뮤전 연속극
- Dorai Sitaram의 Tournelf Scheme in Fixnum Days는 연속극에 관한 멋진 장을 특징으로 합니다.
- Continuations and Stackless Python by Christian Tismer
- 제4회 계속에 관한 ACM SIGPLAN 워크숍의 온라인 진행
- 제2회 ACM SIGPLAN 지속에 관한 워크숍 온라인 진행
- 연속성, 기능 및 점프
- http://okmij.org/ftp/continuations/ (올레그 키젤료프)
- https://wiki.haskell.org/Continuations
- 연속된 코뿔소
- RIFE 웹 애플리케이션 프레임워크에서 순수 Java로 연속 실행
- RIFE 웹 애플리케이션 프레임워크에서 순수 Java로 계속 디버깅
- 위 예제의 발생원, 코루틴 및 연속성 비교