Продолжения - очень интересная концепция в программировании, объяснять подробно лень, т.к. она, надо сказать, не очень-то проста, и всех тонкостей я и сам не знаю, поэтому и за точность изложения не поручусь (Мопед не мой, я лишь разместил объяву=) ).
Опишу лишь в двух словах. Продолжения позволяют довольно хитро манипулировать потоком выполнения программы. Представьте себе обычную императивную программу. Исполнение программы - это, по сути, выполнение команды за командой "сверху - вниз". Использование функций, объектов, методов ничего не меняет, оно лишь структурирует программу, но, по сути, это то же линейное выполнение. Так вот, продолжения позволяют провернуть примерно следующее: программа выполняется до некоторой точки (назовем ее A), в этой точке программа как бы "застывает" (для полноценных продолжений это означает что запоминается весь контекст выполнения (переменные, объекты, видимые в этой точке)), и выполнение программы переносится в другую ее точку (B). Далее она продолжает линейно выполняться до некоторой третьей точки (С) после чего, программа возвращается в первоначальную точку A (возможно, принося некоторое возвратное значение из точки C), в точке A восстанавливается сохраненный контекст исполнения, и программа продолжается (отсюда и "продолжение") дальше. Следует отметить что продолжение позволяет многократно возвращаться в точку A, восстанавливать переменные и "продолжаться". Мало того, по слухам, продолжение можно даже сериализовать. Уфф, вроде основные идеи изложил. За более точными определениями и формулировками проследуйте в Википедию или в Гугл.
Чтобы вы оценили всю значимость этих самых продолжений, скажу некоторые умные слова, услышанные где-то на просторах интернета в блогах довольно авторитетных людей =). А именно, продолжения - настолько мощная концепция, что язык, поддерживающий продолжения, может не иметь отдельно вообще никаких других средств программирования (исключений, операторов перехода, условий, блоков кода). Все эти средства с легкостью реализуемы посредством продолжений. Что собственно и демонстрирует широко известный в узких кругах "самый ООП язык" Смоллтолк, возможности которого я восторженно описывал в одном из постов.
Следует отметить, что подобная функциональность достигается довольно хитроумными манипуляциями с си-стеком в реализации того или иного языка программирования. В Java'е - динамическим изменением байт-кода.
Ну настало самое время привести несколько линков. Уже упомянутый ранее веб-фреймворк Seaside, написанный на Smalltalk'е во всю мощь использует силу продолжений. Удачное использование продолжений позволило развить стройную и мощную компонентную модель.
В Java'е тоже имеется full-stack веб-фреймворк RIFE основанный на продолжениях, (продолжения входят в него отдельной библиотекой, т.ч., думается, ничто не мешает использовать их и вне этого фреймворка). Реализация библиотеки основана на манипуляциях с Java байткодом, которые впрочем запрятаны, и о них не стоит беспокоится. Впрочем есть и другие java-реализации продолжений, включая и от jakarta. Очень рекомендую к просмотру ролик (1.9Mb) с презентацией, наглядно показывающий смысл продолжений.
В Python'е что-то близкое к продолжениям предоставляет реализация Stackless Python. Однако в целях практичности продолжения, присутствующие там ранее были заменены облегченной концепцией partial continuations (если не путаю=)). Фактически, можно сказать, что основными примитивами там являются тасклеты и каналы, которые в совокупности позволяют реализовать очень интересные вещи: сопрограммы, легковесные нити (в чем-то аналогичные Erlang'овским). Легковесные нити очень быстры (по сравнению с нитями операционной системы, на одной нити операционной системы может присутствовать очень много легковесных нитей), правда в них требуется явное переключение контекста либо через шедулинг, либо посредством каналов. Кто-то даже провел сравнительное тестирование такой "легкой многопоточности" и получил довольно интригующий результат - Питон в некоторых случаях уделывает Эрланг на его же поле. Впрочем, наверное, не даром именно stackless python реализация многопоточности была выбрана для движка известной RPG многопользовательской онлайн-игры EVE Online.
Есть однако и некоторые сложности с продолжениями. Во-первых, они сложны (извините за тавтологию). Во-вторых, их использование может быть довольно ресурсоемким (запоминать контекст), именно поэтому используются облегченные варианты реализации типа partial continuations с выборочным сохранением контекста. А в веб-фреймворках присутствует еще одно ощутимое неудобство, являющееся прямым следствием реализации - не user-friendly ссылки, например, в Seaside ссылки представляются примерно в таком виде: http://seaside.st/documentation/faq?14&_k=UHOHBZlm&_n&_s=AkYosBcncRoLPbed. Тут присутствуют некие некрасивые параметры _k и _s. Один из них отвечает за состояние текущего продолжения, а другой - за ваше текущее местоположение на сайте (могу путать).
Впрочем, положительный момент - все линки генерируются автоматически (!!!) на основе построенной вами связи между компонентами.
UPD 1. На сайте ibm.com читайте статью Брюса Тэйта "Пересекая границы: Continuation, Web-разработка и Java-программирование". В статье описываются принципы работы веб-фреймворков основаных на продолжениях.
UPD 2. Дополнение по питону. Автор Stackless Python, Кристиан Тисмер сейчас принимает участие в реализации очень интересного проекта PyPy. Это по своей задумке довольно амбициозный проект, суть которой заключается в написании интерпретатора питона на нем самом же, а так же написании компилятора питона (на нем самом же, таки) в другие низкоуровневые языки, включая в бинарный исполнимый код. Такой подход не взят с потолка, как мы помним он используется и в случае Squeak Smalltalk'а. По мнению разработчиков, благодаря гибкости питона, это позволит легко реализовывать разные сложные но полезные концепции (включая те же продолжения, легковесные нити, и т.д.), и, что самое главное, разработчики утверждают, что благодаря реализуемому JIT-компилятору, полученный питон будет быстрее его стандартной C-реализации!
четверг, 23 августа 2007 г.
Немного о Continuations (продолжениях) и легковесных нитях
Автор:
xonix
на
7:40
4
коммент.
Ярлыки: continuations, Erlang, Java, smalltalk, Stackless Python, threading
Подписаться на:
Сообщения (Atom)