Ваш вопрос настолько ёмкий, что на него сложно коротко ответить. Попробую как смогу
прокомментировать.
>Извиняюсь, диалетанский вопрос. А какие коммерческие продукты реализованы на Лиспе. В каких
>областях он получил применение?
>Вот Вы его хвалите, хвалите. А где, кто и для каких реальных задач его использует.
Ссылки:
http://www.franz.com/success - (англ) страница историй успеха
одного из ведущих вендоров Common Lisp
http://www.lisp.org/table/applications.htm - (англ) перечень приложений, написанных на Лиспе
http://www.lisp.org/table/good.htm - (англ) обзор, для чего хорош Лисп
http://www.paulgraham.com/paulgraham/avg.html - (англ) статья о суперуспешном применении Лиспа
для генерации интернет магазинов. Вообще советую
почитать все, что есть на сайте.
http://www.paulgraham.com/iflisp.html - (англ) короткая статья о том, почему Лисп не популярен
и вроде бы нигде не используется.
http://www.lispworks.com - страница еще одного ведущего вендора реализаций Common Lisp
Цитата:
"...Please don't assume Lisp is only useful for Animation and Graphics, AI, Bioinformatics, B2B and
E-Commerce, Data Mining, EDA/Semiconductor applications, Expert Systems, Finance, Intelligent
Agents, Knowledge Management, Mechanical CAD, Modeling and Simulation, Natural Language,
Optimization, Research, Risk Analysis, Scheduling, Telecom, and Web Authoring just because these are
the only things they happened to list." - Kent Pitman
http://lisp.narod.ru/msg.html - (рус) хорошая подборка заблуждений относительно Лиспа, среди
которых "Лисп - это язык функционального программирования".
>Мне из универовского курса Лисп запомнился языком совершенно неподходящим например для GUI
Интересно почему ?
Например Пример описания окна диалога с полем для ввода и списком строк:
(contain
(make-instance 'column-layout :description (list
(make-instance 'text-input-pane)
(make-instance 'list-panel :items
'(first second third)))))
Мне кажется очень удобной библиотека CAPI (Common Application Programmer's Interface)
в одной из коммерческих реализаций Common Lisp (http://www.lispworks.com). Все удобно
и логично, очень смахивает на программирование GUI в Java, однако количество строк кода
требуется поменьше.
> Web приложений
Читайте
http://www.paulgraham.com/paulgraham/avg.html и надеюсь измените свое
мнение. Потому что, IMHO Лисп как раз в этой области имеет самый большой потенциал.
> Application серверов и вообще любых бизнес задач.
Странно, но похоже Лисп как раз идеален для Application серверов. Вы можете поменять любую
функцию или класс прямо в работающем в данный момент приложении без его остановки. Вы можете
добавлять функциональность в приложения 24x7 без всяких доп. интерфейсов и сложных компонентных
моделей.
>, только для научных целей / и разработки спец алгоритмов, хотя честно говоря я его уже забыл,
>наверное просто не в теме ...
Он просто хорошо подходит для сложных и особенно неизведанных задач. Но это же вроде плюс ???
>Ведь помимо самого языка и его парадигмы для коммерческого использования необходима поддержка
>библиотеками самого разного плана. Есть ли это для Лиспа и в каком объеме?
Есть много всего всего, особенно у коммерческих вендоров. Хотя недавно был топик, в котором
пришлось признать, что например для разработки риал-тайм 3D движков для игр маловато поддержки,
но одна из известных компаний умудрилась разработать свой специальный компилятор (GOAL), написать
суперский движок и создать игру на нем (для приставок!!!, у которых очень жесткие ограничения
на память и другие ресурсы):
http://www.franz.com/success/customer_apps/animation_graphics/naughtydog.lhtml
Более того они написали на нем множество инструментов для создания будущих игр и
активно используют Лисп для предвычисления оптимальных параметров отображения сцен
по множеству характеристик.
Когда они после очередного проекта разбирали недостатки и преимущества, то выяснилось, что
единственным недостатком такой технологии в сущности являлся плохой менеджмент проекта, который
ориентировался на то, что программистов для любого языка завались и все языки одинаковой мощности.
Получилось что один спец писал и компилятор и движок (год на компилятор и 2 года на игру), но они
вышли с игрой точно в срок и пишут, что этой точности они обязаны таки Лиспу.
По поводу использования Common Lisp в распределенных вычислениях и кластерных архитектурах
хорошая статья про ITA Software
http://www.paulgraham.com/carl.html
>По поводу быстродействия. А на каких тестах сравнивается?
На всяких. Например разбор регулярных выражений, CL-PPCRE ощутимо перегоняет PERL (зависит
от реализации Common Lisp).
Честно говоря, виндовые реализации Common Lisp на примитивных тестах уступают оптимизированному
С/С++ побольше, чем на 30%, но это можно преодолеть по правилу 20/80 и оптимизировать критические
участки кода получше или сменить алгоритм (Лисп хорошо подходит для быстрой проверки идей).
Некоторые реализации транслируют в Си и требуется просто подобрать хороший компилятор (g++ из
Cygwin не выдержал соревнования с компилером из VStudio 7.1
Я из баловства сравнивал на простеньких тестах вроде сложения всех элементов матрицы 1000x1000
и бинаризации и у меня получилось расхождение порядка: VС++ ~1.5 ms. - CMU Common Lisp ~1.6 ms.
g++ выдал результат за ~14 ms (тот же результат из аналогичной программы на Лисп, транслированной
в Си ~14 ms).
>Лисп ведь функциональный язык, а те же плюсы это уже ООП.
"А мужики-то не знают!" (Цитата) У Вас явно недостаток информации по этому вопросу.
Для улучшения кругозора, наверное стоит ознакомиться с несколькими языками (помимо С++),
в первую очередь рекомендую посмотреть OCaml (http://caml.inria.fr) ,
Haskell (http://www.haskell.org) или Clean (http://www.cs.kun.nl/~clean).
Вы увидите, что ООП и ФП никак друг другу не противоречат и что объектно-ориентированный
подход не панацея, а средство имеющее свою ограниченную область применения.
Оба Ваших утверждения как минимум наполовину не верны:
1) Common Lisp - это язык поддерживающий множество парадигм программирования и Вы можете
реализовать и проверить на нем свою собственную новую парадигму. ФП, ИП, ЛП, АП, ООП - это
не полный список парадигм, которые поддерживает Лисп. Более того Лисп был первым ООП языком,
который был стандартизирован ANSI и по сей день его объектная система CLOS вне конкуренции.
Кстати Лисп - это не язык, это семейство языков, в котором помимо Common Lisp есть например
Scheme.
2) C++ - это гибридный язык и реализация идей ООП в нем мягко говоря не блестящая.
Гибридную суть С++ можно выразить фразой: "С++ is answer, what was the question ?".
Например в Common Lisp из коробки доступна множественная диспетчеризация и специализация
методов на конкретном экземпляре объекта, а также такая рулезная вещь как МетаОбъектный
Протокол (MOP), которая позволяет менять свойства классов, представляя их экземплярами
метаклассов и тем самым добавлять функциональность полностью отогонально имеющейся.
Как в C++ получить и использовать указатель на виртуальный метод ? Я знаю, что все можно
сделать/имитировать, но IMHO обертки над этими имитациями в С++ довольно тяжелы, не очевидны
в использовании (Boost, Loki, Lisp++) и не идут ни в какое сравнение с тем, что можно сделать,
используя макросы Common Lisp.
>Было бы интересно посмотреть исходники небольших тестов, чтобы оценить насколько сравнимы
>алгоритмы, т.е. действительно ли их можно сравнивать.
Честно говоря, меня уже достали сравнения микроэффективности (хотя она тоже важна).
Будь все реализации Common Lisp даже в 10 раз тормознее на каких-нибудь операциях (некоторые
реализации тормозят на массивах), я бы все равно его выбрал по причине кучи других преимуществ,
среди которых есть не встречающиеся ни в каком другом языке:
a) Макросы (не путать с макросами С/С++, в Common Lisp макросы - это программы для написания
программ). Благодаря этому, CLOS сам написан на Common Lisp (и большая часть Common Lisp тоже)
Например в стандарт Common Lisp включен (один из имеющихся) языков для описания итеративных
алгоритмов. Простенький примерчик:
(loop for E across Array
when (> E 0)
sum E into My-sum
when (evenp E)
collect E into Even-list
finally (return (values My-sum Even-list)))
Суммирует все числа больше нуля (любого типа) из массива Array,
составляет список четных чисел и, в итоге, возвращает оба значения.
Весь синтаксис этого языка итераций написан на Лиспе и Вы также можете создать свои
встроенные языки вроде Common SQL, поставляемого вместе с LispWorks:
(select [person_id] [person surname] :from [person])
(connect "personnel")
;(with-transaction
; (insert-records :into [emp] :attributes '(empno ename job deptno) ;
; :values '(7100 "ANDERSON" "SALESMAN" 30))
(update-records [emp] :attributes [deptno] :values 50 :where [= [deptno] 40])
(delete-records :from [emp] :where [> [sal] 300000]))
Примечание: в Common Lisp функция и вообще любое вражение может возвращать
несколько значений одновременно, при чем любое выражение концептуально всегда
возвращает результат, даже если он NIL, то есть все выражения можно использовать
как конструкции типа y = x > 0 ? 0 : x в Си. То есть в переводе на С++ в Common Lisp
возможны такие вещи как:
T sum_elts = { int i; T sum; for (sum=0,i=0;i