Вы читаете журнал [info]pavel_kudinov

Павел Кудинов: дневник трансгуманиста - дела давно минувших дней :-) [entries|archive|friends|userinfo]
pavel_kudinov

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

дела давно минувших дней :-) [Дек. 24, 2009|10:42 pm]
Previous Entry В избранное Поделиться Next Entry
[Tags|, , ]

За годы Perl практики я изобрёл несколько занимательных велосипедов, некоторые из которых до сих пор активно используются, и не только мной.

Всегда мечтал оформить "коробочные" версии, с документацией, в виде модулей на CPAN, однако руки не дошли, да и "коробочность" накладывает обязательства на автора. Позже планировал рассказать на перл-конфах, но к сожалению, на профильную perl-конфу так до сих пор ни разу и не попал :( В общем, пока по мере вдохновения выложу в ЖЖ.

Велосипед 1: RegexML (2006)

Сегодня наткнулся на занимательный блог, в котором автор пытался решить ту же задачу сегодня, что и я в 2006ом: разбор структурированного документа регулярным выражением.

Сегодя существуют другие решения (Дамьен Конвей в 2009г, используя фичи perl5.10, сделал очень похожую штуку Regexp::Grammars), я уже далеко не оригинален, но вдруг кому интересен подход и лаконичность решения:

Исходники и примеры RegexML

1. диалект, которым описываем структурированный формат, например формат XML документов
2. компилятор, который читает описание формата и формирует регулярное выражение + небольшой перл код
3. применяем этот код к строке, например к XML документу - на выход имеем распарсенный XML документ (XML::Parser::Style::Tree совместимый формат вывода)
4. сам диалект - XML валидный документ, поэтому компилятор (п.2) разбирает документы XML Parser'ом, описанным на самом же диалекте (так сказать финт ушами ;). Для первой компиляции использовал обычный XML::Parser

p.s. к сожалению, мой вариант работает в perl 5.8.8+, в 5.10 регэкспы ведут себя иначе, не портировал
СсылкаОтветить

Comments:
From: [info]ru.ivan.fomichev.name
2009-12-24 08:01 pm none (UTC)

(Link)

Круто! Я тоже пробовал с local, но у меня ничего не вышло :-(

А что такое "()()()"? Это зачем?

По какой лицензии можно использовать твой код?
[User Picture]From: [info]pavel_kudinov
2009-12-24 08:08 pm none (UTC)

(Link)

()()() фиксит блуждающий баг perl5.8.8, который я не смог формализовать (тупит, если во вложенной регэкспе больше скобок чем во внешней, но не всегда. с тремя скобками во внешней регэкспе на моих задачах работал стабильно)

я плохо разбираюсь в лицензиях :) код можно использовать без ограничений, ссылка не обязательна, можно выдавать за свой код со всеми вытекающими :)
From: [info]ru.ivan.fomichev.name
2009-12-24 08:18 pm none (UTC)

(Link)

> тупит, если во вложенной регэкспе больше скобок чем во внешней, но не всегда. с тремя скобками во
> внешней регэкспе на моих задачах работал стабильно

Как ты догадался, что надо поставить три скобки? Вуду? :-)

> код можно использовать без ограничений, ссылка не обязательна, можно выдавать за свой код

Э-э-э... Public domain?
[User Picture]From: [info]pavel_kudinov
2009-12-24 08:31 pm none (UTC)

(Link)

судя по wiki - public domain подходит :)

три скобки - скучно по сравнению с тем, чтобы из фичи отката local'ов backtracer'ом получить экстрактинг структурированных данных :)

Там, правда, ещё с производительностью всё очень весело, у меня помню отдельный devel mode был, который итерации замерял, без запрета на backtrace (?>...) почти любая регэкспа уйдёт в экспоненциальный перебор попыток применить себя к строке.

В общем на практике с производительностью приходится быть очень осторожным, из-за чего уровень понимания происходящего должен быть довольно высоким, и использовать инструмент для решения практических задач слишком накладно.

Изначально писал для создания компилятора второй версии шаблонизатора "ChainParser", широко известного в узких кругах ростовских девелоперов (regexml'ка его синтаксиса есть в архиве, надо будет про него тоже написать :)

From: [info]ru.ivan.fomichev.name
2009-12-24 08:39 pm none (UTC)

(Link)

> почти любая регэкспа уйдёт в экспоненциальный перебор

Мне кажется, это уже зависит от того, насколько криво написана грамматика.

> Изначально писал для создания компилятора второй версии шаблонизатора "ChainParser",
> широко известного в узких кругах ростовских девелоперов

Ждем-с :-) А я тогда тоже про свой старый велосипедный шаблонизатор буду статью готовить :-)
[User Picture]From: [info]pavel_kudinov
2009-12-24 08:53 pm none (UTC)

(Link)

>Мне кажется, это уже зависит от того, насколько криво написана грамматика.

если документ удовлетворяет регэкспе - всё разбирается быстро.
если не удовлетворяет (невалидный) - регэкспа начинает ёрзать по нему всеми степенями свободы в надежде примениться.

Особенно интересно, когда документ не может быть невалидным: ChainParser код не умел быть невалидным - всё, что не было валидным кодом, должно было считаться просто "похожим" на управляющий код HTML кодом (в лучших традициях шаблонизаторов :))
From: [info]ru.ivan.fomichev.name
2009-12-24 09:08 pm none (UTC)

(Link)

> если документ удовлетворяет регэкспе - всё разбирается быстро.
> если не удовлетворяет (невалидный) - регэкспа начинает ёрзать по нему
> всеми степенями свободы в надежде примениться.

Если писать грамматику грамотно, "ёрзать" не должно. Тут ведь как с регулярными выражениями. (Или я чего-то недопонимаю.)
[User Picture]From: [info]pavel_kudinov
2009-12-24 09:23 pm none (UTC)

(Link)

да, всё также как в регэкспах. меньше точек, аккуратнее с квантификаторами, не забываем (?>...) где можно.

только то, что в регэкспах "медленно", здесь почти всегда "бесконечно", т.е. количественная проблема переходит в качественную.

банально не получается взять пример строки, начинить её (.*?), добиться работы, а затем "оптимизировать", как в случае с простыми регэкспами.
[User Picture]From: [info]pavel_kudinov
2009-12-24 09:27 pm none (UTC)

(Link)

впрочем .* как раз с тех времён и не пишу в лоб, быстро понимаешь, что даже простые регэкспы, как и любой код, сразу "набело" писать эффективнее
From: [info]ru.ivan.fomichev.name
2009-12-24 09:48 pm none (UTC)

(Link)

Я, может быть, сейчас и ляпну глупость, но, по-моему, оптимизация регулярного выражения ("рекурсивного" ли, обычного ли) выражается в первую очередь не в (?>...) и (.*?), а в изничтожении '|' с помощью раскрутки цикла: http://tinyurl.com/yckapdp (ссылка на Unrolling-the-Loop Pattern в книге J. Friedl Mastering Regular Expressions).
From: [info]ru.ivan.fomichev.name
2009-12-24 09:54 pm none (UTC)

(Link)

Если строить все правые части грамматики по схеме

терминал* (нетерминал терминал*)*

лагов вроде как быть не должно. Другое дело, что в таком духе не всегда легко писать всю грамматику. Но если мне не изменяет память, для любой контекстно-свободной грамматики существует эквивалентная, выражаемая в этом виде.
[User Picture]From: [info]pavel_kudinov
2009-12-24 10:11 pm none (UTC)

(Link)

это тоже, забыл.

в любом случае всё это одно и тоже - подсказка бектрейсеру: чего заведомо не стоит проверять, осуществляемая методом уродования лаконичной регэкспы, описывающей общий случай
From: [info]ru.ivan.fomichev.name
2009-12-25 08:16 am none (UTC)

(Link)

> методом уродования лаконичной регэкспы

Возможно, я извращенец, но мне qr/"[^\\"]*(\\.[^\\"]*)*"/ доставляет гораздо большее эстетическое наслаждение, нежели лаконичное qr/"([^\\"]|\\.)"/
From: [info]ru.ivan.fomichev.name
2009-12-25 08:17 am none (UTC)

(Link)

P. S. звезду забыл
[User Picture]From: [info]pavel_kudinov
2009-12-25 09:26 pm none (UTC)

(Link)

я верю в то, что мы так или иначе движемся в общении с машинами от инструктирования к диалогу, от императивного к декларативному (в нестрогом смысле терминов), поэтому никакой эстетики в этом не вижу, только инструментальное несовершенство (в данном случае - регулярных выражений, причем не реализации, а самой идеи применения конечных автоматов для решения задач data mining'а, это нужно делать концептуально по-другому), вынуждающее меня инструктировать и подсказывать машине, как ей лучше решить ту задачу, которую я могу ей сформулировать гораздо лаконичнее без подробного инструктирования.

сейчас я вообще еретическую с точку зрения инженера мысль выскажу - нам таки следует думать над тем, где взять и как суметь утилизировать googol-flops'ы :) вместо того, чтобы выжимать из наших жалких терафлопсовых (на сегодня) друзей подобие здравого смысла и пользы пошаговыми инструкциями.

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

Мы построили Сеть, создали информационный IP эфир, в котором до сих пор ни одного живого виртуального существа, потому что даже моделирование 1 экземпляра человеческого неокортекса отожрёт у нас 1 - 100 пентафлопсов, которыми мы не располагаем.

Что уж говорить о моделировании эволюции хотя бы в реалтайме, хотя какой смысл в реалтайме, практической ценностью будут обладать только возможность моделировать миллионы лет / секунду в планетарных масштабах :(

а я так хочу успеть побыть Богом хотя бы маленькой виртуальной Вселенной :)

так что регэкспы - гадость, а вся наша технология пока ещё жалкая пародия на то, что нам действительно нужно.

важно не забывать об этом, когда лишний раз захочется упрекнуть молодёжь в поверхностном подходе к решению задач - правда за ними. Haskel круче Perl, Perl круче Си, Си круче asm :) а несогласные - не более чем "суровые челябинские программисты", вымирающие (я надеюсь) мастодонты :)

p.s. спускаясь с неба на землю - я, конечно, тоже напишу не задумываясь первый вариант регэкспы, но эстетики в этом не вижу :( скорее скорбь :)))
From: [info]ru.ivan.fomichev.name
2009-12-25 01:24 pm none (UTC)

(Link)

> А я тогда тоже про свой старый велосипедный шаблонизатор буду статью готовить :-)
Ок. Накатал :-) http://ru.ivan.fomichev.name/2009/12/w-w-w.html
[User Picture]From: [info]pavel_kudinov
2009-12-25 09:02 pm none (UTC)

(Link)

Прочитал, посмотрел исходники - вот типичный пример :) уверен, что "фишка" есть, но не могу её увидеть, сгораю от любопытства - в чём прелесть Вашего "шарика"?

p.s. прошу прощения что отвечаю в своём журнале, у Вас не ЖЖ, а я отсталый - не умею получать уведомления об ответах на мои комментарии в standalone блогах. кстати, это вообще возможно? мне это всегда виделось главной причиной, удерживающей меня в пределах ЖЖ :) френдленту может заменить RSS, авторизацию open-id и ему подобные, а вот что делать с уведомлениями - ума не приложу :( не выходит каменный цветок у Данилы-мастера, не получается полнофункциональной распределённой блогосферы на существующих технологиях :)
From: [info]ru.ivan.fomichev.name
2009-12-25 09:33 pm none (UTC)

(Link)

> сгораю от любопытства - в чём прелесть Вашего "шарика"?

В следующем посте. Надеюсь, что не разочарую :-)

> прошу прощения что отвечаю в своём журнале, у Вас не ЖЖ, а я отсталый -
> не умею получать уведомления об ответах на мои комментарии в standalone блогах

Нашел такую ссылку внизу страницы, может, поможет ("?alt=rss" добавил от себя, без нее будет Atom): http://ru.ivan.fomichev.name/feeds/7671908763826336232/comments/default?alt=rss
[User Picture]From: [info]sharifulin
2009-12-24 09:33 pm none (UTC)

(Link)

Жду описало других велосипедов, типа первую документацию по ним)))
Давай твой dw выложим?))
[User Picture]From: [info]pavel_kudinov
2009-12-24 10:04 pm none (UTC)

(Link)

выложим :)

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

впрочем, с RegexML, ChainParser'ом и MMP не легче, "фишка" инструментального велосипеда обычно не очевидна, в отличие от обычного прикладного велосипеда:

* RegexML - есть же Text::Balanced, Regexp::Grammars, YACC, perl 6 grammars - на пальцах показать "фишку" сложно
* ChainParser - шаблонизатор со странным синтаксисом, "фишка" которого не очевидна
* dw SLICELY - недоделанный class dbi, и попробуй докажи, что ты не верблюд и это совсем про другое
* MMP - после POE мультиплексоры плодятся, как грибы, а "фишку" в пару строк опять не объяснишь

популярные качественные решения - идеальные кубики, в которых "всё есть", а я стараюсь делать идеальные шарики, в которых "ничего лишнего"
From: [info]ru.ivan.fomichev.name
2009-12-25 08:05 am none (UTC)

(Link)

> популярные качественные решения - идеальные кубики, в которых "всё есть",
> а я стараюсь делать идеальные шарики, в которых "ничего лишнего"

Здорово сказано. Но хотя шар гораздо прекраснее куба, в ремесле все-таки приходится использовать именно последние. Создание шаров приносит огромное эстетическое и интеллектуальное удовольствие, но для их последующего использования в продуктах необходимо сделать кубическую оправу, иногда каркасную, иногда помассивнее, в зависимости от объема задач и того, насколько они поставлены на конвейер. К сожалению, ремесло затягивает, как трясина, и время на творчество появляется реже, чем этого бы хотелось, и на развитие своих шариков сил совсем не остается. (Хочется время от времени сказать: "А, к черту все!" - и построить свой велосипед, с блекджеком и шлюхами. И для меня всегда остро стоит вопрос: где грань между истинной гордыней и ложной?)

Короче, в сердце каждого кубика находится шарик.
[User Picture]From: [info]pavel_kudinov
2009-12-25 09:32 pm none (UTC)

(Link)

>Короче, в сердце каждого кубика находится шарик.

ох, если бы! обычно кубики собираются кубиком сразу, никакой сердечника-шарика у них нет :( в этом то и вся проблема спагетти-CPAN'а, да и всего модульного opensource
[User Picture]From: [info]pavel_kudinov
2009-12-25 09:41 pm none (UTC)

(Link)

открою свой секрет: в моём мировоззрении гордыня - ни разу не грех, как и убийство, изнасилование, воровство, войны и прочие прекрасные проявления природного многообразия белковых

Единственный доступный смертным грех - не реализация желаний.

Ценность наших отдельных жизней преувеличена, смысл существования - выполнение разумным существом роли кубита в глобальных квантовых вычислениях, целью которых предположительно является поиск смысла существования самим Богом, хотя скорее - эволюционное усложнение вплоть до технологической сингулярности и рожднения нового Бога (подробнее на тему по тегу "умняк" в моём ЖЖ :)

мы должны делать всё, что хотим, поддаваться страстям, быть ЖИВЫМИ. только тогда наша жизнь внесёт вклад в вычислительную мощность компьютера под названием белковая жизнь.
From: [info]ru.ivan.fomichev.name
2009-12-25 10:37 pm none (UTC)

(Link)

Легко придерживаться таких взглядов, когда по жизни и по работе имеешь дело в основном с умными или хотя бы мыслящими людьми. Одна моя знакомая (не будем называть имен) попала на завод руководить работягами, или дятлами, как она их называет. Думать они не хотят, и работать не хотят, все им чего-то должны, и страсти этих людей просты до безобразия. Суперкомпьютера и суперразума из такого материала не получится. Если и получается какой-то суперорганизм — то это оранус.
[User Picture]From: [info]pavel_kudinov
2009-12-25 10:47 pm none (UTC)

(Link)

суперкомпьютер получается даже из амёб, результат его вычисления - ни много ни мало - самовозникновение сознания в результате естесственного отбора aka удовлетворение рефлекторных желаний простейших на пищу, размножение и выживание.

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

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

не стоит недооценивать ценность питательного бульона, весь вопрос в его количестве :)
[User Picture]From: [info]pavel_kudinov
2009-12-25 11:02 pm none (UTC)

(Link)

иными словами, я обожаю этот жалкий мирок со всеми его перекосами и парадоксами, жалкими людишками в массе своей и прочими мерзостями, т.к. всё это - источник питания для меня и мне подобных.

разум не способен создавать из ничего - его основная цель - извлечение конфетки из говна. и говна должно быть МНОГО :) это - ресурс НАД которым оперирует разум.

сидя за клавиатурами, мы оперируем вычислительным ресурсом, и почти всегда мы ограничены не качеством оперирования, а количеством ресурса. все задачи решаются прямым перебором если ресурсов достаточно.

так вот практически доступный ITшным "умам" N*(гигагерц/мегабод/гигабайт/терабайт) - песочница по сравнению с 6.5млрдами нейронных сетей в черепах "дятлов" * 1,66*10^21 ккал/год энергии, получаемой планетой * 6*10^24кг материи на планете - используя эффект бабочки 1 разум обладает таким потрясающим потенциалом действия, что аж дух захватывает!

ресурс первичен! самая захватывающая задача разума - в утилизации ресурса
From: [info]ru.ivan.fomichev.name
2009-12-25 11:37 pm none (UTC)

(Link)

Если принимать во внимание технологическую эволюцию, я, пожалуй, соглашусь. Я из тех людей, которые на вопрос Geek Test об отношении к компьютерам выбирают ответ: "I'll be first in line to get the new cybernetic interface installed into my skull." И тут будет уже не важно: дятел, хомячок или академик. У Борга для всех найдется работа.
From: [info]ru.ivan.fomichev.name
2009-12-25 06:47 am none (UTC)

(Link)

Эх... А я теперь мучаюсь от тщетной гордыни, что не допереизобрёл этот велосипед самостоятельно. Ведь мысли были о том же: и чтобы эксплойтнуть поведение local при откатах, и чтоб потом сделать bootstrap для грамматики самого парсера...

Но, видимо, в то время - а это я свои старые черновики поднял, года полтора назад уже как прошло - в то время не было времени (или суровой необходимости), а сейчас чего-то не подумав, сразу в дневник ляпнул :-( Вот за что мне нравится www.braingames.ru - это за то, что они, с&ки, никогда ответы не говорят :-)

А вообще, сама задача отличная. Буду такую на собеседованиях задавать :-) Когда точно знаешь, что решение есть, велосипеды, как правило, гораздо проще изобретаются :-)
From: [info]ru.ivan.fomichev.name
2009-12-25 07:17 am none (UTC)

(Link)

А гордыня-то ложная :-D

Caught somewhere in the middle are the people who have a balanced
view of how much abstraction is good, but who jump the gun on writing
their own abstractions when they should be reusing existing code.
-- Larry Wall "Programming Perl"

Ну тогда и не буду больше расстраиваться :-)
From: [info]ru.ivan.fomichev.name
2009-12-25 07:24 am none (UTC)

(Link)

Нет, не получается не расстраиваться :-( Это, наверное, вообще не гордыня, а совсем другой диагноз :-/
[User Picture]From: [info]pavel_kudinov
2009-12-25 11:19 am none (UTC)

(Link)

Ларри вообще имеет отвратную точку зрения на то, как следует использовать его язык :) он сделал отличный Perl, но я всё больше считаю, что это у него случайно получилось :) впрочем, за TMTOWTDI ему будет даровано прощение на небесах :)
From: (Anonymous)
2011-03-05 05:39 am none (UTC)

DoctorPavlov

(Link)

Российская федерация

Девушки :)