Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 5482 07-08-2012 01:49 | |
Ответ на »сообщение 5481« (Jack Of Shadows)
___________________________
F# реализация окамла на dotnet c несколько более современным синтаксисом. Вешь хорошая, но я привык и весьма ценю ленивость хаскеля и его продвинутую систему типов. Однако если бы мне пришлось работать на dotnet, я бы выбрал F#
А почему не Clojure? Лисповский синтаксис, к тому же недавно к нему приделали статическую систему типов для тех, кому она нужна...
№ 5481 06-08-2012 14:41 | |
Ответ на »сообщение 5480« (мардухай)
___________________________
Сишарп хороший современный императивный язык. И как таковой меня совершенно не интересует.
LINQ - кусочек хаскеля портированный на сишарп. Хорошо конечно для бедняг которые застряли на платформе. Я бы тоже радовался что у меня есть LINQ если бы меня кто заставил работать на сишарпе. К счастью меня никто не заставляет.
F# реализация окамла на dotnet c несколько более современным синтаксисом. Вешь хорошая, но я привык и весьма ценю ленивость хаскеля и его продвинутую систему типов. Однако если бы мне пришлось работать на dotnet, я бы выбрал F#
Дотнет в целом нормальная платформа. К сожалению не opensource и не линукс.
Для меня профессиональный выбор однозначен - линукс.
Но для тех кто работает на windows я думаю dotnet хороший (если не единственный) выбор.
№ 5480 06-08-2012 09:07 | |
Вопрос к уважаемому Jack Of Shadows. Любопытно было бы узнать Ваше мнение о C# (linq ), F# и о .net в целом?
№ 5479 31-07-2012 18:04 | |
Ответ на »сообщение 5474« (John Doe)
___________________________
https://dl.dropbox.com/u/62227452/Screenshots/Screenshot%20from%202012-07-26%2020%3A37%3A43.png
А вот полюбуйтесь на хаскелевсий REPL выдающий подсветку синтаксиса и автоиндентацию для сгенерированного javascript кода.
Конечно, благодарить за это следует великолепный emacs. Это просто в тему о том что хаскелевский REPL ничем не хуже лиспового.
Ну а по поводу динамичности, в последней версии хаскеля и его REPL добавили опцию динамического запуска. Так что теперь можете тестировать ваши функции даже без компиляции всего модуля.
Мне персноально это честно говоря не нужно. Но кому то наверно понадобилось.
№ 5478 31-07-2012 17:26 | |
Ответ на »сообщение 5474« (John Doe)
___________________________
Правильно поставленный процесс разработки, проверка функций в REPL, Unit-тестирование
По поводу REPL полностью согласен...вместе со всем хаскель сообществом :))
Хаскелевсий REPL ничем не уступает лисповому, интегрирован точно также в emacs. Да и вообще можете сами полюбоваться:
https://www.youtube.com/watch?v=dhFZ8vx9byc
А вот в сфере юнит тестирования хаскель может поучить кое чему старичков. Кроме классического JUnit подхода хаскелисты создали невероятно крутой QuickChek, который АВТОМАТИЧЕСКИ генерирует тесты согласно декларативному описанию функций.
При чем моментально находит ошибки в коде который был до этого проверен вручную написанными юнит-тестами. Вот так вот!
№ 5477 31-07-2012 17:18 | |
Ответ на »сообщение 5474« (John Doe)
___________________________
Но не забывайте, что у динамики и метавозможностей Lisp-a тоже есть свои преимущества над статикой,
Действительно макросы лиспа и его динамичность создают очень мощную среду для программиста. Если бы речь шла только о статике то и спора бы не было.
Однако статика сама по себе не дает описанного эффекта. Я уже упоминал что при работе с длинным списком статических языков, такого феномена не наблюдается. Тут роль играет именно мощная современная система типов.
Хаскель например отлавливает NullPointerException, на этапе компиляции. Ни лисп, ни джава в этом не помогут.
Ответ на »сообщение 5475« (Сергей О.)
___________________________
Все таки замечательный язык Окамл!
Именно по той же причине - схожие системы типизации (Hindley-Milner).
Хаскель правда далеко ушел от окамла в своем развитии. Но разработчики окамла тоже перенимают опыт хаскеля.
Буквально три дня назад вышла новая major версия окамла 4.0 где основным нововведением являются GADT (Generalized Algebraic Data Types), то есть одно из основных свойств системы типов хаскеля.
№ 5476 31-07-2012 14:51 | |
Ответ на »сообщение 5475« (Сергей О.)
___________________________
Что-то поломалось. 1 абзац в предыдущем моем сообщении - цитата сообщения Jack of Shadows.
№ 5475 31-07-2012 14:50 | |
Ответ на »сообщение 5473« (Jack Of Shadows)
___________________________
Весьма интересным свойством работы на хаскеле является вот такой вот феномен: Если скомпилировалось, то скорее всего и сработает правильно. Поразительное ощущение. Особенно после десятков лет опыта с другими статическими языками (с, с++, delphi, java, c#), где факт успешного компилирование не говорит ни о чем, и программист оправданно ожидает получить ошибку при первом запуске.
Интересно, один мой бывший однокурсник, хороший, насколько могу судить, программист, не так давно написал в своем ЖЖ:
Все таки замечательный язык Окамл!
Пишешь долго, но уж если скомпилировалось, то работает почти сразу
№ 5474 31-07-2012 13:48 | |
Ответ на »сообщение 5473« (Jack Of Shadows)
___________________________
Во многом описанные вами преимущества сводятся к "утилитарному" преимуществу статики над динамикой. Но не забывайте, что у динамики и метавозможностей Lisp-a тоже есть свои преимущества над статикой, - не мне Вам рассказывать. Что до безошибочности работы программы на Haskell после компиляции, то, простите, я не поверю, что сразу компилируется весь программный модуль без промежуточного тестирования отдельных функций. То же самое относится и к динамическим Lisp/Python/etc. Правильно поставленный процесс разработки, проверка функций в REPL, Unit-тестирование (причем все это гораздо менее обременительно, чем в статике). Конечно, автоматический рефакторинг в статике бесподобен. Но, перефразируя, не рефакторингом же единым :)
Согласитесь, все-таки, что по гибкости Lisp-у нет равных. И то, что в AI царствует Lisp, а не Haskell - это не просто совпадение. Да и в Web-программировании явно прослеживается преимущество динамических языков, начиная с PHP и заканчивая Python или Clojure.
№ 5473 31-07-2012 12:58 | |
Ответ на »сообщение 5472« (John Doe)
___________________________
Отнюдь. Изначальное "вязкое" ощущение при работе с хаскелем связано с тем что язык совершенно инородный.
Это вам не перепрыгивание с дельфей на сишарп :)
Со временем это конечно проходит, и я работаю с хаскелем так же быстро как и с лиспом. А уж при рефакторинге так вообще гораздо быстрее просто потому что компилятор весьма сильно помогает.
У меня был опыт перехода на новые версии web frameworks как на clojure (compojure framework) так и на хаскеле (yesod framework). Так вот на лиспе без ошибок не обошлось. А вот на хаскеле несмотря на большое количество изменений во ммногих модулях, прошло без сучка-задоринки.
Весьма интересным свойством работы на хаскеле является вот такой вот феномен: Если скомпилировалось, то скорее всего и сработает правильно. Поразительное ощущение. Особенно после десятков лет опыта с другими статическими языками (с, с++, delphi, java, c#), где факт успешного компилирование не говорит ни о чем, и программист оправданно ожидает получить ошибку при первом запуске.
Кстати переход на хаскель вовсе не означает отказа от лиспа. У нас много проектов и изменений на нашем вебсайте, так что активной работы с clojure у меня полно.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|