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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s