Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 1282 20-09-2006 03:55 | |
Ответ на »сообщение 1281« (Артем)
___________________________
Кстати, в новых версиях Пролога (Mercury) отсечение использовать не обязательно.
Не обязательно использовать и в классическом Прологе. Можно даже усилить утверждение: любое средство любого языка программирования использовать не обязательно.
Это, уважаемый, не последовательность, а задание древообразной зависимости.
В Пролог-программе важен порядок расположения клозов (равно как и порядок предикатов в клозе) - при совмещении (unification) просмотр ведется сверху вних слева направо. Поменяйте местами однородные клозы и при этом в общем случае изменится семантика.
Вы не перестаете удивлять своими познаниями в области императивности. :)
Можно только порадоваться: если человек в свои годы не перестал удивляться, значит, у него сохранился стимул к познанию.
Императивность в программировании характеризуется последовательностью команд/инструкций (порядком выполнения) и изменением состояния программы. Состояние программы (программной системы, совокупности программных элементов/компонентов) - это совсем не обязательно (и не только) совокупность состояний переменных. Фактически любая программа на любом ЯП при своем исполнении изменяет свое состояние. Следовательно, последовательность команд/инструкций является наиболее значимой отличительной чертой императивного программирования.
№ 1281 20-09-2006 03:22 | |
Ответ на »сообщение 1280« (bb)
___________________________
Декларативность Пролога имеет известные императивные основы - для Пролог-программы важен порядок расположения клозов (просмотр клозов идет сверху вниз) плюс есть официальный механизм отсечения для бэктрекинга (cut, !). Чистой воды императивность.
Вы не перестаете удивлять своими познаниями в области императивности. :) Однако в плане порядка расположения клозов вы несколько опоздали. Тут уже были попытки обозвать тот же OCaml императивным языком ввиду последовательного просмотра let-выражений. Это, уважаемый, не последовательность, а задание древообразной зависимости. А отсечение - это техника оптимизации (как в ФЯ мемоизация, например). Кстати, в новых версиях Пролога (Mercury) отсечение использовать не обязательно.
№ 1280 20-09-2006 03:11 | |
Ответ на »сообщение 1220« (Артем)
___________________________
>>С чистым ФЯ все просто. Там сам язык не приемлет просто другого подхода.
>Когда мы в институте учили Пролог, глядя на код моих сокурсников мне становилось дурно. Хотя Пролог - это высокоуровневый декларативный язык. Их программы тоже работали, - да они были медленнее, гораздо длиннее, но они тоже работали.
Чему удивляться? Декларативность Пролога имеет известные императивные основы - для Пролог-программы важен порядок расположения клозов (просмотр клозов идет сверху вниз) плюс есть официальный механизм отсечения для бэктрекинга (cut, !). Чистой воды императивность.
№ 1279 20-09-2006 02:59 | |
Ответ на »сообщение 1277« (bb)
___________________________
Многие языки, попав в прокрустово ложе .NET и начав играть по навязанным правилам, потеряли свою индивидуальность И потеря этой оригинальности вызвана тем, что вы должны знать C# (с чем я согласен)? "Оригинальная" аргументация. Где это вы так научились? :)
№ 1278 20-09-2006 02:56 | |
Ответ на »сообщение 1275« (bb)
___________________________
Как говорится, некоторые видят лишь то, что им хочется видеть. Такие фразы, как Меж тем мир ФП – это необычайно интересный мир с множеством находок, практически неизвестных основой массе программистов.
и
Ведь и слепая вера, и слепое отрицание могут причинить только вред
вы не захотели увидеть. Впрочем, это ваши проблемы :)
№ 1277 20-09-2006 02:53 | |
Ответ на »сообщение 1273« (Trurl)
___________________________
>>>С появлением .Net это стало делать удобно и приятно.
Как сказал бы старина Форд, в .Net вы можете легко использовать особенности любого языка, если этот язык - C#.
Трудно с этим не согласиться.
Многие языки, попав в прокрустово ложе .NET и начав играть по навязанным правилам, потеряли свою индивидуальность, от чего выиграл один конкретный язык одной конкретной компании. Имя его - C#.
Равноправие языков в .NET - это фикция. На самом деле любому .NET-программисту приходится смотреть на мир сквозь призму C#. Хочет он того или нет.
№ 1276 20-09-2006 02:50 | |
Ответ на »сообщение 1273« (Trurl)
___________________________
в .Net вы можете легко использовать особенности любого языка, если этот язык - C# В .Net мы можем использовать ЛЮБЫЕ особенности любого языка. Если какой-то язык в .Net не реализован, или реализован не полностью, то это объясняется или тем, что не успели сделать, или что нет надобности, или что кто-то не любит Майкрософт.
Другое дело, что части, ответственные за взаимодействие разных языков должны быть CLS-совместимыми. Так, например, даже в написанной на C# библиотеке классов, если есть вероятность того, что ее может использовать программа на языке, не поддерживающем перегрузку операторов, лучше не использовать таковую. Или наряду с перегрузкой создавать соответствующие обычные методы.
№ 1275 20-09-2006 02:42 | |
Ответ на »сообщение 1263« (Артем)
___________________________
Я тут на rsdn читал одну статью про ФП, там есть классное замечание от редакции. Привожу его полностью.
Все просто. Автор заметки использует известный прием - показательно выпятить не совсем корректную аргументацию в защиту ФП, использующую достижения Erlang. Затем, всенародно уличив в "подмене предмета" некоего "анонимного" апологета ФЯ (из серии "есть мнение"), снисходительно похлопать по плечу сторонников ФП. Потом упомянуть, что автоматическое распараллеливание в ФП все еще на уровне исследований, после чего плавно перейти к основной своей мысли - в C# и C++ это (читай ФП) можно пользовать через библиотеки, так зачем копья ломать?
Увы, такой подход приводит к тому, что функциональное программирование из парадигмы программирования превращается в настоящую религию, отпугивающую многих потенциальных пользователей ФЯ фанатизмом и нетерпимостью.
Пожалуй, то же самое можно смело сказать и в отношении ООП, вообще, и C#, в частности. Но не уверен, что RSDN поднимется до такого уровня критики.
№ 1274 20-09-2006 02:11 | |
Ответ на »сообщение 1249« (Jack Of Shadows)
___________________________
Но вот гарантия того что некая часть программы (Не вся программа а лишь НЕКОТОРАЯ ЕЕ ЧАСТЬ), некие ее модули, некие функции - чистые, без побочных эффектов. Такая гарантия и делает язык чистым ФЯ.
"Гарантия" говорите?
Видите ли какое дело, в том же Delphi можно элементарно использовать функции без побочных эффектов и с таким же успехом называть это чистой (в понимании purely functional) частью языка.
Попробую подвести небольшие итоги по этому вопросу:
1. Есть чистые ФЯ и нечистые ФЯ.
2. При этом в чистом ФЯ (Haskell) есть чистая ФЯ-часть и нечистая ФЯ-часть.
3. Плюс в чистой ФЯ-части (по утверждению Jan-Willem Maessen из MIT) есть "заднее крыльцо", где и прячут вещи с побочным эффектом.
Так за что мы боролись, если в чистом ФЯ преспокойненько втихую можно "химичить"? А неявная "химия" по своим последствиям будет похлеще явной.
№ 1273 20-09-2006 00:14 | |
Ответ на »сообщение 1271« (Артем)
___________________________
>>>С появлением .Net это стало делать удобно и приятно.
Как сказал бы старина Форд, в .Net вы можете легко использовать особенности любого языка, если этот язык - C#.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|