Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 702 13-08-2006 04:51 | |
Ответ на »сообщение 701« (Артем)
___________________________
Пардон, не Фиббоначи, а факториала. Совсем заработался
№ 701 13-08-2006 04:50 | |
Ответ на »сообщение 700« (Артем)
___________________________
не GiantSt, а GiantInt
№ 700 13-08-2006 04:45 | |
Ответ на »сообщение 699« (hugi)
___________________________
Да и вообще, как-то странно Вы переводите, с идеологическим уклоном.
Однако Вы пропустили мимо ушей моё замечание
А я-то боялся, что это только я и вижу. Меня тут раньше даже провокатором обозвали по отношению к Jack of Shadows...
Кстати, hugi, посмотрите ссылку http://delphi-faq.zoxt.net/c39.htm?id=70021
И попробуйте сделать, например вычисление чисел фиббоначи (см. ниже), используя модуль UmathServices
function GiantFactorial(n:string):string;
begin
if n='0' then Result:='1'
else Result:=ulMPL(n,GiantFactorial(ulSub(n,'1')));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(GiantFactorial('2000'));
end;
В C# можно написать специальный класс GiantSt и переопределить для него операторы, так что будет еще красивее.
№ 699 13-08-2006 03:19 | |
Ответ на »сообщение 693« (Jack Of Shadows)
___________________________
Перевести на русский ? Полиморфизм это центральная концепция ЦЕЛЬ, которая реализуется при помощи СРЕДСТВА ООП.
Не могли бы Вы назвать автора Вашего Англо-Русского Словаря? Просто интересно, кто это додумался перевести слово "concept" как "цель"? Я и в словарь синонимов заглянул: "концепция -- понятие, идея". Странно...
Да и вообще, как-то странно Вы переводите, с идеологическим уклоном. Вот Вам эта же фраза в официальном переводе:
И, как мы увидим в следующих главах, полиморфизм играет очень важную роль в объектно-ориентированном проектировании.
Конечно, тоже не дословный перевод, но более близок к оригиналу, чем Ваш. Тем более, что в оригинале и намёка на слова: "ЦЕЛЬ, которая реализуется при помощи СРЕДСТВА ООП", -- нет!
Но это ещё ничего! Читаем дальше!
Basically, polymorphism is a concept in type theory wherein a name (such as the parameter d) may denote instances of many different classes as long as they are related by some common superclass.
И Вы утверждаете, что теория типов ничего не говорит об ООП. Постойте, а откуда в этой цитате взялись такие термины, как "instance", "class", "superclass"? А дальше опять отсебятина: ООП это механизм (средство реализации) этих концепций.
Единственная мысль из всего Вашего сообщения, с которой я согласен, так это:
Все эти private, public, protected - механизм, средство реализации концепции инкапсуляции.
Да, это средства реализации инкапсуляции, но что?.. неужели они тождественны ООП в целом? Нет, конечно же! Средства реализации инкапсуляции различаются для каждого ОО языка. Так в C# есть ещё internal, а в Smalltalk этих слов вообще нет: все методы -- открытые, все поля -- закрытые, но тем не менее и C# и Smalltalk -- это ОО языки.
Существуют и другие механизмы реализации этих концепций.
Про type classes уже слышали. Однако Вы пропустили мимо ушей моё замечание, о том, что это очень уж напоминает родные программистам на Delphi, C#, Java интерфейсы.
А как Вам такая цитата из Буча:
Каждый стиль программирования имеет свою концептуальную базу. Каждый стиль требует своего умонастроения и способа восприятия решаемой задачи. Для объектно-ориентированного стиля концептуальная база - это объектная модель. Она имеет четыре главных элемента:
* абстрагирование;
* инкапсуляция;
* модульность;
* иерархия.
Разве Буч называет эти элементы целями? Нет! Объектная модель ВКЛЮЧАЕТ в себя эти элементы, цели же не могут ВКЛЮЧАТЬСЯ в объектную модель, да и в какую либо другую.
Главная же цель у ООП одна: борьба со сложностью. Всё остальное -- средства!
№ 698 12-08-2006 17:35 | |
Ответ на »сообщение 697« (Артем)
___________________________
Кошмар! Я тут подумал, что кое-у-кого могут возникнуть аллюзии насчет Марии Антуанетты и всю нашу лавочку быстро накроют. Ужас! Лисп в опасности!
:)))
Ну здрассте! С чего это прикрывать?
Матом друг друга не кроем, очень даже интеллигентно общаемся... :-)
Опыт оберонщиков не пропал даром... :-))
Революция Лиспа? хм... длиной в полвека? :-))
А вообще, Geniepro, переходите на Лисп.
Кстати, этот вопрос я как раз и изучаю. Вот как-раз закачал LispWorks Personal, буду посмотреть, чем он хорош...
Но вообще-то, в свете многоядерности Лисп имеет мало перспектив, увы... :-(
И ваще надо возродить OCCAM - он как раз был заточен под параллельные процессы.
Жаль, нет толковых компиляторов для Win32 и особенно .NET. Я как раз коллекционирую компилеры для Visual Studio... :-))
В общем, и на марсе будут яблони цвести (если технологическая сингулярность не бабахнет :) )
Яблони на Марсе будут, вот только проведём геотрансформацию Марса (или как там?)
А в сингулярности я не верю... :-))
№ 697 12-08-2006 16:39 | |
Ответ на »сообщение 696« (Артем)
___________________________
Кошмар! Я тут подумал, что кое-у-кого могут возникнуть аллюзии насчет Марии Антуанетты и всю нашу лавочку быстро накроют. Ужас! Лисп в опасности!
:)))
№ 696 12-08-2006 16:35 | |
Ответ на »сообщение 695« (Geniepro)
___________________________
Почему Я должен увеличивать размер стека??? :-x
Почему компилятор об этом не заботится??? :-x
Опять 25. Мы же указываем минимальный и максимальный размер стека. Если текущего размера мало, то он автоматически увеличивается. Верхний лимит - MAXSTACKSIZE. Не нравится, как это сделано в Дельфи - переходите на .net. Другое дело, если рекурсия у вас неправильная, то она даст переполнение и в Delphi, и в .net, и в ФЯ.
Как не устаёт повторять Jack - наступает время, когда мы сможем себе позволить возлагать рутину на компьютер и решать свои задачи, не отвлекаясь на ненужные мелочи типа чьих-то старых глюков... ;-)
Пусть даже ценой небольшой потери производительности программ...
Как сказал великий... В общем, и на марсе будут яблони цвести (если технологическая сингулярность не бабахнет :) )
А вообще, Geniepro, переходите на Лисп. Расскажете нам о своих впечатлениях. Может, устроим тогда в королевстве Дельфи революцию. И Jack of Shadows будет нашим Робеспьером.
:)))
№ 695 12-08-2006 15:11 | |
Ответ на »сообщение 688« (Артем)
___________________________
По умолчанию максимальный размер стека - {$MAXSTACKSIZE $0100000}.
Увеличьте его - {$MAXSTACKSIZE $01000000}. И ваша программа отработает. Вообще, по умолчанию размер стека в Дельфи маленький. Если будут интенсивно использоваться рекурсивные функции – его надо увеличивать.
Теперь о том, почему у меня все отработало и при стеке по умолчанию. Потому, что у меня более оптимальная и правильная рекурсивная функция. Посмотрите на нее внимательнее. :)
Вот об этом и речь в этой теме - традиционные системы программирования заставляют слишком много времени тратить на решение проблем, не имеющих отношения к основной задаче...
Почему Я должен увеличивать размер стека??? :-x
Почему компилятор об этом не заботится??? :-x
Почему программа в скомпилированном виде сама не увеличит стек при необходимости? :-x
Как не устаёт повторять Jack - наступает время, когда мы сможем себе позволить возлагать рутину на компьютер и решать свои задачи, не отвлекаясь на ненужные мелочи типа чьих-то старых глюков... ;-)
Пусть даже ценой небольшой потери производительности программ...
ЗЫ. За совет, конечно, спасибо... ;0)
№ 694 12-08-2006 14:54 | |
Ответ на »сообщение 691« (Jack Of Shadows)
___________________________
На вопрос почему в дельфи не реализована оптимизация рекурсии, он ответил буквально следующее:
"Рекурсию ПРАКТИЧЕСКИ НИКТО НЕ использует, и мы не будем тратить свое время на фичу, которая НИКОМУ НЕ НУЖНА.
Как видим, дело в лени Борланда (из-за какой они уже доигрались до продажи средств разработки), а не в том, что оптимизацию рекурсии нельзя сделать в ИЯ. Я уже говорил, чтов некоторых ИЯ-реализациях эта оптимизация выполнена.
The .NET CLR provides a tail call instruction. The following MSIL
method (from [MM01]) will loop forever instead of overflowing the
stack.
.method public static void Bottom() {
.maxstack 8
tail. call void Bottom(); ret
}
– “If the call is from untrusted code to trusted code the frame
cannot be fully discarded for security reasons.” [MM01]
_ Some Java Virtual Machines optimize recursive tails calls. (The
IBM and Microsoft SDK do, but SUN’s JDK does not [SO01]).
Наcчет Java 1.5 – может уже реализовали.
Кстати, не факт, что в BDS2006 еще нет оптимизации рекурсии. Лень проверять. Да дело и не в этом. Дело в другом. Вы снова приводите тут мне рекурсивную функцию и просите вычислить ее от миллиона. Вагиф, я могу установить минимальный размер стека в 16М, а максимальный в 1Г и никакого переполнения стека не будет. Будет просто долгое вычисление. Я опять повторяю, что рекурсивные (да и итеративные тоже) функции надо уметь писать. И опыт с быстрой сортировкой это хорошо показал. Кстати, моя функция быстрой сортировки сортирует не только 50 000, но и 500 000 элементов при стеке по умолчанию.
Неужели при использовании нехвостовой рекурсии в неудачно спроектированной функции в ФЯ не возникает переполнение стека?
Конечно возникает. Чудес не бывает. Стек он и в Африке стек.
Вот и чудно.
№ 693 12-08-2006 14:18 | |
Ответ на »сообщение 667« (hugi)
___________________________
Вот это да! Вдруг выяснилось, что инкапсуляция и полиморфизм -- ЦЕЛИ ООП! А я то, несведущий человек, всю жизнь думал, что инкапсуляция и полиморфизм -- это СРЕДСТВА ООП, а ни как не цели!!! Я, конечно, понимаю, что нынче модно критиковать Буча, но всё же не потрудитесь прочитать (или перечитать?), чтобы впредь не допускать подобных... эээ... будем называть это оговоркой.
Hugi, давайте вместе почитаем Буча :))
Polymorphism exists when the features of inheritance and dynamic binding interact. It is
perhaps the most powerful feature of object-oriented programming languages next to their
support for abstraction, and it is what distinguishes object-oriented programming from more
traditional programming with abstract data types. As we will see in the following chapters,
polymorphism is also a central concept in object-oriented design.
Перевести на русский ? Полиморфизм это центральная концепция ЦЕЛЬ, которая реализуется при помощи СРЕДСТВА ООП.
Читаем дальше:
Basically, polymorphism is a concept in type theory wherein a name (such as the parameter d) may denote instances of many different classes as long as they are related by some common superclass.
Перевести на русский ? Полиморфизм это концепция из теории типов.
Теория типов не говорит ничего об ООП.
Но говорит о полиморфизме и говорит о инкапсуляции.
ООП это механизм (средство реализации) этих концепций.
Все эти private, public, protected - механизм, средство реализации концепции инкапсуляции.
Существуют и другие механизмы реализации этих концепций.
Я вам настоятельно рекомендую ознакомиться с ними.
Это позволит вам обьективно судить об ООП. Судить на своем опыте, а не по откровениям пророков.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|