Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 152 13-06-2006 12:30 | |
По поводу лисповых макросов.
Руслан, макросы в лиспе это самая обычная лисп программа, которая просто запускается и работает перед компиляцией. После чего уже идет компиляция.
Поэтому если у вас в макросе ошибка, вы получите нормальное лисп сообщение об ошибке с указанием конкретного места в макросе, как в самом обычном лисп коде. Вернее это и есть обычный лисп код. :))
Ну а поскольку макросы (если отработали без ошибок) тоже создают самый обычный лисп код, а не какую то неизвестную языку лексическую конструкцию, как вы себе представляете, то если есть ошибка в этом коде, она относитcя к обычному понятному лиспу, к функциям, на конкретную строчку в которых вы получите указание, с нормальным сообщением что за ошибка.
Далее, в лиспе можно просто нажать Expand macros указав на макрос который вас интересует, и получите сгенерированный этим макросом код. Изучайте наздоровье. Отлавливайте ошибки дебагером. Никаких черных ящиков и неизвестных языку конструкций. Никакого сравнения с фортом.
№ 151 13-06-2006 12:18 | |
Руслан.
Ваш вопрос о модулях был не про лисп а про функциональные языки вообще.
Trurl уже успел привести пример модульной системы в SML и Ocaml. За что ему большая благодарность.
Более того, вы же сами прекрасно понимаете что если модульная система и функциональная/императивная парадигмы ортогональны (т.е. не зависят друг от друга) то нет никаких препятствий для их совместного проживания.
С чего вы сделали вывод что в функциональных языках их нет - непонятно.
Модули как средство инкапсуляции - не единственный механизм.
В лиспе для этого используется lexical scoping.
То есть вместо того чтобы использовать отдельные текстовые файлы как границы модулей (почему обязательно так должно быть ?) Используется лехсическая конструкция (let)
Я кстати приводил пример использования let для сокрытия локальных переменных.
Как вы его пропустили, не понимаю :))
В других функциональных языках, как тут господин Trurl приводил пример, используют другие техники.
Все как видите прекрасно работает. Мы довольны.
А вот скажем чистый (куда уж чище :)) ) функциональный язык хаскель, имеет модули.
Почитайте на простом, понятном языке описано: http://www.haskell.org/tutorial/modules.html
A Haskell program consists of a collection of modules. A module in Haskell serves the dual purpose of controlling name-spaces and creating abstract data types.
Даже слово модуль в языке есть:
module Tree ( Tree(Leaf,Branch), fringe ) where ...
Так что не паникуйте уважаемый. Все нормально с модульностью в функциональном мире. :))
№ 150 13-06-2006 11:26 | |
>>>Мне очень хочется узнать, как это я до сих пор без них жил и не очень тосковал по этому поводу. ;) Более того, как остальной мир стоит и не падает до сих пор?
Примерно так же, как без Лиспа. Без него тоже многие в этом мире живут и похоже не очень тоскуют по этому поводу. Более того, история человечества доказывает, что человек может обходиться без автомобиля, телевизора, стиральной машины, пылесоса и кофеварки - тысячи лет обходились и ничего. Конечно, без модулей можно обойтись. Но с модулями все-таки лучше :o).
Сообщение не подписано
№ 149 13-06-2006 06:59 | |
Ответ на »сообщение 147« (Руслан Богатырев)
___________________________
Дописать... Т.е. в Лиспе модулей таких нет. Тогда понятно.
А зачем Вы сейчас спорите насчет модулей в Лиспе, если их там, как выясняется, нет? Мне, например, непонятно.
Мне очень хочется узнать, как это я до сих пор без них жил и не очень тосковал по этому поводу. ;) Более того, как остальной мир стоит и не падает до сих пор? Может просто надо осмыслить, что действительно для практикующих программистов важнее? Чистота стиля и идеологии или наличие практичных инструментов?
Что будет в Форт-системе при наличии ошибки использования доморощенного языка? Сообщение о конкретной ошибке этого языка или некое общее сообщение?
Всё зависит от меры вашего желания обеспечить сервисы такого рода при расширении языка. Впрочем, как и в случае с другими расширяемыми системами. Сообщение не подписано
№ 148 13-06-2006 06:58 | |
Ответ на »сообщение 134« (Jack Of Shadows)
___________________________
Попробую на примере SML. В OCaml примерно то же, но обозначения другие.
В SML используются термины "структура" и "сигнатура" вместо более традиционных "модуль" и "интерфейс".
structure S =
struct
type t = int
val e = 0
fun s(x) = x+1
end;
Здесь определяется структура с именем S, состоящая из трех элементов, на которые можно ссылаться с помощью составных имен вида S.e. Внутри блока struct...end может содержаться произвольная последовательность определений, в том числе и вложенных структур.
С каждой структурой связана "естественная" сигнатура,которая выводится компилятором. Для S это будет
structure S :
sig
type t
val e : int
val s : int -> int
end
Но, как правило, сигнатура явно приписывается структуре, что позволяет прятать её компоненты.
signature Sig = sig ... end;
structure S:Sig = struct ... end;
Можно создавать различные "проекции" одной и той же структуры, сопоставляя её различными сигнатурами, и таким образом использовать один программный модуль для реализации различных интерфейсов.
structure S1:Sig1 = S;
structure S2:Sig2 = S;
Наконец, имеются средства параметризации структур (структурами же). В результате получаются "функции для структур", называемые Функторами.
signature SigA = sig ... end;
signature SigB = sig ... end;
functor F(A:SigA):SigB = struct ... end;
structure SA:SigA = struct ... end;
structure SB = F(SA);
В принципе, подобные возможности есть и в других языках, но здесь все сделано изящно и гармонично.
№ 147 13-06-2006 06:45 | |
Ответ на »сообщение 146« ()
___________________________
Всё остальное (вплоть до наделения среды свойствами модульности по типу Оберона) лисперы смогут дописать (или найти в интернете).
Дописать... Т.е. в Лиспе модулей таких нет. Тогда понятно.
Тогда не понятно, зачем спорили.
А зачем Вы сейчас спорите насчет модулей в Лиспе, если их там, как выясняется, нет? Мне, например, непонятно.
Опять не понял. Что-то сегодня не то в атмосфере. А правила базового языка уже поотменяли? И при чём здесь Форт? Если на форте наращивается базовый (или свой) словарь, то естественно будут определены слова времени исполнения или компиляции, отслеживающие правильность действий и выявляющие нарушение различных инвариантов и условий. В чём проблемы?
Что будет в Форт-системе при наличии ошибки использования доморощенного языка? Сообщение о конкретной ошибке этого языка или некое общее сообщение?
№ 146 13-06-2006 06:32 | |
Ответ на »сообщение 144« (Руслан Богатырев)
___________________________
Ответ на »сообщение 143« ()
___________________________
Интересно выяснить причину споров...
Вот причину не скажу
Тогда не понятно, зачем спорили.
Какие языки ФП имеют концепцию модуля как средства для инкапсуляции программных сущностей и инструмента поддержки раздельной компиляции (separate compilation) -- отчуждение интерфейса модуля от его реализации и автономную компиляцию модуля на основе одних интерфейсов при отсутствии доступа к реализации импортируемых им модулей?
Опять не понял вопроса. Вы о расширяемых языках и системах говорите?
Для Оберонов исполняемая среда – подлежащая ось. Для Лиспа она чуть расширена до исполняемой среды поддержки языка. В чём проблемы? Всё остальное (вплоть до наделения среды свойствами модульности по типу Оберона) лисперы смогут дописать (или найти в интернете). Опять не вижу проблем. Тот же MetaObject Protocol использовать, можно.
Лисп. Потому, что проблема выбора отпадет сама собой, когда вы хотя бы одну книжку по введению в Лисп до конца дочитаете... ;)
Боюсь, укол относительно книжки не по адресу. А аргументация как-то неубедительна - на уровне "потому что потому".
Что было навеяно – то в текст и попросилось. ;)
Действительно, и зачем это в языках явно (safe subset) и неявно (отдельные товарищи, программирующие, напр., на C++) выделяют свои подмножества? Ведь под руками -- все богатство фич. И к чему же себя ограничивать?
Откуда я знаю – почему? Я им не доктор. Головой пусть думают. Я же говорю: главное – не уже заданное богатство фич, а наличие средств их производства. От языковых конструкций и до парадигмальных экзерциссов...
Итак, я, по Вашим словам, в Лиспе достроил что-то до своего языка (надо думать, при этом имею под ногами только run-time system Лиспа, но не моего языка). Как в этом случае определяются синтаксические и семантические ошибки при использовании мной собственного языка? Вопрос навеян Фортом (Forth).
Опять не понял. Что-то сегодня не то в атмосфере. А правила базового языка уже поотменяли? И при чём здесь Форт? Если на форте наращивается базовый (или свой) словарь, то естественно будут определены слова времени исполнения или компиляции, отслеживающие правильность действий и выявляющие нарушение различных инвариантов и условий. В чём проблемы? Сообщение не подписано
№ 145 13-06-2006 05:38 | |
Ответ на »сообщение 142« ()
___________________________
Но, в общем случае, - зачем?
Действительно, и зачем это в языках явно (safe subset) и неявно (отдельные товарищи, программирующие, напр., на C++) выделяют свои подмножества? Ведь под руками -- все богатство фич. И к чему же себя ограничивать?
Итак, я, по Вашим словам, в Лиспе достроил что-то до своего языка (надо думать, при этом имею под ногами только run-time system Лиспа, но не моего языка). Как в этом случае определяются синтаксические и семантические ошибки при использовании мной собственного языка? Вопрос навеян Фортом (Forth).
№ 144 13-06-2006 05:33 | |
Ответ на »сообщение 143« ()
___________________________
Интересно выяснить причину споров...
Вот причину не скажу, а споры можете посмотреть в архиве "Мыслей об Обероне" в разделе "Школа Оберона" в Королевстве.
>>Но раз так уверенно возражаете -- буду признателен за примеры таких языков. Не понял вопроса...
Какие языки ФП имеют концепцию модуля как средства для инкапсуляции программных сущностей и инструмента поддержки раздельной компиляции (separate compilation) -- отчуждение интерфейса модуля от его реализации и автономную компиляцию модуля на основе одних интерфейсов при отсутствии доступа к реализации импортируемых им модулей?
Лисп. Потому, что проблема выбора отпадет сама собой, когда вы хотя бы одну книжку по введению в Лисп до конца дочитаете... ;)
Боюсь, укол относительно книжки не по адресу. А аргументация как-то неубедительна - на уровне "потому что потому".
№ 143 13-06-2006 05:20 | |
Ответ на »сообщение 140« (Руслан Богатырев)
___________________________
А кто сказал, что их там нет?
Так расскажите, в каких. Интересно разобраться, что за сия конструкция в мире функциональных языков. А то, быть может, разумеем под словом "модуль" разное?
Конечно – разное!
JOS уже сказал, что на Лисп надо под немного другим углом смотреть. В лиспе работают не модули, а пакеты. Вот выдержки из одной из дискуссий на эту тему:
Packages map strings onto symbols (identifier objects).
Modules map symbols/identifiers onto values.
Packages work at read/parse time.
Modules work at compile time or run time depending on the module system.
Common Lisp has a package system but no module system (but it's possible
to add one -- see e.g. http://www.flownet.com/gat/locales.pdf).
Python has a module system that works at run-time, but no package system.
Тут в мире императивности на эту тему споры до хрипоты.
Интересно выяснить причину споров...
Но раз так уверенно возражаете -- буду признателен за примеры таких языков.
Не понял вопроса...
Объясню, зачем нужно выяснять. Предположим есть желание (производственная необходимость, нужное подчеркнуть) использовать обе парадигмы в одном языке. Какой выбрать (ФЯ/ИП или ИЯ/ФП) и почему?
Лисп. Потому, что проблема выбора отпадет сама собой, когда вы хотя бы одну книжку по введению в Лисп до конца дочитаете... ;) Сообщение не подписано
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|