Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 1292 20-09-2006 08:36 | |
Ответ на »сообщение 1289« (Артем)
___________________________
>>Есть один ведущий язык, под который писаны законы в .NET - это C#.
>А как же реализованная в IL возможность оптимизации хвостовой рекурсии, которую испотльзует F# и не использует C#? Насколько я слышал, это не единственная фича .Net, которую C# не использует. Так что не надо упрощать.
Было бы странно, если бы C# использовал все фичи (а зачем C# нужна такая оптимизация?). IL - это низкоуровневая "подстилка". В контексте .NET ее роль неопределяющая. В той же WAM (Warren Abstract Machine) хвостовая рекурсия для Пролога была встроена в начале 80-х. Вы наверняка в курсе, что в той же Java нет goto, но в JVM-то есть. Другие языки, реализованные через JVM, спокойно могут это пользовать. И какой из этого вывод? Ну есть и есть.
№ 1291 20-09-2006 08:32 | |
Кстати, по поводу функциональной чистоты. В статье Amr Sabry "What is a Purely Functional Language" есть такое утверждение:
A language is purely functional if (i) it includes every simply typed lambda-calculus term, and (ii) its call-by-name, call-by-need, and call-by-value implementations are equivalent (modulo divergence and errors).
№ 1290 20-09-2006 08:31 | |
Ответ на »сообщение 1267« (Артем)
___________________________
Ответьте честно, Geniepro. Я вот смотрю, вы интересуетесь и Лиспом, и Хаскелем, и Сисалом, может еще чем-нибудь. А программы вы на них пишете?
Вы, наверное, имеете в виду достаточно серьёзные программы, производящие какую-то полезную работу?
Нет, такие не пишу. Пока не пишу. Пока нет таких задач. Но вообще-то планирую, в преспективе...
Пока что я изучаю ФП, в частности Лисп/Scheme и Хаскелл. Ну и, по ходу дела, пытаюсь рекламировать ФП в меру своих сил и знаний... :-)
Другие функциональные языки меня интересуют также, как меня интересуют Ада/Оберон/С#/..., хотя использовать реально приходится только Си и Дельфы.
Хаскелл для меня лично представляет сейчас интерес именно как более-менее чистый ФЯ - с ленивыми вычислениями, нестрогой семантикой, автовыводом типов - именно то, что и отличает ФП от ИП и ООП. Но вот его статическая типизация затрудняет делать некоторые вещи, которые легко реализуются в том же Лиспе. Но, видимо, это только от моего слабого знания Хаскелла.
Тут уже были попытки обозвать тот же OCaml императивным языком ввиду последовательного просмотра let-выражений. Это, уважаемый, не последовательность, а задание древообразной зависимости.
Вот, кстати, чем мне ещё нравится Хаскелл, так это тем, что в нём необязательно использовать let in. Мне, почему-то, не нравится подход к разработке программы снизу-вверх, от низкоуровневых функций к высокоуровневым. Слишком обычно, по-паскалевски, по-фортовски... :-))
Да, меня тогда ещё и этот light syntax F#'овский попутал.
Кстати, а как можно расценить цикл for в этом примере из документации по F#
let FunctionSample() =
let tick x = printf "tick %d\n" x in
let tock x = printf "tock %d\n" x in
let choose f g h x =
if f x then g x else h x in
for i = 0 to 10 do
choose (fun n -> n%2 = 0) tick tock i
done;
printf "done!\n"
Типичный императивный multiple assignment..
Или здесь, как и в SISAL, при каждой итерации создаётся новая переменная i, а старая забывается?
№ 1289 20-09-2006 07:21 | |
Ответ на »сообщение 1288« (bb)
___________________________
Но мы как-то все больше отдаляемся от темы ветки. Ну, тогда чуто-чуть приблизимся к ней и сделаю еще одно маленькое замечание относительно Есть один ведущий язык, под который писаны законы в .NET - это C#. А как же реализованная в IL возможность оптимизации хвостовой рекурсии, которую испотльзует F# и не использует C#? Насколько я слышал, это не единственная фича .Net, которую C# не использует. Так что не надо упрощать.
Я еще раз повторяю: .Net может дать второе дыхание хорошим языкам, т.к. они получают доступ ко всей ее мощи
№ 1288 20-09-2006 07:12 | |
Ответ на »сообщение 1287« (Артем)
___________________________
CTS - это как раз благо.
Смотря для кого.
Если вы считаете, что ваш экзотический язык, хорошо подходящий для решения какого-то класса задач, не будет использоваться по причине слабости или отсутствия наработанных библиотек для него - пишите реализацию для .Net и для вашего языка откроется вся мощь библиотек .Net.
"Всю мощь" можно получить и не загрязняя язык - через посредника.
А чем требование того, что язык должен компилироваться в CIL хуже требования компиляции в машинные коды?
Это как раз вообще не смущает.
Люди должны соблюдать законы, и чем лучше законы, тем лучше в государстве жить. Взамен, государству делегируются полномочия, которые отдельными индивидуумами выполнены быть не могут. Что же насчет монастыря, то и в .Net можно сделать язык, который не поддерживает некоторые спецификации.
Как Вам перспективы жить в Бурунди - одной из самых опасных стран в Африке? Если в реальной жизни люди могут выбирать страну (и то не все и не всегда), то в мире информационных технологий выбор невелик - между плохим и очень плохим.
Опять-таки, скажите, чем требование того, чтобы язык подчинялся требованиям
VM хуже того, чтобы язык подчинялся требованиям OS?
Язык не обязан ни подчиняться VM, ни тем более OS. VM - это реализация языка (кто под кого должен подстраиваться?). А OS - вещь вообще посторонняя. К сожалению, в современном программировании OS (а теперь и VM) - на первом плане. О времена, о нравы!
Но мы как-то все больше отдаляемся от темы ветки.
№ 1287 20-09-2006 07:00 | |
Ответ на »сообщение 1286« (bb)
___________________________
CTS - это как раз благо. Если вы считаете, что ваш экзотический язык, хорошо подходящий для решения какого-то класса задач, не будет использоваться по причине слабости или отсутствия наработанных библиотек для него - пишите реализацию для .Net и для вашего языка откроется вся мощь библиотек .Net. При этом вам никто не запрещает писать нативные библиотеки, которые не обязательно должны ограничиваться рамками CLS. Посмотрите на F#, у него гораздо больше перспектив, чем у его прообраза - OCaml, потому что наряду с OCaml-скими фичами он имеет доступ к .Net-вским.
А чем требование того, что язык должен компилироваться в CIL хуже требования компиляции в машинные коды? Первое даже легче, учитывая наличие CodeDOM и относительную высокоуровневость IL по сравнению с машкодами (или нативным ассемблером).
Люди (формально - граждане конкретного государства) могут жить в монастыре и при этом от государства им нужно одно - чтобы оно не вмешивалось в их жизнь. Это не государство, а первобытное-общинный строй, когда никто никуда не вмешивается (хотя и тогда наверное вмешивались - дубиной по голове). Люди должны соблюдать законы, и чем лучше законы, тем лучше в государстве жить. Взамен, государству делегируются полномочия, которые отдельными индивидуумами выполнены быть не могут. Что же насчет монастыря, то и в .Net можно сделать язык, который не поддерживает некоторые спецификации.
Опять-таки, скажите, чем требование того, чтобы язык подчинялся требованиям
VM хуже того, чтобы язык подчинялся требованиям OS?
№ 1286 20-09-2006 06:31 | |
Ответ на »сообщение 1285« (Артем)
___________________________
C-программа, состоящая из одной процедуры main является наиболее императивной. :)
Не всегда. В main может быть просто одна "пускалка" - один оператор вызова некоей внешней (библиотечной/встроенной) процедуры, которая интепретирует некие описания работы, представленные, например, в наборе текстовых/бинарных файлов. Нет последовательности - нет императивности.
Но я совсем не понимаю, почему вы считаете, что в .Net нельзя реализовать полноценные версии других языков?
А кто сказал, что нельзя? Церковь может находиться на территории государства и при этом быть от него отделена. Люди (формально - граждане конкретного государства) могут жить в монастыре и при этом от государства им нужно одно - чтобы оно не вмешивалось в их жизнь. Так и в случае с .NET. Язык может быть реализован в .NET, но при этом возникает вопрос: будет ли он претендовать на полноправное участие в жизни "государства", либо предпочитает быть отшельником.
В первом случае ему придется соблюдать законы, установленные власть предержащими. Вы наверняка все это знаете, но лишний раз уточню. Microsoft .NET - конкретная реализация т.н. CLI (Common Language Infrastructure), составными частями которой являются:
- общая система типов CTS (Common Type System);
- общая спецификация языков CLS (Common Language Specification);
- система метаданных (Metadata System);
- виртуальная исполнительная система VES (Virtual Execution System);
- общий промежуточный язык CIL (Common Intermediate Language).
CTS, CLS и Metadata System являются наиболее критичными для того, чтобы язык полноценно погрузился в CLI (читай .NET). Типы, классы/объекты должны быть "ГОСТированы". Есть один ведущий язык, под который писаны законы в .NET - это C#. Остальные в .NET - граждане второго сорта.
Но самые независимые/гордые языки, конечно, могут быть отшельниками. Никто не запрещает.
№ 1285 20-09-2006 05:19 | |
Ответ на »сообщение 1284« (bb)
___________________________
Любые рассуждения о "чистоте" (и деления на чистых и нечистых) должны исходить из того, что чистота весьма относительна.
Можно сказать и так: любая декларативность сводится к императивности и есть неявное ее выражение. Чем более неявно эта императивность определена, тем более язык декларативен. C-программа, состоящая из одной процедуры main является наиболее императивной. :)
Microsoft в лице .NET - сторонник второго.
Я согласен, что для ПРОФЕССИОНАЛЬНОГО программирования в .Net желательно знать C#. Но я совсем не понимаю, почему вы считаете, что в .Net нельзя реализовать полноценные версии других языков?
№ 1284 20-09-2006 04:56 | |
Ответ на »сообщение 1283« (Артем)
___________________________
И это не значит, что язык императивен, т.к. общая последовательность выполнения не связана с последовательностью задания клозов. Так же и ФП нельзя назвать императивным на том основании, что там бывает определен конкретный порядок вызова подфункций.
Значит, консенсус налицо. Обратите внимание, я написал "Декларативность Пролога имеет известные императивные основы". Из этого абсолютно не вытекает, что я назвал Пролог императивным языком.
Мысль моя была проста: неявная императивность, которой пронизаны ФП и ЛП, совсем не способствуют их чистоте. Любые рассуждения о "чистоте" (и деления на чистых и нечистых) должны исходить из того, что чистота весьма относительна. В наше время даже самые чистые языки (если они не предназначены исключительно для умственного исполнения) вынуждены опускаться с небес на грешную Землю и пропитываться этим "противным" фон-неймановским императивом со всеми вытекающими отсюда последствиями.
А дальше есть, как минимум, три пути:
1. Признавать самостоятельность каждой парадигмы (в лице ее самых ярких представителей) и изучать возможности мирного равноправного сосуществования разных парадигм.
2. Выделять главную парадигму, остальным отводить роль вспомогательных, которые ей подчиняются. Можно как на уровне одного ЯП, так и отдельной системы.
3. Признавать только одну парадигму, остальные имитировать в ней, называя это обогащением другими стилями.
Лично я сторонник первого пути. Microsoft в лице .NET - сторонник второго. Ну и есть и те, кто исповедует третий путь. Пальцем показывать не будем - это, надо полагать, осознанный выбор конкретных людей.
№ 1283 20-09-2006 04:35 | |
Ответ на »сообщение 1282« (bb)
___________________________
Классический Пролог, действительно, нельзя признать полностью декларативным, т.к. логический вывод, действительно зависит от последовательности клозов, но при этом эти последовательности легко выделются в отдельные фрагменты. И это не значит, что язык императивен, т.к. общая последовательность выполнения не связана с последовательностью задания клозов. Так же и ФП нельзя назвать императивным на том основании, что там бывает определен конкретный порядок вызова подфункций.
Для предотвращения зацикливания и других неприятных эффектов в Пролог программисты пользуются правилами заданиями клозов (от простого к сложному и т.д.и т.п), т.е. существует определенный момент, связанный с опытностью программиста (Хотя даже неопытный по результатм выполнения или трасстровки поймет, что порядок надо изменить). В новых версиях (опять тот же Mercury) такие неоднозначности как порядок клозов или недетерминированность стараются минимизировать.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|