Содержание сайта
Главная Новичку Цитаты Реализации Статьи Документация
Компании Программы Ссылки Обсуждение Обсуждение 2 Гостевая

Продолжение всемирной паутины

Андрей Собчук
JabberID: andreis@jabber.ru. ICQ UIN: 46466235.

В последнее время, всё большее внимание к себе привлекает идея использования продолжений (continuations) для построения веб-приложений.

Продолжение это, если говорить упрощённо, то, что будет выполнятся дальше. Продолжения содержат всю информацию, чтобы продолжить выполнения программы с определённой точки. Продолжения похожи на GOTO, так как обе концепции позволяют перепрыгнуть в любое место программы. Но продолжения, в отличие от GOTO, позволяют запрыгнуть только в участок программы с определённым состоянием, которое должно быть сохранено заранее. В то время, как GOTO позволяет запрыгнуть в участок программы с неинициализированными переменными. Люди, знакомые только с традиционными языками программирования, могут представить продолжения, как копию текущего состояния стека и адрес следующей инструкции.

Теперь представим, что любая функция, кроме обычных параметров принимает один дополнительный параметр - продолжение, к которому перейдёт управление после окончания работы функции. Таким образом из функций никогда не происходит возврата. Функции просто продолжают работу продолжений. Такой метод называется "стиль передачи продолжений" (CPS - continuation passing style).

Как можно применить продолжения при разработке веб-приложений? Представим, что в нашем веб-сервере есть функция послатьФормуСПродолжением("имяСтраницы.html"). Эта функция захватывает текущее продолжение и сохраняет его (например сериализует) в скрытой переменной на странице. После нажатия кнопки "Отправить" ("Submit") наше продолжение запускается на выполнение. Таким образом создаётся иллюзия линейного потока выполнения программы.

Это позволяет писать веб-приложения так же, как и "обычное" ("настольное") приложения. Например так:

//В броузере выводится html страница с 1м вопросом
целое1 = спроситьЧисло1("Введите число");
//Выводится страница со вторым вопросом
целое2 = спроситьЧисло2("Введите второе число");
//Выводим результат
if (код1 < код2) {
   показатьОкно("Первое число меньше второго");
} else {
   показатьОкно("Второе число меньше первого или равно ему");
}

Более подробно это разжёвано в ряде дискуссий: 1), 2), 3).

Что даёт такой подход. Сразу же отмечу, что "продолжения для веба" практически бесполезны при создании контентных сайтов. Они подходят именно для веб-приложений.

Основной конечный эффект заключается в том в том, что при написании веб-приложения с применением продолжений, можно ни разу не задуматься о том, что такое "сессия", "GET метод", "POST метод".

Думаю, что первопроходцем в этой области (как и в некоторых других областях) является Пол Грэхем. На данный момент существует довольно много реализаций веб-серверов с продолжениями:

Не обошли разработчики вниманием и Java:
  • Chris Double - разрабатывает фреймворк на SISC-Scheme (интерпретаторе Схемы на Java). Запускается как сервлет в Tomcat. Не поддерживает компонентность a-la Seaside (похоже эту фичу мало кто поддерживает).
  • Apache Cocoon Flow. Для описания потока выполнения использует интерпретатор JavaScript, модифицированный для поддержки продолжений.
  • RIFE - похоже позволяет задавать поток выполнения прямо на Java.

Несмотря на то, что разработка веб-серверов с продолжениями - еще не совсем созревшее направление, уже существует ряд мифов:

Кстати, все новые разработки - Python, Ruby, Perl6 - поддерживают "продолжения" изначально, что позволяет предположить, что у "продолжений для веба" большое будущее.

Если вас интересует больше "практической" информации, вам следует почитать блог Avi Bryant. Если интересует "теории", то посмотрите A Better Web API, Web Programming with Continuations, The Influence of Browers on Evaluators or, Continuations to Program Web Servers, Inverting back the inversion of control or, Continuations versus page centric programming, Interacting on the Web, Automatically Restructuring Programs for the Web, Developing Interactive Web Programs, Programming the Web with High Level Programming Languages,



Есть комментарии? Пишите.