2009-09-22 5 views
4

연속을 일급 개체로 표시하는 것에 대해 평준화 된 비평 중 일부는 무엇입니까?첫 번째 클래스 연속 단점

1 등을 계속하는 것이 좋다고 느낍니다. 명령의 실행 흐름을 완벽하게 제어 할 수 있습니다. 고급 프로그래머는 특정 종류의 문제에 대한 직관적 인 솔루션을 개발할 수 있습니다. 예를 들어, 웹 서버의 상태를 관리하는 데 연속성이 사용됩니다. 언어 구현은 연속의 최상부에 유용한 추상화를 제공 할 수 있습니다. 예 : 녹색 실.

이 모든 것에도 불구하고, 첫 번째 클래스 연속에 대한 강력한 주장이 있습니까?

+0

자세히 설명해 주시겠습니까? 예를 들어? – khelll

+11

나는 방금 Lisp에서'(cons a b)'대신 "pros"의 반대 인 "cons"를 의미한다는 것을 깨달았다. –

+0

종결을 의미 했습니까, 아니면 실제로 연속성을 의미 했습니까? – troelskn

답변

4

처음으로 계속 진행하면 계속/cc를 호출합니다. Mark Feelys의 논문으로 시작하는 것이 좋습니다. A better API for first class continuations

다음으로 contunations를 나타내는 다른 방법 인 shift와 reset에 대한 내용을 읽으시기 바랍니다.

2
  1. 대부분의 프로그래머는이를 이해하지 못합니다. 코드를 사용하는 코드를 사용하면 작업 할 수있는 대체 프로그래머를 찾기가 더 어려워집니다.
  2. 일부 플랫폼에서는 계속 구현하기가 어렵습니다. 예를 들어, JRuby는 연속을 지원하지 않습니다.
+0

프로그래머가 연속을 이해하는지 여부는 언어의 목표에 따라 다릅니다. 분명히 이것은 코볼이나 자바에게 나쁜 것이 될 것이다. 그러나 Scheme이나 Haskell과 같은 언어의 경우 요소가 아닙니다. –

0

Call/cc는 고급 기능 프로그래밍의 'goto'입니다 (예 : here).

+0

네,하지만 여러 가지면에서 call/cc는 return 문과 비슷합니다. 가끔씩 사람들은 수익을 사용하여 화를 내지만 대부분의 사람들은 그걸로 괜찮을 것 같습니다. 전화/CC에 불만을 제기 할 경우 원칙적으로 귀환 신고서에 동등한 시간을 부여해야합니다. –

+1

'lambda'는 함수형 프로그래밍의 고토입니다 (예 : http://www.cs.brown.edu/~sk/Publications/Talks/SwineBeforePerl/) –

+4

그건 지나친 단순화입니다. –

0

루비 1.8에서는 구현이 매우 느립니다. 1.9에서 더 좋았고, 물론 대부분의 계획은 처음부터 잘 짜여지고 잘 수행되었습니다.

+1

질문은 다양한 기능의 품질이 아니라 언어 기능에 관한 것입니다. –

4

중요한 이의 제기는 구현 비용입니다. 런타임에서 스택을 사용하는 경우 일류 연속은 특정 시점에서 스택 복사가 필요합니다. 복사 비용은 제어 할 수 있지만 (좋은 전략은 Representing Control in the Presence of First-Class Continuations 참조), 변경 가능한 변수를 스택에 할당 할 수 없음을 의미합니다. 이것은 기능적 또는 대부분 기능 (예 : Scheme) 언어의 문제는 아니지만 OO 언어에 상당한 오버 헤드가 추가됩니다.

7

실제로 연속체를 사용할 수있는 많은 유용한 상황은 이미 특수 언어 구문 (throw/catch, return, C#/Python yield)에 의해 다루어지고 있습니다. 따라서 언어 구현 자들은 자신 만의 솔루션을 구현하는 데 사용할 수있는 일반화 된 형식으로 제공하려는 많은 인센티브를 실제로 갖지 못합니다.

일부 언어에서는 일반화 된 연속성을 효율적으로 구현하기가 어렵습니다. 스택 기반 언어 (즉, 대부분의 언어)는 기본적으로 연속을 만들 때마다 전체 스택을 복사해야합니다.

이러한 언어는 일반적인 스택 기반 모델을 손상시키지 않는 일반적인 연속 기능을 구현할 수 있지만 일반화 된 경우보다 훨씬 효율적으로 구현할 수 있지만 일반화 된 연속성을 구현하는 것은 그만한 가치가 없습니다.

기능 언어는 몇 가지 이유 연속성을 구현 가능성이 더 높습니다 :

그들은 자주 "호출 스택"을 의미 연속 통과 스타일에 구현
  1. 아마 힙에 할당 링크 된 목록입니다. 이렇게하면 현재 프레임을 팝하고 새 프레임을 누를 때 스택 컨텍스트를 덮어 쓸 필요가 없으므로 스택에 대한 포인터를 연속으로 전달할 수 있습니다. (필자는 결코 CPS를 구현하지 못했지만 그것을 이해하고 있습니다.)
  2. 그들은 불변의 데이터 바인딩을 선호합니다. 스택을 생성 할 때 스택이 가리키는 변수의 내용을 변경하지 않기 때문에 이전의 연속성을 훨씬 유용하게 만듭니다.

이러한 이유로 연속성은 대부분 기능 언어 영역에 머물러 있습니다.

+1

+1. 나는 지금도 call/cc와 함께 1 등석을 계속 유지하고 있으며 임의의 "제어 스택 저장"을 지원하기 위해 전체 평가 모델을 변경해야하는 Scheme을 구현하고 있습니다. R. Kent Dybvig은 Scheme에 대한 구현 모델에 대한 논문을 가지고 있으며 이것을 읽음으로써 얻을 수있는 주요 "감정"중 하나는 call/cc를 사용하는 제어 흐름의 자유가 임의적이라는 것이 제어 흐름에 대한 추론에 지옥이된다는 것입니다. inter-language interop (setjmp/longjmp 지원을 포함한 C/Scheme 인터페이스 등) – VermillionAzure

1

1 급 연속성은 코드 내부에서 코드가 반복적으로 변수에 할당되도록 허용하는 언어에서 특히 코드 내부에 대한 추론 능력을 훼손합니다. 왜냐하면 클로저 내부가 다시 털이 많은 방식으로 살아날 수 있기 때문입니다.

. Kent Pitman's complaint about continuations, unwind-protect가 call/cc와 상호 작용하는 까다로운 방법에 대해