Continuation을 지원하는 언어 Ruby 프로그래밍

정확한 정의는 아니지만, continuation 프로그램 수행 도중의 한 시점을 저장하고 나중에 이 시점으로 다시 돌아올 수 있음을 의미한다. glibc의 setcontext나 Scheme 언어의 call/cc 등이 이런 범주에 들어간다.

최신 언어에는 python만이 stackless python의 영향으로 continuation 개념을 도입한 줄 알았는데 더 찾아보니 Ruby 역시 continuation을 class로 제공하고 있었다.

ruby의 continuation 오브젝트는 Kernel#callcc 를 호출하면 생성되고 이 오브젝트는 return address와 수행 환경(execution state)를 저장하고 있기 때문에 프로그램 수행 도중 callcc block으로 다시 돌아올 수 있다.

continuation이 중요한 의미를 가지는 이유는 coroutine, generator, user level thread 등을 구현할 수 있는 building block이기 때문이다. continuation은 종종 goto with arguments로 표현하기도 하고, 기존의 복잡한 loop construct를 이론상 모두 대체할 수 있다.

RubyFromPython을 읽어보면 ruby의 continuation을 이용해 python의 simple generator를 구현하는 예를 볼 수 있다. 일단 효율적인 측면을 제쳐두면 coroutine이나 user level thread도 continuation 만으로 구현이 가능하다.

문제는 continuation 오브젝트를 만드는데 비용이 어느정도 들며, 이걸 extensive하게 활용했을 때 어떤 문제가 있냐는거다. ruby 메일링 리스트에 callcc가 어떤 점에서 유용하느냐는 질문이 올라온 적이 있는데 사람들은 seaside 프로젝트를 예로 들고 있다. 웹의 새로운 프레임웍을 제공한다는데, 그 근간을 보면 웹페이지를 처리함에 있어 그때 그때 상태를 continuation으로 저장해두면 사용자가 back page를 누르거나 했을 때 그때 당시의 state를 그대로 복원하여 transaction을 처리할 수 있다는 의미로 보인다.

continuation이 프로그래밍에 있어서 새로운 패러다임을 가져올 수 있는 요소임은 분명해 보이나 보다 구체적인 사용 예와 그 비용을 알아봐야겠다.

덧글

  • xeraph 2004/12/16 22:11 # 답글

    아아. 단순히 예외처리 용도로 사용하는 것 외에 그런 활용법이 있었군요-
  • 서광열 2004/12/16 22:43 # 답글

    one shot continuation의 경우 setjmp/longjmp의 예에서 볼 수 있듯이 주로 exception handling에 사용되지만, language가 first class continuation을 제공하면 그 활용 범위가 훨씬 넓어지는 것 같습니다.
  • 호안 2004/12/17 10:24 # 삭제 답글

    continuation 구현 방법을 생각하면 대체적인 비용이 나오겠군. ;) And what is the cactus stack?
  • 최태훈 2013/12/01 13:46 # 삭제 답글

    신기하네요 ㅋㅋ 검색하다가 선배님 블로그에 도착하다니
댓글 입력 영역



메모장

프로필


서씨의 프로필입니다.