Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 1552 15-11-2006 03:30 | |
Ответ на »сообщение 1548« (Geniepro)
___________________________
По использованию памяти программы на Лиспе и Яве почти совпадают и значительно хуже, чем у С/С++, что, впрочем, и не удивительно.
Ну, дык, всё познаётся в сравнении...
Вы предложите прграммисту начала 60-х - начала 70-х работать на том же Си++ - он ужаснётся росту исполняемых файлов! И это - в компилируемом языке! :о)
В последней версии своей части я всё перекатал обратно на Си. Снижение объёмов (хоть со strip, хоть без) - больше чем на порядок. Для случая организации в виде динамических бибиотек соотношение лучше, но не настолько существенно, что бы восторгаться... :о)
Что такое будут 128 Тб ОЗУ через десять лет? :о)
№ 1551 15-11-2006 01:41 | |
Ответ на »сообщение 1537« (Сергей Перовский)
___________________________
Представьте себе, что астроном заявит, что по его расчетам Земля столкнется с крупным астероидом, и на Ваш резонный вопрос "Когда?" скажет:
<<<"это произойдёт, когда выполнятся условия ...(перечисление условий)".
Мы имеем дело с разными моделями и по разному интерпретируем термины.
Если мы, всего навсего, пытаемся произвести некоторые вычисления, например расчитываем напряженное состояние конструкции, то время появляется только из за последовательности шагов алгоритма и от него можно абстрагироваться - ура функциональному программированию.
Если мы моделируем работу аэропорта в критической ситуации, для нас важно время, идущее в нашей модели.
Я не могу позволить себе сказать: "при условии перегрузки таких то ресурсов аэропорт будет закрыт", мне необходимо явно указать, что "это произойдёт в АА часов ББ минут ВВ секунд".
Имитационное моделирование представляет собой эксперимент, проводимый над моделью системы. И модельное время, с точки зрения экспериментатора - объективная реальность. И состояния всех элементов в интересующий нас момент времени - объективная реальность. И как тут приложить функциональный подход?
Повторюсь - ООП недаром было придумано специалистами по имитационному моделированию задолго до того, как вошло в языки общего назначения.
Уважаемый коллега. Но своим постом, вы как раз и утвеждаете, что "время" в моделировании НЕ является объективной реальностью, а именно - АБСТРАКЦИЯ.
Первые учёные измеряли интервалы чего-то "условно протяжённого" ЧЕРЕЗ НАБЛЮДАЕМЫЕ ПРОЦЕССЫ.
Галилей изучал ускорения, по количеству песка, высыпающегося из воронки, пока шарик не скатится по доске. Или считали количество упавших капелек.
"Мы прибудем в город через три дня пути". Здесь у возницы телеги уже высшая абстракция. Он просто знает, что, при заданной нагрузке на телегу, кормёжке лошади и качестве дороги, лошадь, расходуя свои силы (затрачивая энергию), сумеет "намотать" на обод колёс это расстояние именно за столько "упавших капелек". Количество капелек тоже зависит от жидкости (её свойств), природных погодных условий и диаметра дырочки "капельнецы". Но в данном случае возницу это не интересует. Ему ближе введённая АБСТРАКЦИЯ - ВРЕМЯ.
То же самое и в имитационном моделировании. Вы просто отказались от выяснения условий, при которых получено ваше "модельное время" (и с чем оно увязано и согласовано). Про переходы между уровнями в атомных часах вы не думаете. Вам "тики" уже даны в виде поддерживаемой вычислительной системой абстракции.
Времени, как реальности (тем более объективной) - нет. Есть некие процессы, протекание которых мы считаем (опять же - УСЛОВНО-ОБЩЕ-СОГЛАСИТЕЛЬНО) стабильным относительно других процессов и называаем это "периодами времени"...
№ 1550 15-11-2006 01:28 | |
Ответ на »сообщение 1549« (Jack Of Shadows)
___________________________
Нет, тут не просто "средневековье".
Если бы неандертальцу дали мобильник, то он бы просто не знал "щё з ным робЫты"...
Аналогия - полная. Водораздел в мышлении проходит не по линиии использования, а по линии намерений применения и инфраструктуры обеспечения применения. В руках - пока, что только дубина. С огнём ещё не научились обращаться... Только бегают от него... :о)
№ 1549 14-11-2006 14:09 | |
Ответ на »сообщение 1548« (Geniepro)
___________________________
Ответа на основной вопрос статьи: "Если Лисп так крут, то почему так редко используется" - так и не найдено - сообщество лисперов многие годы ломает головы над этой загадкой.
А че тут гадать. Посчитайте сколько денег, времени и труда вложено в коммерческую раскрутку с++, java, csharp и сколько в лисп. Разница на несколько порядков - соответственно и результат.
Продается как известно то что лучше рекламируется а не то что лучше.
Правда в перспективе все рано или поздно встает на свои места.
Просто мы с вами попали в период...средневековья в массовом программировании что ли.
№ 1548 14-11-2006 13:44 | |
Интересная статья мне попалась - Erann Gat "Lisp as an Alternative to Java" 2000 г.
http://www.flownet.com/gat/papers/lisp-java.pdf
Сравнительный тест по методу Prechelt'а - одна и таже задача реализуется несколькими программистами и их результаты усредняются.
Prechelt, L. 1999. "Java vs. C++: Efficiency issues to interpersonal issues"
У Prechelt'а было сравнение языков С/С++ и Java, Erann Gat добавил тесты на Лиспе и Scheme.
Правда, Prechelt использовал JDK 1.2, так что сейчас бы у Java результат был бы получше, но тем не менее...
Erann Gat использовал компиляторы Лиспа Allegro CL 4.3 и Scheme MzScheme (12 программ на Лиспе, 4 на Scheme, в тесте участвовало 14 программистов); программы компилировались в "нативный" машинный код.
Результаты тестов в общем таковы:
Опыт программистов в среднем в годах:
Лисп: 6.2
С/С++: 9.6
Java: 7.7
Время разработки программ в часах:
Лисп: от 2 до 8.5
С/С++: от 3 до 25
Java: от 4 до 63
Длина программ в строках:
Лисп: от 51 до 182, в среднем 119 (медиана 134)
С/С++/Java: от 107 до 614, в среднем 277 (медиана 244)
Хотя быстрейшие программы на С/С++ были быстрее, чем быстрейшие на Лиспе, среднее время работы программ таково (в секундах):
Лисп: 41 (медиана 30)
С/С++: 165 (медиана 54)
Java: ок. 3500 (медиана ок. 1500)
Разброс времени выполнения программ на Лиспе был на порядок меньше, чем на С/С++.
Результат у Лиспа подпортил один программист с опытом работы на Лиспе меньше года, без него было бы ещё лучше...
По использованию памяти программы на Лиспе и Яве почти совпадают и значительно хуже, чем у С/С++, что, впрочем, и не удивительно.
Ответа на основной вопрос статьи: "Если Лисп так крут, то почему так редко используется" - так и не найдено - сообщество лисперов многие годы ломает головы над этой загадкой.
Основные причины - разочарование в ИИ и соответственно в Лиспе (попал под раздачу) и мифы о громоздкости Лисп-систем (ага, особенно по сравнению с Visual Studio и даже Delphi/C++ Builder :-))
№ 1547 14-11-2006 12:49 | |
Ответ на »сообщение 1546« (Geniepro)
___________________________
По поводу автоматической мемоизации. Сделать для чистых функций - раз плюнуть.
А вот практическое применение выходит боком. Если кешировать все результаты всех отработанных функций в программе хотя бы средненького размера, то она отьест столько памяти что это уже не смешно.
Поэтому такое вот полуавтоматическое кеширование, когда вы просто помечаете те функции, результат которых вы хотите повторно использовать, оно на сегодня практичнее.
Ну а лет через 5-6 когда памяти на настольных писюках будет 10 гиг по умолчанию, тогда можно и об автоматической мемоизации задуматься :))
№ 1546 14-11-2006 11:19 | |
Ответ на »сообщение 1541« (Jack Of Shadows)
___________________________
То есть напишите для первого вызова let x = dec 1000000000
dec не выполнится сразу же а только когда понадобится то есть когда print x
А вот на второй раз print x не будет выполнять dec, а возьмет запомненное значение.
Ну это-то понятно. :о)) Просто используется уже x, а не dec 1000...
Для ручной мемоизации можно воспользоваться функцией memo из модуля memo
А вот это уже интересно. В GHC 6.6 его почему-то нет, но в WinHugs'е - есть. Осталось только переделать его под GHC...
Кстати, спасибо за ссылки на отладчик; скачал, буду посмотреть...
№ 1545 14-11-2006 09:29 | |
Ответ на »сообщение 1539« (Jack Of Shadows)
___________________________
>>>Разве функциям sin, cos нужно от вас что либо кроме передаваемого им параметра ?
Навеяло :) Наш преподователь матфизаки когда-то заканчивал разбор сложных задач пренебрежительно произнося: "ну дальше все сводится к задаче в квадратурах". На доске при этом безумная мещанина из синусов, логарифмов и прочих экспонент, но с его точки зрения это уже не представляло интереса.
Машина играет в шахматы с человеком - придется вводить
>>>ИЯ - единственный способ общения программы с внешним миром.
Одна шахматная программа играет с другой, в чем разница?
Можно, конечно договорится и передавать друг другу каждый раз всю позицию, но проще ли это, чем обмениваться ходами, а не позициями?
А шахматы, это еще по божески: время дискретное, критерий постоянный, ограничения неизменны, позиция выражается однозначно - просто чудо.
Возьмем пример посерьезнее - модель эволюции жизни. Миллиарды "существ" играют друг с другом в игру на выживание. На протяжении миллиардов лет модельного времени. Как описать все это в виде функций?
№ 1544 14-11-2006 06:05 | |
Ответ на »сообщение 1543« (info21)
___________________________
>>>В лиспе, может, и не сделает. А в Компонентном Паскале -- сделает. Нужно, конечно, подсказать.
А каким образом. Если with - то не считается
№ 1543 14-11-2006 03:59 | |
Ответ на »сообщение 1539« (Jack Of Shadows)
___________________________
Так например открытый файл все равно надо закрывать вручную, открытый connection к базе данных все равно надо закрывать вручную. Никакой сборщик мусора за вас это не сделает. ...
В лиспе, может, и не сделает. А в Компонентном Паскале -- сделает. Нужно, конечно, подсказать.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|