LINUX.ORG.RU
ФорумTalks

ФП не нужно

 ,


2

7

Н. Вирт дело говорит

Функциональные языки происходят от языка Lisp [5]. Они подверглись большому числу расширений и изменений и используются для реализации как небольших, так и крупных программных систем. Я всегда сохранял скептическую позицию по отношению к этому направлению. Что характеризует функциональные языки? Всегда оказывалось, что они характеризуются своей формой, что вся программа состоит из вычислений функций - вложенных, рекурсивных, параметрических и т.д. Отсюда происходит термин функциональный. Однако ключевая идея состоит в том, что функции по своему существу не имеют состояний. Отсюда следует отсутствие переменных и присваиваний. Вместо переменных используются неизменяемые параметры функций - переменные в математическом смысле. Вследствие этого, только что вычисленные значения невозможно присвоить той же переменной, затирая ее старое значение. Это объясняет, почему повторение должно выражаться через рекурсию. Структуру данных, в лучшем случае, можно расширить, но невозможно изменить ее существующую часть. Это приводит к очень высокому уровню рециркуляции памяти - необходимым компонентом является «сборщик мусора» (garbage collector). Реализация без автоматической сборки мусора является немыслимой.

Постулирование модели вычислений без состояний поверх машины, наиболее значительной характеристикой которой является состояние, кажется, по крайней мере, странной идеей. Между моделью и машиной существует широкая пропасть, возведение моста через которую обходится дорого. Это невозможно исправить с помощью какой-либо аппаратной поддержки: идея остается плохой и на практике.

Сторонники функциональных языков также со временем поняли это. С помощью разнообразных хитрых приемов они ввели состояние и переменные. Тем самым, чисто функциональный облик языков был дискредитирован и принесен в жертву. Старая терминология стала обманчивой.

Если оглянуться на прошлое функциональных языков, то оказывается, что их действительно важным вкладом было, конечно, не отсутствие состояний, а требование понятных вложенных структур и использование строго локальных объектов. Эта дисциплина может практиковаться и с использованием традиционных, императивных языков, которые со временем позаимствовали идеи вложенных структур, функций и рекурсии.

Однако функциональные языки подразумевают гораздо большее, чем отказ от операторов goto. Они также подразумевают ограничение на локальные переменные, за исключением, возможно, нескольких глобальных переменных состояния. В них, возможно, считается нежелательной вложенность процедур. По-видимому, были правы разработчики компьютера B5000, ограничая доступ к строго локальным и глобальным переменным.

Много лет спустя некоторые разработчики все чаще стали утверждать, что функциональные языки являются наилучшим средством для введения параллелизма - хотя было бы более уместно сказать «для облегчения работы компиляторов по определению возможностей распараллеливания программ». Вообще-то относительно несложно определить, какие части выражения могут вычисляться параллельно. Более важно то, что параллельно могут вычисляться параметры вызываемой функции, если запрещены побочные эффекты - которые не могут возникать в истинно функциональном языке. В то время, как это обстоятельство может быть истинным и, возможно, минимальным преимуществом функциональных языков, объектно-ориентированный подход предлагает более эффективный способ хорошего использования параллелизма, когда поведение каждого объекта представляется в виде отдельного процесса.

★★★★

Вообще-то относительно несложно определить, какие части выражения могут вычисляться параллельно.

при текущем способе кодирования на C-like языках компилятор скажет тебе открыто и смело прямо в лицо: ни одна часть твоей программы не может быть выполнена параллельно!

Постулирование модели вычислений без состояний поверх машины, наиболее значительной характеристикой которой является состояние

всё, закончилась лафа, больше не работает закон Мура, теперь не имеет смысла состояние отдельного компьютера

stevejobs ★★★★☆ ()
Ответ на: комментарий от tailgunner

статья то старая

Оригинал: Good Ideas, through the Looking Glass by Niklaus Wirth, Computer, V. 39, No 1, January 2006

TERRANZ ★★★★ ()

Однако функциональные языки подразумевают гораздо большее, чем отказ от операторов goto. Они также подразумевают ограничение на локальные переменные, за исключением, возможно, нескольких глобальных переменных состояния. В них, возможно, считается нежелательной вложенность процедур.

В них, возможно, считается нежелательной вложенность процедур.

Старик упоролся.

tailgunner ★★★★★ ()

Oberon?

Эй, Вирт, как там Oberon поживает? Состоящий из правильных идей чуть более чем полностью.

Camel ★★★★★ ()

Я в какой-то растерянности. Он и на Пролог наехал.

Zubok ★★★★★ ()

Тут упускается один важный нюанс: ничто не мешает глючить и тормозить программам написанным на «нормальных языках программирования». Да foreign function interface для горячих участков кода никто не отменял.

В то же время растёт востребованность по надёжности, снижению трудоёмкости поддерживания программ. А если вспомнить что лишь небольшой части программ нужна максимальная скорость то доводы Вирта становятся вообще выглядят немного оторванными от жизни.

«для облегчения работы компиляторов по определению возможностей распараллеливания программ»

Именно. Теоретически компиляторы могут быть сколь угодно умными. Но почему-то мы не видим это на практике (наверно потому что до ИИ ещё далеко). Так что стоит признать что это плохо работает.

true_admin ★★★★★ ()

объектно-ориентированный подход предлагает более эффективный способ хорошего использования параллелизма, когда поведение каждого объекта представляется в виде отдельного процесса

Нет.

ranka-lee ()
Ответ на: комментарий от Zubok

Я в какой-то растерянности.

Я тоже. Ты что серьезно удивляешься тому, что Вирт наезжает на языки, которые создал не он?

Begemoth ★★★★★ ()

начиная с первого предложения идёт 4.2, дальше точно стоит читать?

qnikst ★★★★★ ()
Ответ на: комментарий от ranka-lee

объектно-ориентированный подход предлагает более эффективный способ хорошего использования параллелизма, когда поведение каждого объекта представляется в виде отдельного процесса

Нет.

ну почему сразу нет. man erlang, в нём как раз истинное ООП

Debasher ★★★★★ ()
Ответ на: комментарий от qnikst

начиная с первого предложения идёт 4.2, дальше точно стоит читать?

Если считаешь первое предложение сознательной ложью - конечно же, нет.

tailgunner ★★★★★ ()

Всё правильно сказал, и вообще годный вбросец.

CARS ★★★★ ()

а тем временем индустрия скатывалась в js...

der_looser ★★ ()
Ответ на: Oberon? от Camel

неплохо. гораздо лучше, чем хаскель, например. а что?

next_time ★★★★★ ()
Ответ на: комментарий от Zubok

не страшно: несколько метров земли над Прологом спасут его тело

next_time ★★★★★ ()

С помощью разнообразных хитрых приемов они ввели состояние и переменные.

Да какие в ж... «хитрые приемы»? Напихали кучу квирков и костылей в каждый языковой рантайм, написанный на C, ЧСХ. А на основе этих квирков создали еще большую кучу костылей и квирков. Затем, все спрятали за красивенькими монадическими интерфейсами.

Достоинство MLов и их идеологических последователей не в том, что они поддерживают ФП, его и Питон поддерживает, а в том что они поддерживают аппликативный стиль программирования, позволяющий собирать программу из простых, легко верифицируемых кусков.

Самый простой и избитый пример — комбинаторные парсеры. Набор операций (терминалов), зачастую в виде одной единственной, и набор комбинаторов (нетерминалов) который укладывается в интерфейсы Functor, Applicative, Alternative, Monad, Monoid и MonadPlus. Каждая по-отдельности операция и комбинатор убоги до неприличия. Но вот вместе...

Чисто в теории, ничто не мешает построить то же самое в любом другом языке. Но результат будет плачевным, потому что далеко не все языки поддерживают аппликативный стиль.

Macil ★★★★★ ()
Ответ на: комментарий от next_time

не страшно: несколько метров земли над Прологом спасут его тело

Я полагаю, что Пролог еще нам некрологи будет зачитывать.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

тут необходимы пруфы в виде перечня свежего софта, написанного на прологе

next_time ★★★★★ ()
Ответ на: комментарий от next_time

тут необходимы пруфы в виде перечня свежего софта, написанного на прологе

Уже сто раз тут просили. Гугл в помощь. Софт на Прологе пишется, но обычно он используется внутри предприятий (наш любимый энтерпрайз). Но инфа о подобных системах ищется. Про университеты и их разработки я даже не упоминаю.

Даже тут на ЛОР несколько раз пролетала контора питерская http://www.solvo.ru/, которая складскими системами занимается. Вот их объявление, например:

Программист на Прологе под Линукс (С ОБУЧЕНИЕМ) (Санкт-Петербург)

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от next_time

И куча задач хорошо формулируется в виде клауз Хорна, поэтому их быстрее всего накидать на Прологе, чем писать собственную систему логического вывода. Я писал на Прологе 15 лет назад (SWI-Prolog), но тематика была специфическая - ИИ.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

И куча задач хорошо формулируется в виде клауз Хорна, поэтому их быстрее всего накидать на Прологе, чем писать собственную систему логического вывода.

возможно. каждому инструменту — своё применение. но факт в том, что такой инструмент, как Пролог — более не используется

next_time ★★★★★ ()
Ответ на: комментарий от next_time

но факт в том, что такой инструмент, как Пролог — более не используется

Это ложь.

Zubok ★★★★★ ()
Ответ на: комментарий от next_time

опровергните. где используется пролог?

Вот я выше написал. Трудно набрать в гугле? На английском набирай и обнаружишь сообщения людей, которые рассказывают про свои компании, которые поставляют решения на прологе. Ну вот сходу:

http://stackoverflow.com/questions/130097/real-world-prolog-usage/261360#261360

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

up vote 57 down vote accepted

The first Erlang interpreter was developed in Prolog by Joe Armstrong. Prolog was also used by NASA to build a software named «clarissa», for the ISS. Clarissa is a voice user interface for browsing space station procedures. There's also PrologBeans, which you can use to build even a web app (integrated with other languages). As for me, I have only used Prolog for AI projects in college...

Не живее перфокарт, ясно.

next_time ★★★★★ ()
Ответ на: комментарий от next_time

И важно еще понимать, что использовать Пролог как язык для всего - это не очень хорошая идея. Пролог разумно использовать как машину вывода, которая работает behind the scene. Именно так и я использовал SWI-Prolog. Снаружи обычная программа на Си с формочками, она формирует динамически правила и сует их в базу знаний, а потом динамически формирует запросы в машину вывода Пролога, получает ответ и отображает.

Zubok ★★★★★ ()
Ответ на: комментарий от next_time

Не живее перфокарт, ясно.

В общем, я понимаю, что бесполезно предъявлять доказательства далее. Проехали. Ты выиграл. Пролог умер.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

да, но проблема в том, что пролог, по большому счёту, легко реализуется внутри плюсов, например. по факту, это язык одного паттерна. разумеется, оно имеет свои области применения, но поскольку паттерн этот содержит в себе достаточно сложную концепцию для быстрого понимания ООП и ФП программерами, а области применения его достаточно узки, его и юзают достаточно редко

next_time ★★★★★ ()
Ответ на: комментарий от Zubok

то, что в каких-то организациях юзают Пролог, я не сомневаюсь, но в каких-то организация юзают и перфокарты до сих пор. вопрос в том, насколько масштабны проекты, написанные на конкретном языке. в современном мире масштабных проектов на прологе, видимо, нет

next_time ★★★★★ ()
Ответ на: комментарий от next_time

легко реализуется внутри плюсов,

Как? Легко реализуется? Попробуй реализуй легко мне машину вывода, аналогичную тому же SWI-Prolog. Люди на это годы (даже уже десятилетия) тратят, чтобы написать нормальную систему и положить нам в рот готовенькую. Легко, понимаешь. Знаю я ваши легко. На годы увязните реализовывать, а потом бросите, так и не осилив.

А я просто возьму, подсоединюсь к /usr/lib/libswipl.so из C++ и быстро реализую задуманное, пока вы там скрипеть мозгами будете.

Zubok ★★★★★ ()

Спасибо за выступление, очень интересно. Пойду программировать в ФП стиле дальше

vertexua ★★★★☆ ()
Ответ на: комментарий от next_time

пролог, по большому счёту, легко реализуется внутри плюсов, например

Бггг. Ты видел объёмы книг по constraint processing?

yoghurt ★★★★★ ()
Ответ на: комментарий от next_time

такой инструмент, как Пролог — более не используется

Это не так. Дело в том, что подобного рода информацию как правило не выносят на всеобщее обозрение. Тем не менее, пролог довольно активно используется в своей родной области применения — логическое программирование, экспертные системы и т.п. Вот относительно свежий пример:

We required a language in which we could conveniently express pattern matching rules over the parse trees and other annotations (such as named entity recognition results), and a technology that could execute these rules very efficiently. We found that Prolog was the ideal choice for the language due to its simplicity and expressiveness.

ymn ★★★★★ ()
Ответ на: комментарий от next_time

Лучше чем Haskell?

неплохо. гораздо лучше, чем хаскель, например. а что?

Можно какое-нибудь подтверждение этому утверждению?

Camel ★★★★★ ()
Ответ на: Лучше чем Haskell? от Camel

увы, пруфы посеял :( а ведь были (где-то в Швейцарском НИИ во всю юзается). по сравнению с «нигде» хаскеля — это что-то

next_time ★★★★★ ()
Ответ на: комментарий от next_time

Вы делаете мне смешно

где-то в Швейцарском НИИ во всю юзается

Курсовые от студентов Вирта?

Camel ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.