Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 522 28-07-2006 11:11 | |
Ответ на »сообщение 515« (Артем)
___________________________
Вообще-то, в просторечии у программистов препроцессор, макрос, прекомпилятор – суть одно и то же.
Визуальная среда, макросы, препроцессоры, кодогенераторы - суть одно и тоже - мета-программирование. Однако заявлять на этом основании что IDE Delphi и макросы это одно и тоже потому что видите ли решают одну и ту же задачу - генерируют код до компиляции, было бы не верно.
Другое дело, что препроцессоры бывают разных видов.
Кирка и отбойный молоток решают абсолютно одну и ту же задачу, но ведь никто не ставит между ними знак равенства.
Техническое различие имеет решающее значение. И никто не буджет говорить "Кирки бывают разных видов, но все это одно и тоже" :))
Да, макросы и препроцессоры решают одну и ту же задачу. Но технически это совершенно разные инструменты.
Давайте намалюем стандартную схему макроса:
ПРОГРАММА+МАКРОС ---(прекомпилятор)--->ОКОНЧАТЕЛЬНЫЙ ТЕКСТ ПРОГРАММЫ ---(стандартный компилятор)--->БИНАРНЫЙ КОД(ИЛИ ПСЕВДО КОД)
Артем, вы не понимаете. Я не имею в виду препроцессоры ДЛЯ СОЗДАНИЯ БИБЛИОТЕКИ.
Я имею в виду препроцессоры КАК ЧАСТЬ БИБЛИОТЕКИ.
То есть если вы захотите дать своим пользователям возможность самим использовать ваши макросы, то вам придется поставлять препроцессор вместе с библиотекой, а также документацию, как его использовать.
В лиспе макросы не используются для того чтобы сгенерировать библиотеку из стандартного лиспа и затем поставлять ее.
В лиспе макросы идут как часть исходного кода библиотеки, то есть конечные пользователи используют эти макросы.
№ 521 28-07-2006 10:57 | |
Ответ на »сообщение 520« (Max Belugin)
___________________________
Макс, абсолютно верно :)) Мне просто нечего добавить.
№ 520 28-07-2006 09:39 | |
Насколько я понял, корень этой лиспомакровой крутизны в следующем:
*Язык простой и довольно тупо мепится на AST (не уверен, что именно AST тут правильный термин может "Модель программы")
*Программе доступен свой AST
*AST сделано из тех же структур что и обычная программа - из списков
*Есть традиции и библиотеки для работы со списками
В результате можно использовать уже готовый траслятор для написания макроса. Макрос не работает с текстом, а только с AST при этом не обязан работать со всей AST, а может быть вызван как обычная функция относительно некоторого кусочка программы.
В итоге можно легко сделать практически любой язык, правда с синтаксиом лиспа.
Джек поправьте, если я ошибся
№ 519 28-07-2006 08:05 | |
сообщение от модератораЯ тоже был в отпуске, поэтому, к сожалению, пропустил момент, когда здесь началась вся эта ерунда. Но теперь я здесь и, если что, буду вырезать всё сразу.
1. Артём получает строгое предупреждение за систематические оскорбительные провокации (например, сободезнования, с которых началось »сообщение 515«, я безусловно отношу к таким провокациям). И внимательнее надо быть к аргументам противников, чтобы не обвинять их в том, чего они не говорили. С этого момента любое подобное сообщение будет удаляться.
2. Jack of Shadows получает благодарность за то, что в течение всего этого времени не поддавался на провокации и отвечал сдержанно и корректно, хотя это, видимо, было непросто.
№ 518 28-07-2006 05:05 | |
Ответ на »сообщение 517« (Сергей Перовский)
___________________________
Очень правильное замечание :)
№ 517 28-07-2006 04:27 | |
Ответ на »сообщение 512« (Jack Of Shadows)
___________________________
По сути Вы утверждаете очень простую вещь: в лиспе проще написать препроцессор и можно поставлять его прямо в составе программы.
Это все тот же разговор об использовании универсального или специализированного инструмента.
Когда Вы говорите - "можно использовать внутри лисп-программы любой язык", надо не забывать добавить "если напишете его компилятор".
Если у меня есть готовый инструмент для SQL запросов, меня не слишком привлечет перспектива написать его самому, даже если в лиспе это проще, чем в других языках.
№ 516 28-07-2006 03:46 | |
Простите за мои описки. Все время путаю с [Qoute]. Обещаю в своем Ворде сделать кнопочки-макросы, как на сайте :)
№ 515 28-07-2006 03:42 | |
Ответ на »сообщение 512« (Jack Of Shadows)
___________________________
Вагиф, мои соболезнования. После отдыха на озере Тахо вам придется снова созерцать бурчание этих несносных "непонимателей" Лиспа, вернее уже не Лиспа, а макросов и препроцессоров (действительно, уже пора открывать макросную ветку форума). Итак, Вагиф, приступим.
Приведу цитату из вашего поста.
Ну я так и знал. :)) Начинали с того что в дельфи макросы сделали, а выяснилось, что до дельфи, текст программы обрабатывает ваша программа.
Это не макросы, Артем, это препроцессор. Их полно, наиболее известные это это SQL/J и AspectJ. Разница между препроцессорами и макросами колоссальная.
У меня сейчас нет времени, надо бежать. Но если вас интересует мы попозже эту тему раскроем. А пока что скажу вам что премия Тюринга за препроцессор вам не светит :))
Вообще-то, в просторечии у программистов препроцессор, макрос, прекомпилятор – суть одно и то же. Но, если уж быть дотошным, давайте приведем цитаты из любимой вами Википедии.
В информатике, препроцессор — это компьютерная программа, принимающая данные на входе, и выдающая данные, предназначенные для входа другой программы, например, такой как компилятор. О данных на выходе препроцессора говорят, что они находятся в препроцессированной форме. Наиболее частый случай использования препроцессора — обработка исходного кода перед передачей его на следующий шаг компиляции. Языки программирования C/C++ и система компьютерной вёрстки TeX используют препроцессоры, занчительно расширяющие их возможности. Название широко распространенного скриптового языка программирования PHP является рекурсивным акронимом "PHP: Hypertext Preprocessor".
Макрос — программный объект, при обработке «развёртывающийся» в последовательность действий и/или команд. В языке ассемблера, а также в некоторых других языках программирования, макрос — символьное имя, заменяемое при обработке препроцессором на последовательность программных инструкций. Для каждого компилятора (ассемблера) существует специальный синтаксис объявления и вызова макросов.
При этом внутри макроса могут быть условные операторы препроцессора, многие компиляторы поддерживают при вызове макросов передачу аргументов. В этом случае один и тот же макрос может «разворачиваться» в различные последовательности инструкций при каждом вызове — в зависимости от сработавших разветвлений внутри макроса и переданных ему аргументов.
Итак, в сухом остатке препроцеесор – это программа, обрабатывающая макросы, Вагиф. Т.е. две составляющие ОДНОЙ сущности. Так что говорить о том, что препроцессор и макрос это разные вещи, извините, неправильно. Другое дело, что препроцессоры бывают разных видов. Я уже говорил ранее об этом, почитайте внимательней.
Давайте намалюем стандартную схему макроса:
ПРОГРАММА+МАКРОС ---(прекомпилятор)--->ОКОНЧАТЕЛЬНЫЙ ТЕКСТ ПРОГРАММЫ ---(стандартный компилятор)--->БИНАРНЫЙ КОД(ИЛИ ПСЕВДО КОД)
Бывает, что по разным причинам (например, чтобы попробовать втюрить свой продукт большему количеству пользователей) эта схема редуцируется в следующую:
ПРОГРАММА+МАКРОС ---( стандартный компилятор + прекомпилятор)-->БИНАРНЫЙ КОД(ИЛИ ПСЕВДО КОД)
А вот, схема интерпретационного макроса:
ПРОГРАММА++БИБЛИОТЕКА-ИНТЕРПРЕТАТОР)--(стандартный компилятор)-->БИНАРНЫЙ КОД(ИЛИ ПСЕВДО КОД)
А вот, схема «инжекторного» макроса:
ПРОГРАММА+{МАКРОС-РЕСУРС|МАКРОС-АТРИБУТ|МАКРОС-ФУНКЦИЯ)--(стандартный компилятор)-->ПРОМЕЖУТОЧНЫЙ БИНАРНЫЙ КОД(ИЛИ ПСЕВДО КОД) -->)--(инжекторный посткомпилятор)--> ОКОНЧАТЕЛЬНЫЙ БИНАРНЫЙ КОД(ИЛИ ПСЕВДО КОД)
И это еще не все возможные схемы. Но, самая употребляемая – первая.
Приведу еще одну вашу цитату.
В случае же с препроцессорами, вместе с библиотекой вам придется еще поставлять саму программу-препроцессор, а пользователю, надлежащим образом использовать ее. А теперь представьте себе вы пользуетеь десятью библиотеками от разных компаний, каждая из которых приходит со своим препроцессором, и со своими идиосинкразиями (инсталяция, автоматический запуск, привязка на расширение файла). История создания и развития препроцессоров показала, что один только этот недостаток является решающим. Так например препроцессор SQLJ от Оракла, не нашел признания в java обществе, потому что лишал java программы их основного достоинства - переностимости. Тот кто пользовался SQLJ становился намертво привязан к средствам разработки от Оракл
Тот, факт, что некоторые библиотеки при разработке, которых использовался препроцессор, нельзя использовать без установки препроцессора говорит лишь о некоторых особенностях конкретного препроцессора, но не всего класса препроцессоров. В частности, (только для примера, а не для того, чтобы оттяпать премию Тьюринга у кого-то) упомянем мое творение. Программные библиотеки, разработанные с его помощью, поставляются в виде программного текста, в котором присутствуют модифицированные инклуд-директивы и инклуд-файлы содержащие сгенерированный текст. Для пользователя библиотеки тот факт, что при разработке библиотеки я использовал прекомпилятор остается прозрачным. При компиляции библиотеки макрокомпилятор не нужен, он нужен лишь для разворачивания текста макровызовов в нормальный программный текст. Здесь мы видим, что процесс компиляции и прекомпиляции (препроцессинга) могут использоваться порознь. Ну, естественно, в этом случае можно поставлять библиотеку и в бинарном виде.
№ 514 Удалено модератором | |
№ 513 28-07-2006 00:28 | |
Ответ на »сообщение 508« (Елена Филиппова)
___________________________
Уважаемые господа! Прошу не превращать обсуждение в банальную ругань.
Уважаемая Королева. Режьте их нещадно :)) На вас вся надежда.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|