Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 4212 01-04-2008 14:08 | |
Ответ на »сообщение 4210« (Lisp Hobbyist)
___________________________
В том-то и дело, что я, например, как раз не одиночка, и единственным шансом для меня применять ФП в работе может стать лишь достаточно широкое его распространение "в массы". Думаю, среди интересующихся ФП таких большинство.
+1.
Пока ближайшая возможность заинтересовать коллег проглядывается через .NET (F#, а если сильно повезет, то еще и IronScheme).
№ 4211 01-04-2008 12:35 | |
Ответ на »сообщение 4209« (Сергей Осколков)
___________________________
Я довольно часто использую closures в web программировании.
Например:
(dolist (file-name file-list)
(htm (:tr (:td :align "right" title))
(:td (:a :href (web-action (log-and-serve file-name access-type)) file-name)
(:td (fie-size file-name)))))
Здесь генерируется кусок html, табличка с ссылками на файлы.
Линк на файл генерирует функция web-action которая принимает функцию, записывает ее в сессию под каким нибудь случайным неповторяющимся набором букв-цифр, и возвращает это название чтобы прописать его в ссылке.
При этом функция как вы видите оперирует локальными переменными file-name и access-type.
Вот это и есть closure.
№ 4210 01-04-2008 09:24 | |
Ответ на »сообщение 4204« (Jack Of Shadows)
___________________________
Но ведь мы с вами и есть те самые одиночки, у которых есть желание и наконец появилась возможность заниматься любимым делом. Нас всегда будет мало (особенно на этом сайте), но меня это не волнует совершенно.
В том-то и дело, что я, например, как раз не одиночка, и единственным шансом для меня применять ФП в работе может стать лишь достаточно широкое его распространение "в массы". Думаю, среди интересующихся ФП таких большинство. Далеко не все программисты могут уйти в freelance. Причин для этого вполне достаточно, от психологических, до жизненных обстоятельств.
Кстати вчера прикрутил таки clojure к моему java web приложению. Оказалось довольно легко.
Поздравляю. Но, опять-же, если говорить не о freelance, такая возможность выбора инструмента скорее исключение из правила. Некоторым разработчикам на C++ (к счастью, не мне) корпоративные правила предписывают не использовать boost, который уже является стандартом де-факто. Даже такая открытая к инновациям корпорация, как Google, избегает того же Лиспа (об этом, кажется, писал Erann Gat), хоть при этом не боится создавать новые языки типа MapReduce.
№ 4209 01-04-2008 03:39 | |
Ответ на »сообщение 4208« (Jack Of Shadows)
___________________________
Вообще-то это мой пример только в том отношении, что я его привел, а так это пример из статьи про Closures в английской Википедии. Но вы правы, я обратил внимание и написал "хорошая штучка" про сочетание array.Filter и анонимной функции в javasript.
Хотя, авторы статьи, разъясняя этот же пример, написанный на Scheme (а потом замечая, что на javascript - аналогично), пишут, что Closure все равно в этом случае создается и состоит из кода лямбды (в Scheme, а в примере на javascript значит - анонимной функции) и ссылки на переменную threshold, которая является свободной переменной внутри лямбды (анонимной функции в примере javascript).
Действительно, здесь Closure (замыкание) не покидает пределов области видимости функции, в которой оно создано и не "уносит" переменную с собой, поэтому пример наверное не показывает выгоду использования Closure.
Я так это понял. ))
№ 4208 30-03-2008 13:00 | |
Ответ на »сообщение 4206« (Сергей Осколков)
___________________________
Ну это не closure а просто анонимная функция.
Closure это когда функция "закрывает" (close) в себе какую то локальную переменную и уносит с собой, запоминает в себе.
Например если бы в в вашем примере описали в функции bestSellingBooks некую локальную переменную, записали бы в нее некое значение, после чего создали функцию, которая орбащается к этой переменной, и вернули бы эту функцию в качестве результата, то произошла бы интересная вешь.
Как вы знаете локальные переменные живут только внутри scope в которых они созданы. Функция кончилась, и все локальные переменные уничтожаются.
Но в нашем случае, локальная переменная, созданная внутри функции bestSellingBooks не уничтожится, а останется внутри closure функции, которую вы вернете в качестве результата.
Отсюда и название таких функций - closures.
А тот пример который вы привели его и в обычных языках типа паскаля написать можно.
№ 4207 30-03-2008 05:24 | |
№ 4206 30-03-2008 03:22 | |
Ответ на »сообщение 4205« (Geniepro)
___________________________
Почитал после вашего сообщения, что такое closure (замыкание) и с удивлением обнаружил, что оно есть в javascript, на котором я от случая к случаю пишу.
http://en.wikipedia.org/wiki/Closure_(computer_science)
(скрипт неправильно обрезает ссылку на скобке, правильный адрес - до конца)
// Return a list of all books with at least 'threshold' copies sold.
function bestSellingBooks(threshold) {
return bookList.filter(
function(book) { return book.sales >= threshold; }
);
}
Хорошая штучка. ))
№ 4205 30-03-2008 01:12 | |
ФП всё больше проникает в такой мэйнстримище, как С++.
В С++0x появятся лямбда-функции и замыкания (closures).
Интересно, что пишет Херб Саттер (отрывок):
Пример: Печать коллекции в консоль.
Например, допустим, вы хотите распечатать в консоль всю коллекцию виджетов.
for( vector<Widget>::iterator i = w.begin(); i != w.end(); ++i )
cout << *i << " ";
Или мы можем воспользоваться тем, что в С++ уже есть специальный тип ostream_iterator, который умеет делать то, что мы хотим:
copy( w.begin(), w.end(),
ostream_iterator<const Widget>( cout, " " ) );
В С++0х можно просто использовать лямбда-функцию, создаваемую на лету:
for_each( w.begin(), w.end(),
[]( const Widget& w ) );
Примечание. Вариант с лямбдой был единственным, который получился правильным с первой попытки написания!
Ну вот, скоро на С++ можно будет создавать значительно более надёжный софт, благодаря функциональным возможностям! ;о)
№ 4204 28-03-2008 12:39 | |
Ответ на »сообщение 4203« (Lisp Hobbyist)
___________________________
Все верно. Мы уже говорили о причинах, влияющих на спрос на программистов.
Индустрии нужна армия программистов-резервистов, а не горстка функциональщиков-ниндзей.
Поэтому ФП и останутся уделом либо одиночек, либо групп профессионалов, специализирующихся в определенных узких высокотехнологичных нишах (например финансовая система).
Но ведь мы с вами и есть те самые одиночки, у которых есть желание и наконец появилась возможность заниматься любимым делом. Нас всегда будет мало (особенно на этом сайте), но меня это не волнует совершенно.
Кстати вчера прикрутил таки clojure к моему java web приложению. Оказалось довольно легко.
Крррасота! Мой java код и clojure работают в единой сессии. Так что я могу добавлять новые модули к уже существуюей программе, на clojure
Вот вам еще шажок, еще проникновение в самый мейнстрим из мейстримов - web программирование на java.
А clojure между прочим это всего один jar файл в 350 кб.
Так что те кому надо могут пропихгуть его в проект как еще одну open source библиотеку :))
Способы есть, и их становится все больше с каждым днем.
№ 4203 28-03-2008 05:17 | |
Ответ на »сообщение 4198« (Jack Of Shadows)
___________________________
Почему к сожалению ? ФП никогда не выйдет за пределы 10-15% рынка, по вполне обьективным причинам. Это надо воспринимать нормально, без драматизьму.
А время сожалений уже прошло. 10% рынка это огого! Это означает что всем кому надо, могут свободно перейти на ФП. Причем на практически всех мейнстрим программных платформах.
Если говорить о разработчиках-одиночках и стартапах --- может быть, а если о компаниях с устоявшейся технологией и клиентурой --- сомневаюсь. Риски перехода остались, хоть и снижены, а разумный менеджер их наверняка посчитает. Раньше самой весомой причиной было отсутствие инструментов, а теперь ней становится отсутствие подготовленных специалистов. Если начинать проект на ФЯ или на Лиспе, нужно для начала найти компетентных исполнителей. Если на 9 программистов на Java имеется один знаток Haskell, каких специалистов проще найти? Пока владеющих ФЯ будет мало, предпочтение при найме будут отдавать тем, кому легче найти подмогу (или замену, будем реалистами). А отсутствие спроса, в свою очередь, будет тормозить рост количества владеющих ФЯ, и дальше по кругу... И что важнее --- знание ФЯ или знание предметной области? Семеро одного не ждут, писать начнут на том языке, на котором уже может продуктивно работать большинство исполнителей. А опытные исполнители свой опыт приобретать начали лет 10 назад, причем отнюдь не на ФЯ.
Еще одна причина --- legacy code. Никто не откажется от вложенных десятков человеко-лет.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|