Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 2452 01-04-2007 17:11 | |
Ответ на »сообщение 2449« (AVC)
___________________________
>>>В данном случае это проявляется в том, что хотя мы можем на лету реализовать любую функциональность (вот вам и λ), но в общем случае не можем оформить это просто как вызов функции. Ведь динамическая структура должна где-то подцепляться, а closure в Обероне нет.
Напрашивается ввести в язык что-то вроде делегатов, вопрос -- ст оит ли... :)
№ 2451 01-04-2007 17:05 | |
Ответ на »сообщение 2447« (Jack Of Shadows)
___________________________
Ответ на »сообщение 2444« (Руслан Богатырев)
___________________________
Задача школьника научиться выражать простые мысли простым набором механизмов, а не надеяться что на каждый вопрос есть готовый ответ в виде библиотечной функции.
О том и речь. Выражать мысли простым набором механизмов, а не надеяться, что на каждую проблему уже есть "фича", встроенная в язык. :-)
И вот когда вы пытаетесь это сдеать при помощи ИЯ, то тут же утыкаетесь в необходимость специализированных библиотек.
А в чем проблема библиотек-то? Неужели решение по засовыванию всего, что только можно, в язык - это лучше, чем минимальный язык с вынесением всего остального в библиотеки?
(кстати, к сведению - есть и такой подход к обучению, при котором студенты начинают с использования большой базы готовых библиотек, задействуя их как "черные ящики", а затем постепенно "вскрывают" эти ящики, разбираясь, как они реализуются. Такой подход продвигает Бертран Мейер. Я не поддерживаю таких идей, но, тем не менее, интересно).
Про знаменитое "как икс может быть равен самому себе плюс один ?" я уж и не говорю. Ученики со всего размаху сажаются на идиосинкразии реализации в конкретном железе.
При чем тут железо? В процессе освоения пошаговой алгоритмизации изучается оператор изменения значения переменной. Оператор присваивания. Что здесь "железного" и недостаточно абстрактного? Трактуете переменную как ячейку памяти? Так на дворе давно не Фортран, и переменные полностью абстрагированы от реализации, являясь всего лишь "атомом" состояния программы. Ах, не нравится понятие "состояние программы"? А что в нем такого неабстрактного и непонятного на интуитивном уровне? Программа, как любая система, существует во времени, состоит из многих элементов, которые во времени меняют свое состояние. И причем тут реализация?
По поводу "как икс может быть равен самому себе плюс один" - так во всех нормальных императивных языках оператор присваивания не имеет ничего общего с операцией сравнения и выглядит по-другому.
Более того - недавно пришлось замещать пару по теоретическим основам информатики для студентов с факультета начального образования. Они с компьютером вообще никак, в школе в деревнях информатики тоже не было. Не спеша разобрались с понятием алгоритма, структурами алгоритмов на блок-схемах. Так вот, в тот момент, когда я употребил запись "x = x + 1", я сразу же вспомнил про то, что это может выглядеть непонятным. Только пускаюсь объяснять, как они мне: "А что тут непонятного? С одной стороны старый x, с другой новый".
№ 2450 01-04-2007 16:58 | |
Ответ на »сообщение 2447« (Jack Of Shadows)
___________________________
>>>Задача школьника научиться выражать простые мысли простым набором механизмов, а не надеяться что на каждый вопрос есть готовый ответ в виде библиотечной функции.
Видимо, задача школьника состоит в том, чтобы брать готовую конструкцию из самого языка, а не из библиотеки? :)
Основных вариантов два: либо вы включаете в язык все-все-все (и тогда задача школьника -- суметь-таки завершить чтение описания языка к концу учебного года), либо вы включаете дополнительные возможности в библиотеки (модули), оставляя язык простым и компактным.
№ 2449 01-04-2007 16:38 | |
Ответ на »сообщение 2446« (Руслан Богатырев)
___________________________
То, что с помощью сочетания процедурных переменных и записей в Обероне можно реализовать все что угодно, достаточно ясно.
Насколько я понимаю, довольно общая претензия к Оберону состоит в том, что Оберон -- "синтаксически несладкий" (диетический :) ).
В данном случае это проявляется в том, что хотя мы можем на лету реализовать любую функциональность (вот вам и λ), но в общем случае не можем оформить это просто как вызов функции. Ведь динамическая структура должна где-то подцепляться, а closure в Обероне нет.
№ 2448 01-04-2007 16:36 | |
Ответ на »сообщение 2447« (Jack Of Shadows)
___________________________
Нет нельзя. Это можно сказать прикладнику. Это его задача лазить по тысячам библиотек и выискивать сотни тысяч готовых функций.
Если исходить из Вашего утверждения и того, что программисты делятся на системных и прикладных, вытекает, что школа должна готовить системных программистов?
Так какая цель ставится перед таким школьником? Получить быстро результат? Узнать, как этого добиться в конкретном языке? Посмотреть анатомию решения задачи вплоть до "железа"?
№ 2447 01-04-2007 16:32 | |
Ответ на »сообщение 2444« (Руслан Богатырев)
___________________________
Можно сказать школьнику, что для таких конкретно задач есть модуль SuperPuperMath, а в нем процедура Fact, которая считает хошь какой факториал :)
Нет нельзя. Это можно сказать прикладнику. Это его задача лазить по тысячам библиотек и выискивать сотни тысяч готовых функций.
Задача школьника научиться выражать простые мысли простым набором механизмов, а не надеяться что на каждый вопрос есть готовый ответ в виде библиотечной функции.
И вот когда вы пытаетесь это сдеать при помощи ИЯ, то тут же утыкаетесь в необходимость специализированных библиотек. В то время как ФЯ дает минимальный набор ортогональных средств практически никак не привязанных к ограничениям железа.
Про знаменитое "как икс может быть равен самому себе плюс один ?" я уж и не говорю. Ученики со всего размаху сажаются на идиосинкразии реализации в конкретном железе.
№ 2446 01-04-2007 15:49 | |
Ответ на »сообщение 2445« (AVC)
___________________________
Я так понял, что используется некая динамическая структура данных.
Верно. А к ней -- несложный интерпретатор. Записи + ссылки дают основу для построения подобной динамики. А что есть списки в ФП? Те же динамические структуры.
Наверное, необязательно ориентироваться именно на сети Петри. :)
Конечно, необязательно. Просто я к ним неравнодушен :)
Остается один, чисто синтаксический, вопрос: как оформляется вызов такой функции?
Тут полная свобода для фантазии. Самый лобовой -- в модуль интерпретатора передается строка, которая разбирается и интерпретируется. Можно опосредованно -- в виде имен отдельных файлов (на нами придуманном языке композиции функций).
№ 2445 01-04-2007 15:40 | |
Ответ на »сообщение 2441« (Руслан Богатырев)
___________________________
Я так понял, что используется некая динамическая структура данных.
Наверное, необязательно ориентироваться именно на сети Петри. :)
Остается один, чисто синтаксический, вопрос: как оформляется вызов такой функции?
№ 2444 01-04-2007 15:37 | |
Ответ на »сообщение 2438« (Geniepro)
___________________________
Чрезвычайно просто и доступно для любого школьника, неправда ли?...
Можно сказать школьнику, что для таких конкретно задач есть модуль SuperPuperMath, а в нем процедура Fact, которая считает хошь какой факториал :)
Или уже нельзя в ИЯ делать "кеширование" полезных вещей в виде "свертки" в функции более специализированного плана?
№ 2443 01-04-2007 15:23 | |
Ответ на »сообщение 2442« (Сергей Перовский)
___________________________
А я вообще-то электрик и представления не имею, зачем мне разводной ключ :)
Лампочки бывают разных конструкций. Иногда без разводного ключа ну никак :)
В эту схему можно добавить для полноты картины еще и управдома (ООП). Как тут не вспомнить Нону Мордюкову в "Бриллиантовой руке". :)
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|