Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 162 14-06-2006 11:34 | |
Пришел info21 и своим брюзжанием напомнил мне часто слышавшиеся в одно время разговоры "В гробу я видал вашее ООП. Я и на кошках, ээ то есть на си, неплохо зарабатываю"
В прочем, призывы работать на ассемблере (си, паскале, обероне) будут наверное слышаться в индустрии программирования до скончания веков :))
Но главное в том, чтобы у людей был выбор. Чтобы они слышали обе стороны.
И отрицательное мнение людей о функциональном программировании является органической частью этого обсуждения.
Правда я бы хотел чтобы оно (мнение) иллюстрировалось бы конкретными примерами.
Поэтому прошу info21. Не могли бы вы поделиться с описанием тех трудностей, с которыми вам пришлось столкнуться в вашей, судя по всему, долгой практике работы с функциональными (?) языками ?
Да и вообще а что за язык (языки) то были ?
А то по вашему ответу на этот вопрос:
А реализации, случаем, на ФОРТРАНЕ были?
Фортран не намного хуже ассемблера для реализации того же лиспа.
может сложиться впечатление что вы действительно по фортрану о лиспе судите :))
Это типа как - "Напел мне вчера сосед Паваротти. Ну и хреново этот Паваротти поет!" :)))
№ 161 14-06-2006 11:10 | |
>>>А вот скажем чистый (куда уж чище :)) ) функциональный язык хаскель,
>>>имеет модули. Почитайте на простом, понятном языке описано:
>>>http://www.haskell.org/tutorial/modules.html
Спасибо! По Вашей ссылке я нашел то, о чем давно подозревал :)
Нет никакой "пропасти" между хорошими императивными языками и хорошими функциональными.
Вот фрагмент текста на Haskell.
module Main (main) where
import Tree ( Tree(Leaf,Branch), fringe )
main = print (fringe (Branch (Leaf 1) (Leaf 2)))
Что-то напоминает очень знакомое? Особенно некоторые конструкции :)
Великие идеи не знают границ - например, такая идея, как идея модульности. И это хорошо.
№ 160 14-06-2006 10:29 | |
Ответ на »сообщение 159« ()
___________________________
Бред какой-то: динамические структуры и Immutability.
Вы хоть поняли, что сказали?
Вы, как обычно, не умеете читать: я не связал два термина родительным падежом.
Либо вы не понимаете механизмов работы функциональных языков.
А реализации, случаем, на ФОРТРАНЕ были?
Фортран не намного хуже ассемблера для реализации того же лиспа.
Функциональное пррограммирование на ПАСКАЛЕ?
Где вы это прочли? Читать вы точно не умеете.
Мы очень рады. Хотя, поверьте, лично вам это пользы не сделает.
Рад, что порадовал вас.
Пользу мне "делает" то, что я делаю на Обероне.
За то бывает есть объективное сравнение затрат на том или ином языке соответствующих парадигм и подходов.
Вы не только читать не умеете, но и писать.
В Лиспе НЕ возвращаются ЛОКАЛЬНЫЕ функции в понятиях, сложившихся в императивных языках.
Вы точно не умеете читать. Я нигде не говорил про такие функции.
Такого конкурса для функциональных языков нет.
Этого вы знать не можете. Вы можете не знать о таком конкурсе.
№ 159 14-06-2006 07:39 | |
Ответ на »сообщение 156« (info21)
___________________________
Поучительно, каждому желаю. Immutability -- незаменимая вещь при работе с сильно динамическими структурами (и про компаскалевский атрибут LIMITED вопросов не будет); про последовательности и фильтры.
Бред какой-то: динамические структуры и Immutability.
Вы хоть поняли, что сказали?
Вынужден уточнить, что первую (и лучшую) половину своей карьеры имел дело практически исключительно с функциональными и марковскими системами.
А реализации, случаем, на на ФОРТРАНЕ были? А то подозрительно как-то слышать про сочетание "динамические структуры и Immutability".
но лучше прямо, а не через ухо, -- на Компонентном Паскале (из-за LIMITED и т.п.). Вот тогда и получится не, к примеру, движок для символической алгебры, а просто глиняный пулемет.
Функциональное пррограммирование на ПАСКАЛЕ? Патология какая-то!
А к программированию на функц. языках я после Оберона не вернусь
Мы очень рады. Хотя, поверьте, лично вам это пользы не сделает.
А чудес не бывает.
За то бывает есть объективное сравнение затрат на том или ином языке соответствующих парадигм и подходов.
А возращать локальные функции -- в гробу хочется видеть такие штуки.
В Лиспе НЕ возвращаются ЛОКАЛЬНЫЕ функции в понятиях, сложившихся в императивных языках.
Жизнь-то одна, и хочется че-нить реальное совершать, а не примеры для конкурса Obfuscated Lisp генерить.
Такого конкурса для функциональных языков нет. А вот для императивных - есть. ;) Сообщение не подписано
№ 158 14-06-2006 06:37 | |
Ответ на »сообщение 156« (info21)
___________________________
.. первую (и лучшую) половину своей карьеры имел дело практически исключительно с функциональными и марковскими системами.
Уточню на всякий случай, а то начнут цитировать не так :-)
Лучшую не потому, что "имел дело ...", а потому, что казалось, что можно спокойно позволить себе заниматься всякой-разной эквилибристикой ...
№ 157 14-06-2006 06:27 | |
Ответ на »сообщение 88« (Руслан Богатырев)
___________________________
... при сопоставлении функционального и императивного подходов не совсем корректно сравнивать функции Лиспа с объектами.
Может, философски и некорректно, зато практически -- точно.
Функция в лиспе -- некий список, который, как известно, есть совокупность записей, повязанных ссылками, среди которых есть и выделенная "голова" -- по-другому, объект. Поэтому я Оберон в первую очередь и вспоминал, что там подчеркнуто тождество "объект-запись".
А "посылание сообщений" -- интерпретация, слова, бла-бла-бла.
№ 156 14-06-2006 06:22 | |
Ответ на »сообщение 90« (Jack Of Shadows)
___________________________
Ответ на »сообщение 83« (info21)
___________________________
А компактность лисповской программы прямо связана с ее нечитабельностью.
Says who ? ...
У программистов, знакомых не понаслышке с функциональным подходом есть преимущество. Они могут об этом судить.
Те же кто всю жизнь писал в императивном стиле, вынуждены верить заявлениям всяких гуру.
Я призываю всех заинтересованных в 'ndtnt на этот вопрос - не верьте ни мне ни infor21.
Да, со всякими гуру в он-лайновых форумах просто беда ;-) Хорошо, что Trurl есть.
"... слишком близки к человеку ..." -- как это помягче говорить по-русски? "язык без костей"? :-)
То же и про автоматическую параллелизацию.
Вынужден уточнить, что первую (и лучшую) половину своей карьеры имел дело практически исключительно с функциональными и марковскими системами. Поучительно, каждому желаю. Immutability -- незаменимая вещь при работе с сильно динамическими структурами (и про компаскалевский атрибут LIMITED вопросов не будет); про последовательности и фильтры.
Вправду каждому полезно ознакомиться, как из подобных примитивов строить разные сортировки и т.п. (хотя приведенный пример, конечно, вполне патологический -- больше игра в нотацию, чем дело).
В этом плане хорошо пройтись по соответствующей книжке. Был такой автор Берд со скушноватой коллекцией функц. алгоритмов. Не знаю, появилось ли что-нить более зажигательное.
Но еще могуче получается, если к фильтрам и проч. добавить квази-марковские подстановки. Знаю, знаю, что и на функц. языке можно смоделировать; но лучше прямо, а не через ухо, -- на Компонентном Паскале (из-за LIMITED и т.п.). Вот тогда и получится не, к примеру, движок для символической алгебры, а просто глиняный пулемет.
А к программированию на функц. языках я после Оберона не вернусь (если жизнь не заставит). По большому счету, потому что любая редукция понятия вычислимости к минимальному набору примитивов (императивная, функциональная, марковская...) уводит от человека одинаково далеко -- это теорема. Процедурная хотя бы к железу близка. А чудес не бывает.
А возращать локальные функции -- в гробу хочется видеть такие штуки. Жизнь-то одна, и хочется че-нить реальное совершать, а не примеры для конкурса Obfuscated Lisp генерить.
Резковато, но искренне ;-)
№ 155 14-06-2006 02:55 | |
№ 154 14-06-2006 00:49 | |
№ 153 13-06-2006 13:16 | |
Зачем нужны эти чортовы макросы в лиспе ? Разве нелдьзя писать без них.
Конечно можно!
Но, зачем вам в языке две конструкции if и case ? Разве нельзя все делать с if ?
Конечно можно! Но какой получится громоздкий код! Чтобы сделать код красивше, меньше, понятнее, вводят в язык case. То же самое с for и while. В принципе for начерта не нужен.
while i < 100
i = i + 1;
Как видите даже выигрыш то от for мизерный. И тем не менее, создатели языков считаю что даже такой маленький выигрыш в написании уже оправдывает введение нового оператора.
Но кто вводит эти операторы в язык ? Простые программисты ? Нет! Создатели языка! Только боги, типа Вирта, Алана Кея, Гослинга, Гвидо ван Россума, Андерса Хейлсберга, решают что вам нужно а что нет.
А если нужно добавить что то ? Уууу. Тяжкий случай. Затаскают по комитетам, заседаниям, понапишут талмуды нечитаемых стандартов и может быть (МОЖЕТ БЫТЬ!!) лет через 5-10 вы получите то что вам так нужно.
Вот скажем в хаскеле появились list comprehensions. Аатличная весчь! А в Питоне их нет. Питонисты аж черной завистью изошли, и давай доставать Гвидо, добавь да добавь их в питон. Все мозги ему сделали. Наконец через несколько лет он сдался и УРа !! Теперь в питоне есть list comprehensions.
Напомнить вам как долго и тяжело шли generics в сишарп ? Как они попавли в java только потому что не отстать от сишарпа ? Посмотрите сколько времени проходит между выходом новых версий языков.
Короче процесс мучительный.
А в это время в альтернативном и прекрасном мире лиспа...
В лиспе видите ли нет оператора if.
Это макрос. Понадобилось когда то кому то - накропал быстренько. Никакой беготни за хозяином (Mccarty) никаких утрясаний в комитетах, никаких подковерных политических игр со стандартизацией.
10 минут работы, и вот тебе if. И loop тоже макрос. и dolist (цикл по списку) и dotimes (цикл типа for i=1 to 10) Да практически все что есть в лиспе - макросы.
Вот скажем в лиспе тоже нет list comprehensions. Ну и что ? Будем устраивать лоббирование и давление на кого то там чтобы добавили ? Будем ждать годы ? Да ни за что! Делов то на часик работы и маленький макрос накропать.
Вот он кстати:
(defun open-bracket (stream ch)
(defmacro comp ((e &rest qs) l2)
(if (null qs) `(cons ,e ,l2) ; rule A
(let ((q1 (car qs))
(q (cdr qs)))
(if (not(eq (cadr q1) `< -)) ; a generator?
`(if ,q1 (comp (,e ,@q),l2) ,l2) ; rule B
(let ((v (car q1)) ; rule C
(l1 (third q1))
(h (gentemp \"H-\"))
(us (gentemp \"US-\"))
(us1 (gentemp \"US1-\")))
`(labels ((,h (,us) ; corresponds to a letrec
(if (null ,us) ,l2
(let ((,v (car ,us))
(,us1 (cdr ,us)))
(comp (,e ,@q) (,h ,us1))))))
(,h ,l1)))))))
(do ((l nil)
(c (read stream t nil t)(read stream t nil t)))
((eq c `|]|) `(comp ,(reverse l) ()))
(push c l)))
(defun closing-bracket (stream ch) `|]|)
Все! Эти несколько строк кода заменяют лисперам все ваши комитеты, стандарты и годы ожидания. :)))
Вот это то что делает лисп уникальным. Много есть императивных языков. Много функциональных.
Есть даже несколько чистых функциональных языков.
Но лисп - единственный в своем роде. МЕТА-ЯЗЫК. ПРОТО-ЯЗЫК.
Руслану вон нужны позарез модули в лиспе. Их нет, и знаете что ? Руслану не нужно ждать когда появится модула - 3, 4, 5 итд. Он может просто НАПИСАТЬ модули для лиспа. Не охота связываться ?
Их написал уже кто то другой. http://www.flownet.com/gat/locales.pdf
Да, кстати, packages которые я упоминал, их в лиспе тоже...правильно, НЕТ! Это макросы. :)))
Лисп вне различных парадигм программирования. Лисп вне религиозных войн.
В лиспе каждый найдет для себя то что ищет.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|