пятница, 4 декабря 2009 г.

Common Lisp и WEB

Я хотел бы озвучить тезис, который для меня является совершенно очевидным, но который, как мне кажется, не находит широко понимания среди людей, интересующихся Common Lisp. Итак:
Наиболее важная и перспективная область применения Common Lisp это web-технологии
Текущая ситуация в IT такова, что язык, не пригодный для web-разработки, обречён на прозябание и наоборот, язык, цветущий в мире web, будет находить всё новые и новые области применения. Тут хотелось бы заострить внимание на двух мифах.

Миф 1
Есть мнение, что изучение некоторых языков (к коим часть говорящих относит и Common Lisp) является очень важным для развития мышления и т.п. Т.е. нет необходимости и не очень много смысла писать на этих языках реальный софт, достаточно просто уделять их изучению некоторое время. Это можно сравнить с посещением спортивного зала: посидел пару часов над XXX, прокачал мозг, и можешь снова возвращаться в реальный мир Java/C#/т.п. где без сомнения будешь с лёгкость превосходить всех прочих...

Я думаю, что это полный бред. Язык это всего лишь инструмент. Великий скульптор создаст шедевр вооружившись одним только каменным топором, я же, при всём богатстве современных инструментов, не смогу создать даже подобия скульптуры. Ни в одной другой области человеческой деятельности мне не доводилось слышать мнения о принципиальной важности изучения инструментов для развития способностей в этой области. Зато, практически во всех областях (с которыми я сталкивался) отмечается важность изучения предшествующего опыта. И вот загвоздка: среди образцов кода и идей, которые производили на меня впечатление, чаще всего втречается C и PHP. Зачем изучать Lisp, Haskell и т.п., если наиболее ценные образцы кода написаны на языках, которые и изучать то особо не надо (настолько они просты) ...

Миф 2
Ещё говорят, что у каждого языка есть своя область применений и при построении реальных больших систем надо использовать разные языки для разных компонентов, а Common Lisp - язык для программирования искусственного интеллекта. Т.е. например пишем на CL какой-нибудь очень интеллектуальный модуль, а веб-морду к нему делаем на PHP. Ну и т.п.

Я абсолютно уверен, что ни один из утверждающих подобное не пробовал применить свой рецепт на практике. Я вот попробовал, и проблемы взаимодействия, проблемы разделения логики и сопутствующие проблемы дублирования кода однозначно привели меня к мысли, что универсальный язык в проекте должен быть только один. Попытки лёгкой интеграции за счёт использования технологий, подобных COM, .Net, JVM и т.п. порождают проблемы, в значительной степени обесценивающие получаемые преимущества. Да, есть DSL, такие как XSLT, которые восхитительно хороши для решения некоторых частных задач, но смешивать в одном проекте, например, Python, Perl и Common Lisp по крайней мере не разумно.

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

Что мы имеем сейчас
Человек, "реально" (ну т.е. примерно как я :)) смотрящий на вещи и заинтересовавшийся Common Lisp найдёт очень удручающую картину. Использовать CL для написания небольших скриптов и десктопных приложений фактически нельзя, что связано с временем запуска, требования к памяти и размеров генерируемых образов. Ну т.е. теоретически можно, но расчитывать на широкое использование CL на десктопе несколько наивно, он (CL) создавался явно не для этого. Да и вообще, декстоп это не очень интересно. Итак, остаётся веб. Вот тут картина так просто ужасающая, пройдитесь по основным ресурсам, например
Что мы там найдём? Жуткий интерфейс примитивной вики, apache 1.3 и cgi-скрипты, PHP. Картина маслом. Для усиления эффекта можно сразу после этого зайти, например, на jboss.org и сделать какой-нибудь недвусмысленный вывод. Не очень впечатлительные люди могу проигнорировать это и попробовать разобраться с имеющимися библиотеками и это достойно отдельного обсуждения :) Например, если ранее вы писали на C++ и таки не смогли "отстрелить себе ногу", то у вас есть реальный шанс отстрелить себе сразу голову с помощью Weblocks или UCW. Или, если вы настольгируте по cgi-скриптам на Perl, то наверняка вам придётся по вкусу единственная (!) известная библиотека шаблонов html-template. Ну и т.д.

На днях появился пост Why I chose Common Lisp over Python, Ruby, and Clojure - я просто плакал, на фоне жалкой аргументации больше всего запоминается признание того факта, что сделать каркас с помощью RoR или Django было бы намного быстрее.

И, кстати, для любителей творчества Пола Грэма, будет небезынтересно узнать, что Viaweb был переписан на Perl и С++ почти сразу после его ухода :)

Удивительное рядом
Больше всего меня поражает, что под кучей хлама скрывается суть, сам Common Lisp - удивительно мощный и яркий язык. И для него существую такие блестящие реализации, как SBCL. Конечно, это возможно вопреки текущему уровню интереса только благодаря 50 годам непрерывного развития. В последнее время ситуация стала несколько изменяться, стали появляться качественные современные библиотеки, например, ironclad или iolib. И мне кажется, что этот накопившийся хлам можно расчистить. Но для этого нужен прорыв, и этот прорыв должен быть сделан в области web, ибо достижения в других областях никто особо не оценит.

Так вот, я предлагаю вместо бесконечных споров, которые можно наблюдать в интернете, по поводу "мифических свойств" CL, и которые отбирают часы времени только на прочтение, - писать код, писать реальный код, писать реальный код для веб, и да, пусть это будет open source. Если вы хотите способствовать развитию и популяризации Common Lisp, то вы можете сделать это только через реальные проекты, ибо только код имеет ценность. Ну и конечно, надо избавляться от PHP и прочих подобных технологий на ресурсах, связанных с Common Lisp - любой должен быть в состоянии убедиться, что о CL можно не только рассуждать, но и писать на нём реальные системы.

P.S. Если ранее вы не занимались разработкой на Common Lisp для веб, но хотите попробовать - обращайтесь (можно здесь, но лучше на lisper.ru) - буду рад помочь.

26 комментариев:

  1. Замечательная заметка. Готов поддержать и заменить питон на лисп, но для меня остаётся проблемой хостинг.

    ОтветитьУдалить
  2. > Есть мнение, что изучение некоторых языков (к коим часть говорящих относит и Common Lisp) является очень важным для развития мышления и т.п.

    Почему нет? То, что развивает навык решения задач (problem solving) полезно изучать. Есть такие языки, которые позволяют взглянуть на задачу под другим углом, этим они полезны. Пример из личного: разбирался недавно с топологической сортировкой графа и никак не мог понять, зачем в императивной реализации делается то, что делается. Медитирование над диаграммами не помогало. Потом посмотрел Inductive Graphs in functional programming, подумал, и врубился наконец. :)

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

    Да, инструмент, но этот инструмент зачастую определяет способ мышления и решения задач.

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

    "So the problem is—I’ve said this about both Smalltalk and Lisp—they tend to eat their young. What I mean is that both Lisp and Smalltalk are really fabulous vehicles, because they have a meta-system. They have so many ways of dealing with problems that the early-binding languages don’t have, that it’s very, very difficult for people who like Lisp or Smalltalk to imagine anything else." (Alan Kay)

    Ну конечно, я не пытаюсь сказать, что Вы недальновидны и т.п. Просто цитата нравится. :)

    ОтветитьУдалить
  3. @andy128k
    Что за проблемы с хостингом? есть разные варианты, в завимости от того, что за проект(ы)

    @Artyom Shalkhakov
    Фразу Алана Кея я не понял, слишком сложно для меня. А по остальному не знаю что ответить, это просто не соответствует моему опыту, я не вижу на практике связи между способностью программиста решать конкретные задачи и писать качественный код с ... широтой его взглядов.

    ОтветитьУдалить
  4. >Готов поддержать и заменить питон на лисп, но для меня остаётся проблемой хостинг.

    У меня есть тазик (правда виртуальный) на GoDaddy. В течение месяца появится тазик (уже реальный) в UA-IX. Лисп на тазике отднозначно будет. Если нужно -- приютим, не вопрос)

    ОтветитьУдалить
  5. > Weblocks или UCW

    А что не так с continuation-фреймворками? По сравнению с традиционным подходом, web-программирование на продолжениях -- это как ишак против космического корабля =)

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

    ОтветитьУдалить
  6. @swizard
    Я ждал тебя именно с этим вопросом :)
    Веб на продолжениях это была отличная идея для середины 90-х, только 15 лет с тех пор прошло. Сейчас есть набор хорошо продуманных и проработанных стандартов/протоколов для web. И, внимание (!), протокол HTTP был умышленно разработан как протокол без состояния. Это не было следствием недоработки или каких-либо ограничений (что часто встречается), нет. В данный момент продолжения просто не нужны. Ну и у меня подобные фрэймворки неизменно ассоциируются с цирком: вот у нас есть чудо-язык и сейчас мы будет показывать фокусы, "доставать зайца из шляпы". Кстати, по сайту Slava Akhmechet вполне заметно, что его интересуют скорей больше интеллектуальные забавы, чем промышленные системы.

    ОтветитьУдалить
  7. Что делать тем, кому web по уровню интересности - это что-то на уровне 1C?

    ОтветитьУдалить
  8. @13-49
    Ну как что, то же, что и раньше, это тоже может быть важно. Я ведь не сказал, что нужен только веб. Я сказал, что только в веб возможен серьёзный прорыв.

    Кстати, во времена, когда я был крутым С++ программистом, я тоже не любил веб. Собственно, к веб я пришёл именно через Common Lisp :)

    ОтветитьУдалить
  9. Не совсем согласен насчет десктопа.
    Сейчас более-менее крупные приложения что на C++, что, тем более, на жабе или питоне каком-нибудь, стартуют столько времени, и жрут столько памяти, что даже самые жирные рантаймы CL, вроде SBCL, меркнут перед ними.

    С десктопом проблема скорее с application deployment, с виндой(ну глупо отрицать, что десктоп это винда подавляюще большей частью) и с application deployment на винде. SBCL там недопиленный - сегфолтится время от времени, и тредов нет, как и 64битной версии, опять же. У CCL и clisp под вистой и семеркой не работают аналоги save-lisp-and-die. С ECL тоже не все хорошо - взять хотя бы то, что в ограничения размера файла упирается если через msvc++ собран, на самых базовых библиотеках. Да и вот, емнип, ни одна свободная реализация собирать рантайм в виндовое приложение(всмысле, точка входа WinMain) не умеет.

    ОтветитьУдалить
  10. С лиспом я плохо знаком в отличии от веб. Подскажите какие книжки надо прочитать что бы разбираться более менее в лисп. Еще вопрос: трудно ли жить с динамической типизацией?

    ОтветитьУдалить
  11. @love5an
    Да, для больших декстопных приложений, конечно, можно было бы использовать CL, но ведь его не напишешь на пустом месте. Прежде чем писать большие приложение, сначала надо что бы появилось много маленьких, а вот с этим как раз проблемы.

    @andrei
    Для начала достаточно прочитать PCL: http://lisper.ru/pcl/
    А с динамической типизацией жить очень замечательно, особенно если речь о Common Lisp. Прошу заметить, что когда-то я был ярым сторонним статической типизации :)

    ОтветитьУдалить
  12. Каждое слово по делу, но как доказать заказчику необходимость писать проект на лиспе? Или так и развивать только силами энтузиастов? Думаю прорывом стал бы какой либо уникальный ресурс, такой как вики или еще какой. Чтобы можно было ткнуть носом спорщиков и сказать что такое возможно только с лиспом.

    ОтветитьУдалить
  13. @LiteTabs
    Именно по этому я и начал проект lisper.ru. Теперь я разбираю его на отдельные компоненты. Я планировал это с самого начала, но состояние RESTAS не позволяло этого добиться. Я переработал платформу, реализовал cl-closure-template и теперь готов к разделению. Да, платформа ещё очень далека от совершенства, но кое-что уже может. Уже доступна отдельно планета, скоро будет выделена вики, форум и т.п. Каждый из этих компонентов довольно примитивен, но это вопрос времени, тем более, что их развитие не будет привязано к исходному коду lisper.ru. Ну и конечно, мне нужна помощь :)

    ОтветитьУдалить
  14. я в вебе не силен совсем. мое увлечение гисы да кады разномастные. Так что помощник я никудышный =)

    ОтветитьУдалить
  15. > мое увлечение гисы да кады разномастные.
    О, я три года писал под AutoCAD на C++ (ObjectARX) в основном для ГИС-отдела, главная система - система для создания и обработки топопланов :)

    ОтветитьУдалить
  16. > Я думаю, что это полный бред. Язык это всего лишь инструмент. ... Зато, практически во всех областях (с которыми я сталкивался) отмечается важность изучения предшествующего опыта. И вот загвоздка: среди образцов кода и идей, которые производили на меня впечатление, чаще всего втречается C и PHP. Зачем изучать Lisp, Haskell и т.п., если наиболее ценные образцы кода написаны на языках, которые и изучать то особо не надо (настолько они просты) ...
    Это твой опыт. А меня, например, именно Lisp-код и, что важнее, Lisp-подход (для того чтобы понять который, можно даже код особо не читать -- есть c.l.l. с ее бездонными архивами) больше всего учит :)

    > Ещё говорят, что у каждого языка есть своя область применений и при построении реальных больших систем надо использовать разные языки для разных компонентов
    Про это хорошо написано тут: http://olabini.com/blog/2008/06/fractal-programming/. Сегодня как раз буду рассказывать, что Lisp выгодно отличается от других языков тем, что он может быть на всех уровнях этого фрактала

    > Использовать CL для написания небольших скриптов и десктопных приложений фактически нельзя, что связано с временем запуска, требования к памяти и размеров генерируемых образов.
    http://groups.google.com/group/comp.lang.lisp/browse_frm/thread/fbf7bcb5b17df22a

    > Вот тут картина так просто ужасающая, пройдитесь по основным ресурсам
    Cliki.net -- это супер сайт. Более открытой и простой в использовании системы я еще не встречал. И не нужно с ней ничего делать. Если нужен sophistication, есть github. Кстати cliki как раз написан на lisp'е, довольно простой и понятный код, а интерфейс нормальный :))

    > единственная (!) известная библиотека шаблонов html-template
    Наверно, потому что никто не пишет в рамках MVC на Lisp'е (и это хорошо :), поэтому и нет такого интереса к библиотекам шаблонов.

    Честно говоря, надеяться на какую-то оценку чего-то я бы не стал: просто, подавляющему большинству что-то подобное не нужно. Единственное, что стоит делать, на мой взгляд — это приокрывать завесу для тех, кто сам интересуется.
    А так, write code and be happy :)

    ОтветитьУдалить
  17. @Vsevolod
    > Lisp-подход ... больше всего учит :)
    Что такое lisp-way? Для меня это термин-загадка. Я как бы прочитал достаточно много кода, например, читал код из AIMA, и я не вижу там чего-такого "этакого".Я не знаю, что скрывается в бездонных архивах c.l.l. но в течении последнего код мне там интересных обсуждений не попадалось.

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

    > никто не пишет в рамках MVC на Lisp'е
    А причём тут вообще MVC?
    У меня есть другое объяснение. Посмотрите, отсутствует "оффициальный" (ну т.е. описанный в каком-нибудь популярном туториале) способ запуска hunchentoot на 80-ом порту и этот вопрос регулярно всплывает в рассылке, кроме того, для организации "lisp демонов" предлагается использовать абсолютно невменяемые подходы с использование screen либо detachtty. Вспоминаем про библиотеку шаблонов и приходим к выводу, что скорей всего почти никто не пишет серьёзно для веб на Common Lisp.

    Вообщем, для меня совершенно очевидно, что существующая инфраструктура вокруг Common Lisp совершенно не соответствует уровню языка. И об этом надо говорить прямо, не скрываясь за мифическим "lisp way". Это, по крайней мере, даёт надежду на изменения.

    ОтветитьУдалить
  18. >Если оставить в стороне обсуждение его объективных достоинств, а просто посмотреть на него с точки зрения популярицазии, то ужасный, лучшего способа отталкивать новичков трудно придумать.

    +1 я при виде этого сайта решил что лисп мертв с 90 годов. В плане дружественности lisper.ru дает форы всем, имхо минимальный и практичный дизайн более приятен для интересующихся.

    ОтветитьУдалить
  19. Там проблема не в дружественности, а в том, что для каждого раздела перечисленно по двадцать позиций (либ или приложений), 18 из которых мертво. А те две, которые живы, никак не выделены. Народ просматривает четыре или пять, и уходит.

    ОтветитьУдалить
  20. > В данный момент продолжения просто не нужны.

    На минуту показалось, что я на linux.org.ru =)

    Собственно, по этой фразе сразу видно, что ты даже не пытался попробовать написать что-то на продолжениях. Ну да и ладно, дело твое.

    Хотя, конечно, жалко, что такой энтузиазм, как у тебя, уходит в заведомо худшие вещи :)

    ОтветитьУдалить
  21. @swizard
    Напротив, когда-то продолжения для веб произвели на меня глубокое впечатление и я даже соблазнил нескольких товарищей поковыряться с некоторыми таким фрэймворками. Но... это было в начале моего знакомства с web. Теперь же для моей однозначной позиции достаточно понимания того, что продолжения откровенно противоречат архитектурному стилю REST, а значит противоестественны и никогда не будут эффективны в веб. Как раз обидно видеть, что много усилий толковых разработчиков тратиться на разработку заведомо тупиковых решений.

    ОтветитьУдалить
  22. Я в лиспе новичек, но мне нравится простота лиспа. Какие существуют web фреймворки? Что надо сделать для популяризации лиспа? Создать фреймворк аля RoR?

    ОтветитьУдалить
  23. @Andreo
    Информацию по существующим пакетам для веб можно получить здесь: http://www.cliki.net/web, там есть и ссылки на разные фрэймворки. Все эти пакеты находятся в разном состоянии и многие не заслуживают даже упоминания :)

    Наиболее известны и, вероятно, развиты фрэймворки на продолжениях, это:
    Weblocks (http://weblocks.viridian-project.de/)
    UCS (http://common-lisp.net/project/ucw/)
    Core Server (http://labs.core.gen.tr/)

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

    В последнее время получил широкую огласку таже teepeedee2 (http://github.com/vii/teepeedee2), но он известен только благодаря заявленной автором высокой производительности, что реально вызывает сомнения, ибо производительность на приложения типа "Hello world" мало о чём говорит.

    Общая проблема в том, что большинство заявленных фрэйворков трудно посмотреть в работе, т.е. практически нет реальный сайтов, сделанных на них, а для тех, которые есть исходный код не доступен.

    В общем, в результате все этой ситуации я стал разрабатывать свой собственный фрэймворк RESTAS (http://github.com/archimag/restas), он используется на http://lisper.ru/ и в данный момент я могу рекомендовать только этот фрэймворк гы :) Там используются некоторые идеи из RoR (routes), но в целом я считаю, что RoR это ужасное решение, поэтому делать фрэймвокр аля RoR не вижу особого смысла (да это и не получится)

    ОтветитьУдалить
  24. Случайно увидел эту заметку. Слегка прокомментирую... :)
    > но в целом я считаю, что RoR это ужасное решение
    Как человек использовавший RoR примерно в десятке реальных проектов, могу сказать, что это отличное решение. :) Весь вопрос в том "какой именно RoR?"
    Их как бы два: "RoR для публики" и "RoR для своих". Нет, фреймворк один, и даже никакая техническая информация не скрывается. Но вот акценты расставлены совершенно по разному.
    Авторы RoR хорошие пиаршики, и для широкой публики выпячивают те свойства фреймворка, которые эта публика хочет услышать. Но в реальных проектах они не используются, а используется нечто совсем иное. Возможности и архитектурные решения о которых широко не кричат... чтобы не напугать молодежь и менеджеров.
    Например только в паре сообщений в сети упомянуто, что работа над routes была начата для облегчения поисковикам индексирования контента (псевдостатические каталоги).
    Или что REST модель взаимодействия с клиентом противоречит разрекламированной MVC-модели приложения (уровень контроллеров вырождается, а уровень модели становится многослойным).
    И еще много чего в том же духе... в общем, это "другой RoR".
    Кстати, для одного из наших проектов (http://sdelki24.ru) мы думали над вопросом замены платформы на случай если RoR не станет справляться по производительности. При этом, естественно, проект написан на "RoR для своих" ;) и мы подбирали фремворк не с позиции абстрактной "фичастости", а такой чтобы закрывал именно необходимые нам фичи (или их было бы легко дописать). Лидером по адекватности пока оказался ocsigen (ocaml-овский). Вот так ота... сами сперва удивились.

    ОтветитьУдалить
  25. Хотел услышать ваше мнение о newlisp
    http://www.newlisp.org
    там есть модули, ориентированные на web

    ОтветитьУдалить
  26. @Boris

    Мнение простое: о newlisp нельзя говорить серьёзно. Я использую Common Lisp.

    ОтветитьУдалить