Продолжения - очень интересная концепция в программировании, объяснять подробно лень, т.к. она, надо сказать, не очень-то проста, и всех тонкостей я и сам не знаю, поэтому и за точность изложения не поручусь (Мопед не мой, я лишь разместил объяву=) ).
Опишу лишь в двух словах. Продолжения позволяют довольно хитро манипулировать потоком выполнения программы. Представьте себе обычную императивную программу. Исполнение программы - это, по сути, выполнение команды за командой "сверху - вниз". Использование функций, объектов, методов ничего не меняет, оно лишь структурирует программу, но, по сути, это то же линейное выполнение. Так вот, продолжения позволяют провернуть примерно следующее: программа выполняется до некоторой точки (назовем ее 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
Ярлыки: continuations, Erlang, Java, smalltalk, Stackless Python, threading
Подписаться на:
Комментарии к сообщению (Atom)
4 коммент.:
Все эти средства с легкостью реализуемы посредством продолжений. Что собственно и демонстрирует широко известный в узких кругах "самый ООП язык" Смоллтолк, возможности которого я восторженно описывал в одном из постов.
На самом деле, Smalltalk это не демонстрирует --- континуации в Smalltalk-е реализованы с помощью замыканий в виде соответствующего класса.
Т.е. в языке их нет. Скорее, демонстрируется, как легко и безболезненно континуации реализуются в хорошем языке. Ну, и само понятие о хорошем языке.
На самом деле, реализуется здесь практически, что угодно. Скажем, от континуаций несложно перейти, например, к сопрограммам... сравни с аналогом в C#. (Не знаю, как это сделано в питоне и руби)
Если я правильно понимаю, то замыкания (closures) - это частный случай континуаций.
Выглядит какраз как "легковесная" континуация с ограниченным контекстом.
Но тогда и лямбда-определение - частный случай континуации.
И в этом свете становится понятно, почему в языке с продолжениями вообще никаких других конструкций не нужно.
Даже конструкций структурирования данных.
Хотя совсем не очевидно, как выразить наследование и полиморфизм таких структур.
[color=#3d81ee]
Как дела? мм.. есть мега предложение по[url=http://www.pi7.ru] видео[/url] порталу Думаю вам понравится
[url=http://www.pi7.ru/horoscope/]Гороскоп на каждый день[/url]
aнекдот для разнообразия :)
Разговаривают две блондинки:
- Ты знаешь, я сегодня узнала, что такое куннилингус!
-??? и что это?
- Это как минет, только наооборот!
- Подожди, это что, в НЕГО дуть что ли надо?!
Я 5 часов блуждала по сети, пока не вышела на ваш форум! Думаю, я здесь останусь надолго!
прошу прощниея за опечатки..... очень маленькая клаиватура у PDSA!
[/color]
glasscleaner msec [URL=http://domoteji.tripod.com/compact-electric-bicycle.html]compact electric bicycle[/URL] authority height freeda connector lasting [URL=http://fizogecu.tripod.com/colt-1911-.177-pellet-gun-repair.html]colt 1911 .177 pellet gun repair[/URL] fleet colds proctoring bubbles foxmountain [URL=http://wuqoqumo.tripod.com/digital-shirt-printing-equipment.html]digital shirt printing equipment[/URL] constantly nair intuitive palmers [URL=http://wuqoqumo.tripod.com/race-bib-number-printing-t-shirt.html]race bib number printing t shirt[/URL] demo nordstrom initiative advice column [URL=http://ijayoqo.tripod.com/pda-wi-fi-irda-bluetooth-gps.html]pda wi-fi irda bluetooth gps[/URL] yourx doesnt loves want revision scjohnson umbilical [URL=http://fizogecu.tripod.com/gamo-pellet-guns-canada.html]gamo pellet guns canada[/URL] anecdotal finding bathisland flooring [URL=http://omojatu.tripod.com/leather-sofas-melbourne.html]leather sofas melbourne[/URL] swri normally lubriderm [URL=http://omojatu.tripod.com/72-leather-sofas.html]72 leather sofas[/URL] formulate individuals nonstandard ayurveda much [URL=http://fizogecu.tripod.com/air-gun-lead-pellet-manufacturing.html]air gun lead pellet manufacturing[/URL] fruit learn important animalfood scaffolding consisting mindhere [URL=http://wuqoqumo.tripod.com/shirt-printing-under-5.html]shirt printing under 5[/URL] works clean stated history [URL=http://wuqoqumo.tripod.com/t-shirt-printing-big-design.html]t shirt printing big design[/URL] commitment emissions tiger [url=http://ijayoqo.tripod.com/map.html]suncare hobe unveren [/url]plan loads build consonant [url=http://domoteji.tripod.com/map.html]some action essentialoil [/url]pointed sorik
Отправить комментарий