LINUX.ORG.RU

Сказ о том, как Игнат-молодец Common Lisp в Ынтерпрайз пихал.


3

6

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

***

Предистория. Некоторое время назад работодатель (крупный производственный концерн) обнаружил пробел в IT-инфраструктуре. Было принято решение в пользу in-house разработки, потому что на рынке подобного готового продукта просто нет, а штат разработчиков у нас довольно большой и квалифицированный. Но разработка исторически ведётся на традиционных, статичных, «слабых» языках, в основном Java и C++.

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

***

Вот тут собственно и начинается история. Некоторое время я собирал информацию и готовил доклад, спасибо всем на ЛОРе кто отвечал на мои вопросы о лиспе. Итак, были рассмотрены следующие существенные для промышленного ПО аспекты.

1. Persistence. Общепринятый в современном ПО подход, позволяющий автоматически отображать программные сущности и отношения между ними на таблицы и связи в СУБД. Для Common Lisp индустриальным стандартом де-факто является AllegroCache, хотя это и не «стандарт» в общепринятом смысле, как JPA например. Прозвучал закономерный вопрос «почему надо тратить несколько тысяч $$$ на Allegro, если Hibernate даёт всё то же самое, к тому же оно бесплатно и открыто?» Нет, для холдинга несколько тысяч $$$ - это в общем копейки. Но финансово успешной организацию делает в том числе умение считать каждую копеечку, и тратить деньги обоснованно.

2. Интеграция. Предполагается, что продукт будет состоять из нескольких распределённых модулей, коммуницирующих друг с другом. А также надо будет обращаться к внешней системе через CORBA. Если с коммуникацией CL-CL всё более менее понятно (AMQP, веб-сервисы) то с CORBA оказалось не всё так гладко. Так, стабильного CORBA 3.0 ORB для Common Lisp просто нету. В некотором приближении может устроить ORB, входящий в состав LispWorks. Это ещё несколько тысяч $$$, см. выше насчёт обоснования. Опять-таки, для Java и C++ имеются открытые, бесплатные и стабильные CORBA 3.0 ORBs. Ну и сами лисперы однозначно соглашаются в том, что «Common Lisp и CORBA не предназначены друг для друга», так что тут однозначный неуд.

3. Моделирование. Индустриальный стандарт для моделирования, UML, оказался слабо применим по причине сильных расхождений в семантике между UML/ООП и CLOS. Своих методик моделирования для CL нет. При этом распространено абсурдное мнение, что лучшая модель и документация - это сам код. Боюсь, что происходит оно от незнания UML и непонимания, что подавляющее большинство аспектов, охватываемых UML, в принципе невыразимо ни в каком в тексте. Вообще, наверняка UML можно использовать в некотором приближении, задействуя стереотипы и т.п. Но такой практики просто нет, а в индустрии практика - это всё. Позволить себе наступать на неизвестные грабли можно только в исключительных случаях.

4. Методология. Чётко очерченной методологии разработки для CL как-то тоже не наблюдается. Стандартной IDE у нас считается Eclipse, а для CL стандартом де факто является Emacs+SLIME, что повлечёт переучивание большого числа сотрудников. CUSP для Eclipse оказался довольно сырым поделием, чтобы его реально использовать, придётся инвестировать в его допиливание. Что касается, паттернов проектирования, в принципе многие из них применимы и к Common Lisp. Но практики такой опять же нету. Следовательно, нету опыта и информации.

После этого был задан закономерный вопрос: а каковы, собственно, преимущества CL, ради которых можно было бы стерпеть всё вышеперечисленное?

1. DSL. Довод о простоте создания DSL был сразу воспринят скептически. Оказывается, у нас в организации уже давно используется Scala, на которой написание DSL (причём не ограниченных синтаксисом S-выражений, как в Лисп) гораздо проще и гибче.

2. Code-as-data, кодогенерация и метапрограммирование. При всех преимуществах такого подхода, сильно страдает понимаемость кода и, как следствие, общая поддерживаемость системы. Одно дело, когда код пишет энтузиаст-одиночка. Но ситуацию, когда шестиуровневые навороты кода понятны только автору, индустрия допустить не может. К тому же, современная Java обладает довольно развитыми средствами метапрограммирования, такими как StringTemplate или просто генерация кода на поддерживаемом JVM динамическом языке и тут же исполнение его. А принцип «code as data» вообще рассматривается как нарушение основополагающего в проектировании принципа separation of concerns.

3. Динамический язык и инкрементальная разработка. Динамика языка, при понимании преимуществ, тоже рассматривается скорее как негативное свойство. В промышленном программировании от системы в первую очередь требуется устойчивое поведение. Ситуация, когда поведение может измениться непредсказуемым образом в рантайме - недопустима. Грубо говоря из Common Lisp можно, как из пластилина, слепить что угодно. Но если слепить кувалду, то это будет пластилиновая кувалда, с закономерным выводом о её применимости. Кувалда должна быть всё-таки из металла. Теперь что касается инкрементальной разработки. Она безусловно является сильной стороной, но имеет кое-какие негативные последствия для эффективной командной работы с системами VCS. К тому же, современные Java IDE тоже это умеют: например, в отладчике на живой системе изменить код, тут же перекомпилировать и подгрузить обновлённый класс и продолжить отладку с предыдущего фрейма.

4. Производительность труда разработчика. Это то, что всегда относят к главным достоинствам Common Lisp, но я не нашёл возможностей объективно это доказать. Такие вещи может показать только практика. Если опираться чисто на объём кода, то он будет примерно эквивалентным для примерно эквивалентных проектов на CL и той же Java. На Java ещё и возможен выйгрыш за счёт богатой runtime library и отсутствия необходимости изобретать велосипеды. Так, например, QPX (ядро продукта ITA Software) занимает 500 тысяч строк на Common Lisp.

***

Думаю сами догадаетесь какие выводы сделал Технический комитет относительно будующего языка разработки. А лично я для себя сделал такой вывод. Common Lisp в промышленной разработке можно использовать только для программирования сложных алгоритмов, когда может «выстрелить» динамизм и макросистема. Использовать можно двумя способами: внедрять при помощи ECL в программы на С/С++, или запускать standalone SBCL образ и вызывать его через AMQP или веб-сервисы. На самостоятельное плаванье CL неспособен. Лисп - это юркий и быстрый катер, но в неспокойных водах «энтерпрайза» его плаванье будет недолгим. Там нужны тяжеловесные, хоть и неповоротливые, атомные ледоколы типа Java и C++.



Последнее исправление: Ignatik (всего исправлений: 1)

Ответ на: комментарий от quasimoto

> STM и LW concurrency в библиотеках, а не в RTS - немножко бред, разве нет?

Мы же про JVM говорим. Какой набор инструментов нам жабский рантайм даёт, в тех терминах остальные ништяки и выражаем.

Zenom ★★★
()
Ответ на: комментарий от mv

> Не-не-не, у нас задача: запихать кастомерскую логику в FPGA.

Годное дело. Робота-спекулянта строите? Ежели не секрет чем вам GPU не угодил?

Где можно посмотреть на ваши изделия или это только на ранней стадии разработки? Что вы продавать будете в итоге?

anonymous
()
Ответ на: комментарий от anonymous

Годное дело. Робота-спекулянта строите?

Акселератор для спекуляций.

Ежели не секрет чем вам GPU не угодил?

Медленно и не совсем в тему. На FPGA что угодно слепить можно.

Где можно посмотреть на ваши изделия или это только на ранней стадии разработки?

http://www.novasparks.com, стадия POC'ов.

Что вы продавать будете в итоге?

Серверы с нашей начинкой.

mv ★★★★★
()
Ответ на: комментарий от mv

Спасибо за информацию.

На FPGA что угодно слепить можно.

Конечно. Попробуйте деление с плавающей точкой. Можно конечно, только оно пол кирпича отожрет.

Странно что GPU вам не катит. Вы обещаете 1-1,5 микросекунды на операцию что есть около 1000 клоков на процессоре. Либо около миллиона для какой-нибудь Теслы. Да, лейтенси на I/O будет, далее ежели оно едет на дообработку в компьютер там один хрен все неторпливо хотя бы из-за динамической памяти, кучи шин и прочих прерываний.

Хотя я может чего и не понял из описания.

PS : вообще описание напомнило анекдот про военных которые говорили что компутер на 2 мегагерца делает 2 миллиона стратегических операций в секунду. Рисковые ребята эти американцы — мега респект!

anonymous
()
Ответ на: комментарий от anonymous

Конечно. Попробуйте деление с плавающей точкой.

Плавающей точки в low latency нет. Во-первых, плавающая точка нифига не low latency, а во-вторых, точность нужна абсолютная.

Можно конечно, только оно пол кирпича отожрет.

Stratix IV оооочень большой. Впрочем, альтеровский софт-процессор NIOS2 с поддержкой плавающей точки можно и на гораздо более слабом Cyclone собрать.

mv ★★★★★
()
Ответ на: комментарий от anonymous

Хотя я может чего и не понял из описания.

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

mv ★★★★★
()
Ответ на: комментарий от mv

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

Я так понимаю, что на прерывания вы не заморачиваетесь?

tailgunner ★★★★★
()
Ответ на: комментарий от mv

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

эм, чёт многовато для специализированного аппаратного решения, нет?

shty ★★★★★
()
Ответ на: комментарий от shty

эм, чёт многовато для специализированного аппаратного решения, нет?

Нет, это чертовски мало. К тому же, 1500 нс - это худший случай.

mv ★★★★★
()
Ответ на: комментарий от tailgunner

А чем вы сигналите прибытие данных - флагом в памяти?

Да.

mv ★★★★★
()
Ответ на: комментарий от mv

> эм, чёт многовато для специализированного аппаратного решения, нет?

Нет, это чертовски мало.

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

К тому же, 1500 нс - это худший случай.

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

shty ★★★★★
()
Ответ на: комментарий от shty

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

Какие такие? :) Нужно принимать данные с биржи, декодировать их, поддерживать книгу заказов и слать апдейты наверх :) И при этом не захлёбываться, когда рынок колбасить начинает.

mv ★★★★★
()
Ответ на: комментарий от mv

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

То есть вам принципиально чтобы данные обрабатывались по тикам без какой либо буфферизации, сборки в пакеты и тп?

anonymous
()
Ответ на: комментарий от anonymous

То есть вам принципиально чтобы данные обрабатывались по тикам без какой либо буфферизации, сборки в пакеты и тп?

Ну там есть свои нюансы, но, в принципе, да.

mv ★★★★★
()
Ответ на: комментарий от shty

> ну, я слышал, что ребятки получают такие циферки используя эрланг и стандартное серверное железо (десятки наносекунд на level 1)

100нс на 3ГГц процессоре - это ~330 тактов; PCIe x16 - 4Гбит/с, за 100нс передаст ~50байт (без накладных расходов). Цифры вызывает некоторое недоверие.

tailgunner ★★★★★
()
Ответ на: комментарий от mv

Собственно, у нас есть возможность отправить пакет с заявкой на куплю/продажу ещё до того, как UDP-пакет с биржи полностью из сети пришёл :)

mv ★★★★★
()
Ответ на: комментарий от mv

> отправить пакет с заявкой на куплю/продажу ещё до того, как UDP-пакет с биржи полностью из сети пришёл :)

Ну тогда понятно. Это вам только на FPGA можно реализовать. А это вообще кому-нибудь нужно? Я понимаю одно дело инвестору песню петь, совсем другой коленкор продавать людям за деньги. Пусть даже и за большие.

Решение о заявке тоже FPGA будет? Рисковые ребята.

anonymous
()
Ответ на: комментарий от anonymous

Ну тогда понятно. Это вам только на FPGA можно реализовать. А это вообще кому-нибудь нужно? Я понимаю одно дело инвестору песню петь, совсем другой коленкор продавать людям за деньги. Пусть даже и за большие.

Очередь от дверей офиса и до угла квартала!

mv ★★★★★
()
Ответ на: комментарий от mv

> Очередь от дверей офиса и до угла квартала!

Круто! Удачи вам.

anonymous
()
Ответ на: комментарий от mv

>а во-вторых, точность нужна абсолютная.

Ага, по идее финансовой логике ничего, кроме операций с big integer'ами и не требуется. Может быть только для каких-то областей финансового анализа.

А за хранение денег в формате «с плавающей запятой», нужно торжественно перед строем коллег расстреливать.

Macil ★★★★★
()
Ответ на: комментарий от tailgunner

100нс на 3ГГц процессоре - это ~330 тактов;

эта цифра релевантна для процессоров Xeon и 2-4 процессорной системы?

PCIe x16 - 4Гбит/с, за 100нс передаст ~50байт (без накладных расходов).

для level 1 (bid/ask) должно хватить, если не жадничать

Цифры вызывает некоторое недоверие.

ну я тоже маленько удивился когда услышал, хотя и вида не подал, у меня есть мнение, что может это нас начальство мотивирует чужим положительным примером :)

shty ★★★★★
()

Вспомнилось: опытный программист на фортране может на любом ЯП писать на фортране. С чего бы это?

ugoday ★★★★★
()
Ответ на: комментарий от shty

для level 1 (bid/ask) должно хватить, если не жадничать

Не хватит даже на одну пару price/quantity. Плюс 100 нс по PCIe - это не значит, что оно сразу в L1 приземлится.

Кстати, 70 нс - это примерно сколько времени путешествует 32-битное слово из регистра одного ядра в регистр другого через разделяемый L2. Т.е. один таск пишет одно слово в память, делает барьер, а другой крутится в цикле и ждёт этого слова.

mv ★★★★★
()
Ответ на: комментарий от mv

Не хватит даже на одну пару price/quantity.

50 байт не хватит на одну пару price/quantity? не верю

Кстати, 70 нс - это примерно сколько времени путешествует 32-битное слово из регистра одного ядра в регистр другого через разделяемый L2.

hardware dependent

один таск пишет одно слово в __память__

в память? из регистра в регистр через память - это как из Москвы через Сидней в Лондон летать

shty ★★★★★
()
Ответ на: комментарий от shty

50 байт не хватит на одну пару price/quantity? не верю

uh, oh, байт. Байт хватит :)

hardware dependent

i7-970 - это очень хорошее hardware.

в память? из регистра в регистр через память - это как из Москвы через Сидней в Лондон летать

Из регистра одного ядра в регистр другого кроме как через память никак не попадёшь.

mv ★★★★★
()
Ответ на: комментарий от mv

> hardware dependent

i7-970 - это очень хорошее hardware.

конечно хорошее, но я бы не стал этот опыт применять на серверные платформы параллельным переносом, там всё же сильно отличные решения применяются (кстати, там может цифра и подрастёт)

> в память? из регистра в регистр через память - это как из Москвы через Сидней в Лондон летать

Из регистра одного ядра в регистр другого кроме как через память никак не попадёшь.

ну, у них же пошареный кэш внешний обычно ставится, про эту память речь шла?

shty ★★★★★
()
Ответ на: комментарий от shty

конечно хорошее, но я бы не стал этот опыт применять на серверные платформы параллельным переносом, там всё же сильно отличные решения применяются (кстати, там может цифра и подрастёт)

Какие такие отличные? Ну если z/Architecture или POWER, то да, а так обычные десктопные процы, только с прицепленным маркетоидным буллшитом. Например, производительность вполне себе ноутбучного i7 на sandy bridge и xeon'а на нём же отличаются линейно в зависимости от тактовой частоты.

ну, у них же пошареный кэш внешний обычно ставится, про эту память речь шла?

У x86 нет команды «записать в кэш» или «считать из кэша», всё делается через память. L2 у ядер в одном сокете общее, но я об этом выше и писал.

Вообще, скорость x86 в большой степени зависит от удачности спекуляций, поэтому low latency там плохо получается.

mv ★★★★★
()
Ответ на: комментарий от sdio

> здесь java? C достаточно

Эти компоненты как раз и написаны на С/С++, читайте внимательно.

SQL -> UPDATE


Давно из криокамеры? про ORM слышали вообще? Посмотрю я на вас, как вы будете руками писать SQL INSERT/UPDATE/DELETE/SELECT для сотни таблиц, как будете кешировать и лениво подгружать результаты, как будете вносить патчить код в куче мест когда добавиться/измениться колонка в таблице.

Вот тут как раз подoйдет LISP, лучше чем JAVA


Вы вообще в курсе, что такое бизнес-аналитика и отчётность?

Тупая буферная (прокси) программа на любом языке умеющим работать с CORBA 3


Стремление делать выводы о «тупизне» прокси, не будучи знакомым со спецификацией интегрируемых систем, выдаёт в вас самонадеянного дилетанта.

с штатом программистов >100, из которых несколько что-то слышали о CL


Где я называл конкретное число?

Ignatik
() автор топика
Ответ на: комментарий от iZEN

> Мне всегда казалось, что CORBA нужна прежде всего для интеграции унаследованного кода, в котором невозможно разобраться или переписать. А для новых разрабатываемых программных систем CORBA неуместна ни в каком виде.

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

Ignatik
() автор топика
Ответ на: комментарий от Legioner

> btw Фишка Clojure не в том, что он лисп (тут как раз никаких плюсов нет, и даже можно найти минусы), а в Software Transactional Memory и совершенно другом принципе программирования многопоточных приложений.

Ну а как же макросы и метапрограммирование?

Ignatik
() автор топика
Ответ на: комментарий от vertexua

> Это какие такие части? Хоть где-то?

Например, задание правил для гибких оповещений. Если за последнюю неделю температура или давление превышали определённый уровень больше трёх раз, оповестить главного технолога, и так далее. Правила будут добавляться и редактироваться в рантайме, без остановки системы и уж точно без перекомпиляции. Конечно, тут можно было обойтись стандартным Java EL, но закладываемся чуточку на большее

Ignatik
() автор топика
Ответ на: комментарий от anonymous

> А какже всякие IBMы с ихними Tivoli?

Нет, Tivoli - это линейка продуктов, в основном предназначенная для мониторинга и управления большой экосистемой сетевых устройств, по SNMP (кстати использует CORBA для коммуникации компонентов). У нас всё-таки немножко другая задача

Ignatik
() автор топика
Ответ на: комментарий от anonymous

> Т.е. раньше крупный производственный концерн работал без сбора, обработки, отображения и архивирования информации об объекте управления (пробел же)? Ололо.

А вы похоже никогда не интересовались проблемами автоматизации на производстве. Иначе бы не задавали глупых вопросов. Хотите расскажу, как у нас всё обстояло (и кое-где обстоит) до сих пор?

Показания с оборудования снимаються программой на Паскале. (Ещё хорошо, что турбопаскалевский код 20-летней давности завёлся через fpc практически без допиливания.). Агрегирование делаеться перловыми скриптами, которые выдают CSV, архивируют и заливают по FTP на сервер. Потом желающие берут эту информацию, импортируют в Excel и там анализируют.

Это - не решение, а набор ad-hoc костылей, слегка эволюционировавший за 20 лет. Сегодняшним требованиям оно уже не удовлетворяет. Сегодняшние требования - получение информации в реальном времени, аналитика по большому числу параметров. Это пробел? Безусловно. Причём если бы вы хоть раз побывали на типичном таком производстве, то знали бы, что подобным образом дела до сих пор обстоят у 95% предприятий. Из чего я делаю выводы, что на производстве вы просто не бывали.

Крупный производственный концерн не знает про SCADA/MES системы? Иди

школотроль в толксы про KDE/Gnome.

Анонимный аналитик не знает про то, что существует экспериментальное и homebrew оборудования, для которого готовые SCADA неприменимы в принципе? Наконец, что есть оборудование, которому 20 лет, которое прекрасно работает и никто заменять не собираеться? Вы ещё раз показали насколько вы далеки от реальных производственных задач.

Ignatik
() автор топика
Ответ на: комментарий от kvitaliy

> даже если и знают, NIH-синдром обычно сильнее.

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

а история действительно на придуманную смахивает.


Типа, «кто-то решил использовать лисп на практике» - это сразу фантастика? :)))

Ignatik
() автор топика
Ответ на: комментарий от anonymous

> Можно даже прикинуть, ну пусть каждый получает скажем 1000 в месяц

Сколько? 1000? Знаете, мы всё-таки не в Индии работаем...

заплатить милион за готовое решение


1. поправлю, готовых таких решений не существует, но аутсорсинг разработки на заказ может стоить и больше
2. кто сказал, что вся сотня будеть одновременно трудиться на этот проект? у них и другие дела есть... Планируеться проделать эту разработку и внедрение отделом из 10-15 человек (включая архитекторов и менеджера проекта) за четыре месяца. Следовательно, затраты будут примерно 150-200 тыс. $.

Что не сходится?

Ignatik
() автор топика
Ответ на: комментарий от Rastafarra

> а че за контора такая, куда скалевых граждан берут? я тоже хочу.

пока только с сингапурское отделение берут :) как начнут брать у нас, я могу написать в jabber

Ignatik
() автор топика
Ответ на: комментарий от Macil

> Все, что ты говоришь — верно. Но есть одно «но». А причем тут собственно Лисп вообще, и CL в частности? Тот факт, что «окружение» CL страдает, признают даже его адепты.

А как тогда стоило написать правильно? Что такое вообще - «окружение CL», почему оно рассматриваеться отдельно от языка?

И там, где традиционная объектная модель просасывает с причмокиванием, модель CL очень и очень хорошо работает, в очень полезной области ентерпрайза под названием «разработка бизнес-логики».


Поясните. Где и почему традиционная модель «просасывает», и за счёт чего выигрывает CLOS/MOP? Если можно с примерами

Ignatik
() автор топика
Ответ на: комментарий от Ignatik

>Ну а как же макросы и метапрограммирование?

Это не фишка Лиспов, это не фишка Clojure, это не фишка CL, коль на то пошло. Лисп (сферический, в вакууме) — императивный язык общего назначения. Некотороые реализации добавляют определенное количество метапрограммирования и декларативности, но не сильно больше того, что есть в других языках.

Macil ★★★★★
()
Ответ на: комментарий от mv

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

Делать выводы о сложности и серьёзности проекта, не посмотрев на ТЗ, это отличительная черта лиспера-профессионала? :)

Кстати, систему, похожую по описанию на вашу, наш CTO писал один


«Человек, похожий на прокурора», ага :)

Ignatik
() автор топика
Ответ на: комментарий от Zubok

> И как ты рискнул делать доклад о системе, в которой у тебя нет опыта разработки? Или есть? Я так понял, что нет.

Неправильно понял.

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


Считайте на здоровье.

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


Где речь шла о форсировании? Речь шла о рассмотрении и анализе конкретной технологии-кандидата.

Такие доклады должны делать люди, имеющие реальный опыт командной разработки (необязательно крупномасштабной, хоть какой-нибудь).


Вы считаете, что если доклад делал бы не я, а бородатый гуру-лиспер, которому сам МакКарти жопку подтирал, то результат мог бы быть иным?

Ignatik
() автор топика
Ответ на: комментарий от Macil

>>Ну а как же макросы и метапрограммирование?

Это не фишка Лиспов, это не фишка Clojure, это не фишка CL, коль на то пошло. Лисп (сферический, в вакууме) — императивный язык общего назначения.


Ну почему - не фишка? Вы в каком-нибудь другом языке встречали такие возможности метапрограммирования и использования гомогенных макросов?

Ignatik
() автор топика
Ответ на: комментарий от Ignatik

>почему оно рассматриваеться отдельно от языка

Потому что так и должно быть! Суп — отдельно, тараканы — отдельно.

Поясните.

Возьмем, например, недостижимую мечту всех С++/Java программистов под названием «двойная диспетчеризация»... Или возьмем такие замечательные костыли из GoF как Composite и Visitor. Возьмем простыни из XML для какого-нибудь Spring. В CL такие проблемы решаются сразу и из коробки.

А еще в CL решена проблема работы с т.н. объектами предметной области, лучше где либо я вообще видел. Спасибо, товарищам из Xerox.

Macil ★★★★★
()
Ответ на: комментарий от Ignatik

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

С++?

Еще есть какой-то JSR (запамятовал номер), позволяющий вызывать хуки, задаваемые compile-time аннотациями, плюс еще какие-то расширения, позволяющие работать с AST Java. Еще можно напрямую вмешиваться в байт-код, писать свои class loader'ы.

Scala. Есть возможность писать свои плагины к компилятору (с блекджеком и шлюхами).

и использования гомогенных макросов

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

Macil ★★★★★
()
Ответ на: комментарий от Ignatik

>> И как ты рискнул делать доклад о системе, в которой у тебя нет опыта разработки? Или есть? Я так понял, что нет.

Неправильно понял.

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

Zubok ★★★★★
()
Ответ на: комментарий от Macil

> Потому что так и должно быть! Суп — отдельно, тараканы — отдельно.

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

Возьмем, например, недостижимую мечту всех С++/Java программистов под названием «двойная диспетчеризация»... Или возьмем такие замечательные костыли из GoF как Composite и Visitor.


Composite? Вы ничего не путаете? Composite реализуеться в Common Lisp один-в-один, как в C++/Java. Если не согласны - приведите пример, мы его проанализируем.

«Двойная диспетчеризация» и её реализация в виде Visitor'а - любимый довод лисперов, но учитывая насколько редко это требуеться в реальном мире, он не такой уж весомый.

А еще в CL решена проблема работы с т.н. объектами предметной области, лучше где либо я вообще видел. Спасибо, товарищам из Xerox.


А вот отсюда можно по-подробнее?

Ignatik
() автор топика
Ответ на: комментарий от Macil

> С++?

Александреску головного мозга? Ну вы поняли... :)

Ignatik
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.