Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 492 22-07-2006 02:22 | |
Ответ на »сообщение 491« (Jack Of Shadows)
___________________________
Ваша функция MyMacroFunc компилируется вместе с остальными и выполняется в runtime.
Нет, она выполняется тоже precompile time. Я там не совсем полный вызов записал. Полный выглядит так:
Единственно, что я практически не пользуюсь этой возможностью. Это так, макросный прикол..
Конечно, Вагиф, у каждого языка своя ниша. "Самомодификация" – вещь, может, и не плохая, но опыт прогаммирования на ООП показал, что для надежности и читабельности кода, для работы в команде из ООП языков лучше убрать даже обычные макросы, не говоря уже о таких экзотичных вещах, которые можно реализовать в Forth или в Лиспе. Кстати, о встраивании языков. Даже ваш простой пример показывает, что "новый" язык встраивается в Лисп по синтаксическим правилам этого же Лиспа. И следующая строка
(setf my-list (select [person_id] [surname] :from [person] :where (= [fisrtname] "Artem")))
Не совсем похожа на нормальный SQL. Software Factories из ООП более гибки, и позволяют использовать метаязыки в любой форме.
Кстати, не из вредности, а по любопытсву. Если вам не трудно, приведите все-таки пример ленивого вычисления в Лиспе
№ 491 21-07-2006 17:37 | |
Ответ на »сообщение 490« (Артем)
___________________________
Это не макрос, обычная функция. Оn того что вы ее назвали макросом, она таковой не стала.
Макрос - это код который выполняется до этапа компиляции и генерирует (либо изменяет) исходный код программы, который уже затем компилируется.
Ваша функция MyMacroFunc компилируется вместе с остальными и выполняется в runtime.
А макросом в вашем коде является {$Include :))
Заметьте, создать такой же как этот макрос не можете, Он включен в дельфи командой разработчиков борланда.
И только они могут добавлять в дельфи макросы типа $IFDEF или $INCLUDE
В результате мы тоже получаем активный макрос.
You wish. :))
Если бы программисты могли с легкостью добавлять макросы в такие языки как дельфи, java, сишарп, уверяю вас, Гослинг с Хейслбергом прыгали бы до потолка от радости, и команде сишарпа не пришлось бы тратить несколько лет на такую легкую вешь как linq (легкую конечно для языка в котором макросы есть)
И не надейтесь кстати что макросы когда нибудь появятся в дельфи или сишарп.
Причина проста: Уникальный синтаксис лиспа.
Макросы в лиспе настолько легки только лишь потому что код лиспа представляет собой одну длинную запись иерархического списка.
Поскольку код других языков представляет собой не связанную никакой логикой мешанину из множества зарезервированных слов, которые к тому же должны подчиняться сложным правилам взаимного расположения, то обработка такого кода является задачей чрезвычайно трудной, требующей написания компилятора, что согласитесь не является легкой ежедневной задачей для обычных программистов.
Функциональность лиспа при этом не имеет никакого значения.
Существует множество функциональных языков. Но ни один из них не обладает синтаксисом, позволяющим легкое создание макросов.
Именно это и имеется в виду когда говорят об уникальности лиспа.
№ 490 21-07-2006 16:58 | |
Опять-таки, это смешно, но в институте темой одного моего курсового проекта были функциональные макросы в Дельфи. Если коротоко, то тело макроса было специально оформленным dpr-проектом, который перед компиляцией основной программы компилировался в dll. Функции в dpr-проекте были оформлены следующим образом
function MyMacroFunc(StArray:array of string):string;
begin
…
end;
А в основном теле программы вызовы макросов оформлялись в виде директивы
{$Include MyMacroFunc param1 param2 “param 3”}
В результате мы тоже получаем активный макрос.
В принципе, я согласен, что такая возможность должна быть и в ООП языке.
№ 489 21-07-2006 16:47 | |
Ответ на »сообщение 486« (Jack Of Shadows)
___________________________
Ответ на »сообщение 486« (Jack Of Shadows)
___________________________
Ну, наконец-то, Вагиф, мы вытянули из вас какие-то сведения о макросах в Лиспе. Хотя бы на один вопрос из многих заданных мною с N-й попытки я получил нечто, похожее на ответ. Вы ведь вызвались популяризировать Лисп, Вагиф, и в этом случае негоже так нервничать по поводу того, что кто-то плохо его знает. Поверьте, если бы я работал на Лиспе, то тогда даже не заглянул бы на эту ветку. А общался бы в специально предназначенных для этого форумах с другими лисперами. Я все еще надеюсь, что программирующие на Лиспе в массе своей вполне адекватны, и этот экзотический язык не вызывает у них попеременно то приступы хамства, то манию величия.
Артем, такие безапелляционные заявления присущи юнцу, который в жизни ничего не видел, и все меряет по своему только что полученному мнению.
Я пишу сайты в нотепаде. Ну не в нотепаде а в Notepad++ и в UltraEdit, которые по существу и являются продвинутыми нотепадами.
Позвольте, Вагиф, но я вас болтуном не называл. Речь шла о том, что сложное программирование немыслимо без специальной среды редактирования. Привожу свою цитату:
Когда я слышу от кого-то, что настоящие сайты пишутся в ноутпаде, я понимаю, что этот человек обыкновенный болтун
Вы разве говорили до этого, что пишете сайты в ноутпаде? И после этого вы также сказали, что пишете сайты в Notepad++ или в Ultraedit. А людей, которые говорили про нуотпад я, действительно, встречал. И они, действительно, были болтунами. Но среди них не было никого по имени Вагиф.
№ 488 21-07-2006 12:58 | |
Ответ на »сообщение 485« (Артем)
___________________________
http://www.maxkir.com/sd/languageWorkbenches.html
Артем, поздравляю. Вы нашли статью на русском которая говорит как раз о том что мы сейчас обсуждаем.
То есть. Кодогенерация (мета-программирование, DSL ) пошла двумя путями.
В лиспе развитие пошло путем макросов, потому что лисп имеет минимальный синтаксис и очень гибок.
В остальных языках (Мартин Фаулер называет их языками с фигурными скобками, то есть си, сишарп, java, да и дельфи тоже в это семейство входит) в виду их гораздо более жесткого синтаксиса, когдогенерация пошла по пути создания внешних сред (IDE, визарды)
В принципе оба подхода пытаются решить одну и ту же задачу. Создание специализированных языков (инструментов) для решения специфических задач.
Отсюда вобщем то и понятно почему у лисперов никогда не было навороченной среды.
В ней просто нет необходимости. Макросы ее заменяют.
Интересно то что, несмотря на имеющиеся мощные средства визуального мета программирования для работы с БД в VS dotnet, команда сишарп решила таки пуститься во все тажкие и добавить linq в язык.
Что говорит о том что путь визардов и визуальных построителей все таки не такой удобный как встраивание DSL в язык.
Во всяком случае к этому мнению пришли разработчики dotnet, а также java (добавили generics)
К сожалению такая операция для них - это что то невероятно трудное, требующее годы работы команды разработчиков, в течении которых весь мир программистов вынужден просто ждать, когда же они закончат.
В лиспе вы сами себе Андерс Хейлсберг, Гослинг и Вирт в одной ипостаси.
Кому какой подход нравится больше - это уж каждому решать для себя.
№ 487 21-07-2006 11:58 | |
Ответ на »сообщение 484« (Drum)
___________________________
Прошу прощения я не знаток Лиспа, но мне стало очень интересно - его правда можно откомпилировать в Notepad и проверить синтаксис?
Не откомпилировать в нотепад, а писать в нотепад. Компилируется он отдельным компилятором, как впрочем и дельфи вы можете писать в нотепад, а затем скармливать ваши pas файлы дельфишному компилятору dc32.
Для этого свосем не обязательно запускать среду.
Просто многие возможности дельфи (генерация кода для работы с sql например) доступны вам только их среды.
В нотепад, вам придется все ручками писать.
А мне в лиспе все те же средства генерации кода доступны из любого редактора.
№ 486 21-07-2006 11:54 | |
Ответ на »сообщение 482« (Артем)
___________________________
А Лисп, действительно, при компиляции может проверять только синтаксис, но не семантику. Для этого потребуется активное действие, уважаемый.
Артем, нет ничего удивительного в том что человек, не знакомый с лиспом не понимает как работают макросы.
Макросы это самая обычная лисп программа, которой доступны все остальные лисп библиотеки и функции.
Поэтому макрос во время развертывания может делать все то же что и обычная программа, то есть посылать emails, или соединяться по ftp, или конечно же подсоединяться к БД и анализировать структуру таблиц, названия, полей, их типы итд итп.
Так что еще раз повторяю, библиотека для работы с sql в лиспе ограничена всего лишь вашими желаниями чего вы от этой библиотеки хотите.
Если проводить аналоги между лиспом и дельфи чтобы было понятнее, то макросы это и есть design time в дельфи.
Просто вместо внешней программы (визарда какого нибудь, или того же IDE) выступает сам компилятор лиспа, который сначала исполняет макросы, а затем, после того как макросы отработали, компилирует сгенерированный ими код.
Вы правы говоря что современные языки неотделимы от сред. Дельфи без своей IDE теряет половниу свойств.
Сишарп без VS тоже, как и java без eclipse или IDEA.
Среды в этих языках и есть замена макросам. И то и другое - в конечном итоге = мета программирование.
И то и другое может генерировать код. Как генерирует код дельфи (не компилятор, среда), когда вы бросаете компоненты на форму, или когда вы открываете в decign time TAdoQuery, и генерируете список полей.
Так вот лиспу для этого никакая среда не нужна. Вам все тоже самое сгенерируют макросы.
Когда я слышу от кого-то, что настоящие сайты пишутся в ноутпаде, я понимаю, что этот человек обыкновенный болтун
Артем, такие безапелляционные заявления присущи юнцу, который в жизни ничего не видел, и все меряет по своему только что полученному мнению.
Я пишу сайты в нотепаде. Ну не в нотепаде а в Notepad++ и в UltraEdit, которые по существу и являются продвинутыми нотепадами.
Я пишу лисп в emacs. Просто потому что как я уже обьяснил, работая в лиспе, я не чувствую необходимости в костылях типа навороченных сред.
Мне их заменяют макросы.
В следующий раз, обьявляя всех кто работает не как вы болтунами, будьте поосторожнее.
Вспомните хотя бы как вы сами взвились, когда вам показалось, что я не лисперов считаю посредственностями.
Хотя я всего лишь говорил о том что люди ВЫНУЖДЕНЫ писать не на лиспе. В то время как вы нас клеите меткой "болтуны".
№ 485 21-07-2006 07:44 | |
№ 484 21-07-2006 05:36 | |
Ответ на »сообщение 481« (Jack Of Shadows)
Это в отличие от лиспа, который вы можете писать в чем угодно, хоть в нотепаде, и все равно иметь компиляцию, и проверки при компиляции любого синтаксиса.
Прошу прощения я не знаток Лиспа, но мне стало очень интересно - его правда можно откомпилировать в Notepad и проверить синтаксис?
Если не секрет, как это происходит?
№ 483 21-07-2006 04:53 | |
Ответ на »сообщение 481« (Jack Of Shadows)
___________________________
Ребята, давайте жить дружно :)
Возможность расширения синтаксиса языка, это замечательное (в некоторых случаях) качество.
Хотелось бы про эти случаи поподробнее.
Когда выгодно создавать специализированный язык?
Когда для задачи нет адекватного языка.
Тут приводилась ссылка на замечательную статью о использовании лиспа для написания интернет-магазинов.
Но, при всем уважении к автору, хотелось бы расставить по другому акценты.
25% кода- это макросы, т.е. ребята по сути написали свой специализированный язык для описания интернет магазинов, который позволил обойти конкурентов.
Это означает:
1)авторы лучше всех поняли, что именно требуется;
2)адекватного языка не существовало.
Именно в этом порядке.
Мне не кажется таким большим преимуществом, что вместо использования специализированных средств, можно написать их заново, внутри лиспа. Может быть потому, что я не очень интересуюсь вопросами переносимости, а времени на "написать самому прямо в лиспе" мне жалко.
Вот если адекватного языка не существует, то имеет смысл его написать и тут лисп может быть подспорьем.
Отсюда вопрос: для каких задачь не существует на сегодняшний день удобного языка.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|