Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 232 19-06-2006 04:52 | |
>>>for i := 1 to N do
>>>for j := 1 to M do
>>>B[j,i] := A[i,j];
Кстати этот пример хуже моего.
Здесь нет "дополнительных" переменных, но зато здесь есть целая дополнительная матрица B! Вот где настоящий расход памяти.
№ 231 19-06-2006 04:49 | |
Или в этом примере не хватает комментария. Тогда приношу извинения за эмоции :)
Во всяком случае мне непонятно, откуда функция transp понимает, ЧТО ИМЕННО она должна делать с любой произвольной матрицей?
№ 230 19-06-2006 04:40 | |
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
(define (transp matrix)
(apply map list matrix))
(transp '((0 1 2)
(3 4 5)
(A B C)
(D E F))
)
((0 3 A D) (1 4 B E) (2 5 C F))
>>>Господин torvic привел прекрасный пример...
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Спасибо за "прекрасный" пример :)))
Из него я вижу хотя бы 2 вещи.
1) Господин torvic умеет транспонировать матрицы и записывать результат;
2) Для каждой конкретной матрицы надо сначала транспонировать ее вручную на бумаге, а потом записать результат на языке лисп. Причем сколько матриц, столько будет и программ; А можно попросить показать аналогичный текст решения для матрицы размера 100 на 100 элементов?
№ 229 19-06-2006 02:47 | |
А в приведенном примере вы никакого преимущества не увидели ?
Увидел. Преимущество вызова библиотечного средства над повторной реализацией циклов.
Но вот реализован ли вызов библиотеки как вызов функции или оператора (или чем это считается в Лиспе - не знаю) - здесь разница от меня ускользает.
Вы согласны писать специальные классы в ИЯ вместо циклов, (причем для каждой отдельной заачи придется писать свой собственный класс) только чтобы не признать что в лиспе для этого не надо ничего специального делать ?
Согласен также пользоваться универсальными алгоритмами, заранее написанными кем-то (например STL). :)
Точно так же Вы пользуетесь алгоритмами, заранее реализованными внутри Лиспотеки.
На каком то этапе все программы на всех языках переводятся в машинный код.
Думаю, что Лисп (или его аналог) - ассемблер суперкомпьютеров будущего, которые будут функционировать на рекурсивном принципе, а не (дискретном что ли?) как сейчас.
№ 228 19-06-2006 02:40 | |
Ответ на »сообщение 226« (Гость)
___________________________
Просто думаю, что реально преимущества Лиспа могут сказаться только на значительно более высоком уровне абстракции, чем рассмотрен в этой задаче.
А в приведенном примере вы никакого преимущества не увидели ?
Поразительно!
Вы согласны писать специальные классы в ИЯ вместо циклов, (причем для каждой отдельной заачи придется писать свой собственный класс) только чтобы не признать что в лиспе для этого не надо ничего специального делать ?
№ 227 19-06-2006 02:26 | |
(Извиняюсь за опечатки: тачпад прикалывается).
Уточню свою мысль:
Просто думаю, что реально преимущества Лиспа могут сказаться только на значительно более высоком уровне абстракции, чем рассмотрен в этой задаче.
На том уровне абстракции, когда рекурсия становится выгоднее цикла.
Снизу: Факториал эффективнее считается циклом, чем рекурсией.
Сверху: В природе нет циклов - только рекурсия.
(Что составляет диалектическое единство противоположностей.)
№ 226 19-06-2006 02:17 | |
Ответ на »сообщение 224« (Jack Of Shadows)
___________________________
Если вы мне покажете в строчке
(apply map list matrix))
хотя бы одну функцию специально написанную для транспонирования, то я с вами соглашусь.
Если вы покажете мне исходный текст Лиспотеки, я наверно найду в нём низкоуровневые (на уровне C) циклы, которые, будучи применены к матрице, вызывают её транспонирование. :)
Если передать любую другую функцию, работающюю со списками то получится решение совсем другой задачи.
Это говорит лишь о том, что транспонирование является частным проявлением некоторого более универсального алгоритма, если этот алгоритм применён к двумерному массиву. (Вроде сортировки, перестановки и т.п.)
Тем не менее этот алгоритм уже реализован заранее создателями Лиспотеки на имеративном языке (сях).
Мотор, карбюратор, коробка передач и аккумулятор, все это упрятано в капот машины.
Но делать на основании этого вывод, что нет никакой разницы между ездой на нормальной машине, и ездой на машине, где вся эта машинерия у вас в салоне, и вы во время езды, руками в ней копаетесь, я надеюсь вы не будете. :))
Разумеется нет, т.к. учился в институте в те времена, когда суперкомпьютер будущего - Синклер - был привилегией продвинутых радиолюбителей, а не продвинутых программистов :) .
Ответ на <Сообщение не подписано>:
Сейчас вам возразят, в том плане, что в императивных языках, кто-то уже зарание позаботился и сделал в салоне от двигателя перегородеку из досок. (Я - о "наборах библиотек".)
Я рад, что для Вас, почтеннейший, что библиотека уровня STLдля Вас - "перегородка из досок".
Тем не менее, чтобы делать что-то на высоком уровне, всё равно сначала кто-то что-то должен сделать на низком.
И набор библиотек - это, в общем-то то, что и отличает средствпрограммирования от языка программирования.
P.S. Хочу уточнить, что лично я-то не сомневаюсь, что будущее средств программирования - за чем-нибудь лиспообразным.
Просто думаю, что реально преимущества Лиспа могут сказаться только на значительно более высоком уровне абстракции, чем рассмотрен в этой задаче.
№ 225 18-06-2006 14:15 | |
Ответ на »сообщение 224« (Jack Of Shadows)
___________________________
Но делать на основании этого вывод, что нет никакой разницы между ездой на нормальной машине, и ездой на машине, где вся эта машинерия у вас в салоне, и вы во время езды, руками в ней копаетесь, я надеюсь вы не будете. :))
Сейчас вам возразят, в том плане, что в императивных языках, кто-то уже зарание позаботился и сделал в салоне от двигателя перегородеку из досок. (Я - о "наборах библиотек".) Правда - вот беда - доски обычно неструганные и приходится регулярно из разных мест занозы выковыривать... ;) А вам на это скажут, что доски, во-первых, не всегда неструганные! А, во-вторых, некоторые фирмы на них даже пакатики и постеры на глянцевой бумаге приколупывают (тип - "с девками")... А чинить, кто сам не может - всегда телефончик где-нить в уголке загородки написан.
№ 224 18-06-2006 13:56 | |
Ответ на »сообщение 219« (Гость)
___________________________
Т.е. и в случае Лиспа, и в случае заранее созданной библиотеки классов, изящность решения получается лишь за счёт того, что цикл уже написан кем-нибудь заранее.
Если вы мне покажете в строчке (apply map list matrix))
хотя бы одну функцию специально написанную для транспонирования, то я с вами соглашусь.
Далее в приведенном лисп коде транспонирование получается только потому что функции map передается функция list. Если передать любую другую функцию, работающюю со списками то получится решение совсем другой задачи.
Т.е. типовове решение задач со списками в лиспе носит функциональный характер (передача одних функций в другие), в то время как типовове решешие задач со списками в ИЯ носит императивный характер, т.е. циклы, зачастую вложенные, куча временных переменных. (В случае примера Qwerty аж 4!)
В этом разница, а не в том что в лиспе предусмотритеьно заранее написали функцию транспонирования. :))
В то же время Лисп-для-виндоус, очевидно, на нижнем уровне реализован на Сях (т.е. WinApi). Соответственно, тот же самый цикл с переменными просто упрятал в глубь лисповой библиотеки.
На каком то этапе все программы на всех языках переводятся в машинный код. Надеюсь вы не будете на основании этого делать вывод что разницы между машинным кодом и ЯП для человека нет.
Да циклы, присваивания, все это упрятано. Но делать на основании этого вывод что мол "все равно" это неправильно.
Мотор, карбюратор, коробка передач и аккумулятор, все это упрятано в капот машины.
Но делать на основании этого вывод, что нет никакой разницы между ездой на нормальной машине, и ездой на машине, где вся эта машинерия у вас в салоне, и вы во время езды, руками в ней копаетесь, я надеюсь вы не будете. :))
№ 223 18-06-2006 04:28 | |
Пример с транспонированием, кстати довольно удачен в плане плюсов-минусов подходов, ведь если перевести его на императивный, то схема выполнения будет выглядеть следующим образом:
for i := 1 to N do
for j := 1 to M do
B[j,i] := A[i,j];
Т.е. цикл по всем элементам - затраты времени плюс нет "перекидки по месту" - затраты памяти.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|