Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 532 28-07-2006 15:31 | |
Ответ на »сообщение 530« (Артем)
___________________________
И в Java и в dotNet это выливается в почему-то в Software Factories, а не во встроенные макросы.
Что значит "почему то" ? Разве я не давал ответ на это вопрос ?
Перечитайте: »сообщение 488«
Мартин Фаулер детально разьясняет почему развитие пошло 2-мя разными путями в языках с жестким синтаксисом (внешние DSL) и языках с минимальным и гибким синтаксисом (Внутренние DSL)
Вам нравятся внешние DSL (Визуальные среды, плагины, кодогенераторы), мне нравятся внутренние DSL (макросы в лиспе)
Ходить по кругу мне надоело чесслово.
Тем более с человеком который упорно отказывается пробовать то о чем он спорит.
№ 531 28-07-2006 14:37 | |
Ну, неужели, мир перевернется, если я смогу не писать где-то блоки try –except? А вы уверены, что где-нибудь не возникнет побочный эффект, что где-то наоборот надо будет, чтобы exception вышел на более верхний уровень? Что вам по-другому надо будет обрабатывать ошибку? И как долго с макросами вы будете искать то место, где возникла ошибка?
И что делать, если возможность избавиться от пары строк в программном коде затуманивает сознание и превращает этот прораммный код в некие таинственные письмена, смысл которых может быть непонятен даже автору через некоторое время?
№ 530 28-07-2006 14:12 | |
Ответ на »сообщение 529« (Jack Of Shadows)
___________________________
Я например не могу сравнивать лисповые макросы с CodeDom потому что не пользовался последним. А вы сходу выдаете такие утверждения, как будто 10 лет практиковали и то и другое :))
Ну, вот и чудно, я вам тоже могу дать совет попользоваться другими технологиями 10 лет, а потом уж безаппеляционно заявлять, что Идеал, наконец-то, найден.
Кстати, маленькое лиричесекое отступление. Насчет идеала :) Слова из песни:
Все ищут ответа, где главный идеал
Пока ответа нету – копите капитал :)))
Более того, в dotcom и в java сейчас уделяется пристальное внимание DSL, то есть инструментам создания СПЕЦИАЛИЗИРОВАННЫХ ЯЗЫКОВ конечными пользователями.
И в Java и в dotNet это выливается в почему-то в Software Factories, а не во встроенные макросы. Или вы их всех считаете, выражаясь вашим языком, идиотами? :)
№ 529 28-07-2006 13:30 | |
Ответ на »сообщение 528« (Артем)
___________________________
Позвольте, Вагиф, но ведь подобная красота возможна будет не в Лиспе, а в C#.3.0 В лиспе гораздо более, как это по-мягче сказать, некрасивый синтаксис.
Некрасивый синтаксис - это ваше личное мнение. Для меня лисповый синтаксис красивее любого дельфишного.
Так что давайте не будем обсуждать вкусы, а сконцентрируемся на обьективных реалиях.
А обьектинвые реалии вы уже указали. БУДУТ. Не ЕСТЬ как в лиспе. А БУДУТ.
Да и будут ли вообще - еще большой вопрос.
Linq - долгострой, не известно когда еще появится.
Да и в отличии от лисповых макросов - узко-специализированная вешь.
Про CodeDom - тоже.
Артем, ну вы то откуда можете судить что там более или менее удобно чем лисповые макросы ?
Ведь вы ни тем ни другим не пользовались :))
Я например не могу сравнивать лисповые макросы с CodeDom потому что не пользовался последним.
Когда попробую - смогу составить представление.
А вы сходу выдаете такие утверждения, как будто 10 лет практиковали и то и другое :))
Но, опять-таки, Вагиф, такая модификация языка - редкость.
Редкость ? Это мой макрос, которым я пользуюсь в своей ежедневной работе.
Если посчитать количество макросов во всех лисповых библиотеках, которыми я пользуюсь, то речь идет о нескольких сотнях макросов !!
Редкость ?
Согласитесь, если язык хорошо продуман (и причем не дилетантами, а специалистами), то вводить в него подобного типа макросы нет необходимости.
Гениально! Никто из корифеев, ни Вирт, ни вообще кто либо из создателей любого языка, никогда не ставил под сомнение продуманность лиспа, а также уровень его создателя Маккарти.
Более того, в dotcom и в java сейчас уделяется пристальное внимание DSL, то есть инструментам создания СПЕЦИАЛИЗИРОВАННЫХ ЯЗЫКОВ конечными пользователями.
Применяя вашу логику - если язык хорошо продуман, то никакие DSL начерта не нужны. И все специалисты, работающие в этом направлении - идиоты по сравнению с вами. Ведь они не понимают того что понимаете вы.
Дотаточно всего лишь ХОРОШО ПРОДУМАННОГО ЯЗЫКА. :)))
Артем, я даже обсуждать это не хочу.
Хочу лишь сказать, что всегда существуют альтернативы, и, к сожалению (а может и к счастью) идеального решения нет.
Поразительно! Вы признаете что идеального решения (то есть хорошо продуманного языка на все случаи жизни) нет и быть не может.
Вы признаете что сущетсвуют альтернативы (разные языки с разными возможностями), хотя всего лишь пару строк назад писали что если язык мол хорошо продуман, то никаких альтернатив в виде макросов и не нужно. :))
Кстати, я еще раз повторяю вам свое предложение.
Простейшую задачку я привел.
Открытие и закрытие соединения к БД. Одна из самых широко задействованных задач в дельфи.
Решение в лиспе, которое я использую на практике - тоже привел.
В конце концов, хоть раз на своем опыте убедитесь что же таки легче, сделать это на дельфи при помощи препроцессора, или все таки при помощи тех 4 строчек на лиспе.
Чтобы наконец за всеми вашими многочисленными "более удобно чем в лиспе" или "не вижу разницы" наконец то стоял практический опыт.
№ 528 28-07-2006 13:06 | |
Ответ на »сообщение 527« (Jack Of Shadows)
___________________________
withDatabaseConnection myConnection
begin
Query.SQL.Text := 'select * ...';
Query.Open;
for ...
begin
....
....
end
end
Позвольте, Вагиф, но ведь подобная красота возможна будет не в Лиспе, а в C#.3.0 В лиспе гораздо более, как это по-мягче сказать, некрасивый синтаксис. И, если уж говорить о макросах, то, например, в Nemerle макросы тоже поприятнее будут. Я сейчас как раз читаю про Лисповые макросы и Немерлешные. Но, опять-таки, Вагиф, такая модификация языка - редкость. Согласитесь, если язык хорошо продуман (и причем не дилетантами, а специалистами), то вводить в него подобного типа макросы нет необходимости. Не хочу повторяться про целесообразность самомодификации языка, - мнения могут быть разные. Хочу лишь сказать, что всегда существуют альтернативы, и, к сожалению (а может и к счастью) идеального решения нет.
№ 527 28-07-2006 12:01 | |
Ответ на »сообщение 526« (Артем)
___________________________
Для пользователя именно макросов я не вижу принципиальной разницы, встроены ли макросы в язык, или поставляются в виде плагина.
К сожалению большинство программистов не утруждают себя практикой, остановившись на "не вижу".
Трудно почувствовать разницу между апельсином и яблоком, ни разу не попробовав апельсин :))
Просйтеший пример добавления новой конструкции with-db-connection в язык я уже привел.
Количество необходимой для этого работы тоже.
Попробуйте в качестве упражнения добавить нетчо похожее в дельфи, пусть даже и при помощи препроцессора.
Потом расскажете нам о разнице :))
№ 526 28-07-2006 11:55 | |
Ответ на »сообщение 522« (Jack Of Shadows)
___________________________
То есть если вы захотите дать своим пользователям возможность самим использовать ваши макросы, то вам придется поставлять препроцессор вместе с библиотекой, а также документацию, как его использовать.В лиспе макросы не используются для того чтобы сгенерировать библиотеку из стандартного лиспа и затем поставлять ее.
В лиспе макросы идут как часть исходного кода библиотеки, то есть конечные пользователи используют эти макросы
Для пользователя именно макросов я не вижу принципиальной разницы, встроены ли макросы в язык, или поставляются в виде плагина. Мало того, в случае плагина пользовательможет выбрать для себя удобную модель препроцессора.
№ 525 28-07-2006 11:48 | |
Ответ на »сообщение 520« (Max Belugin)
___________________________
Увы, свойство “мепленья” на Abstract Syntax Tree в данном случае не уникально и, например, dotNet предоставляет гораздо более удобный механизм CodeDOM. Из того факта, что в Лиспе все струтуры (и данные, и, собственно, программа) представлены как списки, и поэтому легко анализируется AST, влечет за собой невероятно скудный синтаксис (тот самый Lost in Stupid Parenthesis). И, в конце концов, вы не думали, почему не получили распространения языки программирования с синтаксисом xml (ведь можно прямо писать в терминах AST) – да потому, что вместо обилия круглых скобок в них было бы обилие угловых.
№ 524 Удалено модератором | |
№ 523 28-07-2006 11:29 | |
Ответ на »сообщение 517« (Сергей Перовский)
___________________________
Когда Вы говорите - "можно использовать внутри лисп-программы любой язык", надо не забывать добавить "если напишете его компилятор".
Ну написать свой язык это конечно шикарная возможность, но крайний случай.
Основное назначение макросов, не писать новый язык, а добавлять новые конструкции в уже существующий, что есть задача гораздо более легкая и практичная.
Приведу пример.
Любой, работавший с Базами данных, знает, что нужно совершать некую последовательность действий, независимо от того что вы делаете.
1. Открыть соединение.
2. Выполнить какую то работу.
3. Закрыть соединение.
Обычно это записывается вот так:
try
myConnection.Open;
Query.SQL.Text := 'select * ...';
Query.Open;
for ...
begin
....
....
end
finally
myConnection.Close;
end;
Однако вот это вот try ... finally end это сродни сишному destroy.
То есть ручно управление рессурсами. Вещь как вы знаете ненадежная, зависимая от программиста.
А программист может и забыть.
В java для управления памятью ввели сборщик мусора. А как быть с управлением другими рессурсами ? Отданы на откуп программисту. Пусть не забывает ставить try...finally, правильно ? :))
А теперь представьте себе что у вас есть возможность парой строчей добавить в дельфи новую конструкцию, которая будет использоваться вот так:
withDatabaseConnection myConnection
begin
Query.SQL.Text := 'select * ...';
Query.Open;
for ...
begin
....
....
end
end
Как видите нет нужды открывать и закрывать соединение. Оно будет ГАРАНТИРОВАННО открыто и закрыто для вас, по окончании блока.
В лиспе я добавляю такую конструкцию с лекгостью:
(defmacro with-db-connection ((var &rest open-args) &body body)
`(let ((,var (sql:connect ,@open-args :if-exists :new)))
(unwind-protect (progn ,@body)
(sql:disconnect :database ,var))))
Вот и все. Язык тот же - лисп, только новый оператор добавился - with-db-connection
Это всего лишь один конкретный пример, использования макросов для автоматического управления рессурсами (соединения к серверам БД).
Возможности макросов простираются от простейших случаев как этот, до создания полноценных встроенных языков (пролог, sql, xml)
Так что утверждать что макросы годны только для создания языков неверно.
Они дают полезную отдачу сразу же, на самом простейшем уровне.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|