В чем разница между императивным и функциональным языками программирования?

Каков окончательный ответ относительно различий между императивными языками и функциональными (подмножество декларативных) языками программирования, и можно ли его объяснить на практических примерах? Каковы некоторые из основных или наиболее важных императивных языков? Как насчет функциональных языков?

Я прочитал этот ответ здесь, но на самом деле он еще больше меня запутал... :-( В чем разница между функциональным и императивным языками программирования?


person Marcelo    schedule 22.11.2017    source источник
comment
Это действительно зависит от двух языков, которые вы используете для сравнения. Это Java против Haskell? И что вы подразумеваете под «важным» в предпоследнем предложении первого абзаца?   -  person Frank C.    schedule 22.11.2017
comment
Что насчет связанного ответа смутил вас?   -  person    schedule 22.11.2017
comment
Привет, Эми, я просто почувствовал, что ответ Инго был непоследовательным. Возможно, он действительно ответил, но для кого-то, кто совершенно «невежественен» в программировании, как я :-) Я чувствовал, что нужен более подробный ответ. Его примеры между императивным и декларативным не были связаны, поэтому я чувствовал, что это сбивает с толку. Я оценил ответ Уилла, поскольку он проводит четкое различие между двумя языками, применяя один и тот же пример. Итак, мой ответ вам имел какое-то значение? Я думаю, что теперь это было еще более запутанным... ‹:-O   -  person Marcelo    schedule 23.11.2017
comment
Привет, Фрэнк, я думаю, что под важным я подразумеваю «более актуальный». Например, я совершенно новичок в программировании, но я знаю, что это чрезвычайно важно, и мне очень нужно научиться программировать. Сказав это, должен ли я изучать Java, который все еще используется сегодня, но некоторые считают, что ему суждено исчезнуть, или я должен приложить усилия и энергию для изучения Python? Это моя дилемма...   -  person Marcelo    schedule 23.11.2017
comment
medium.com/@danielt1263/   -  person Daniel T.    schedule 29.12.2017
comment
@Marcelo Знаете ли вы, что Python на самом деле старше Java? Может быть, вам стоит направить свою энергию на один из более современных языков.   -  person Daniel T.    schedule 29.12.2017


Ответы (2)


Давайте воспользуемся этим простым кодом: a = b + c, чтобы изучить разницу.

Когда мы пишем a = b + c на императивном языке, таком как C, мы присваиваем текущее значение b + c переменной a и ничего более. Мы не делаем никаких фундаментальных утверждений о том, что такое a. Скорее, мы просто выполняем шаг в процессе.

Когда мы пишем a = b + c на декларативном языке, таком как Microsoft Excel, мы утверждаем отношение между a, b и c таким образом, что a всегда является суммой двух других. Это не шаг в процессе, это инвариант, гарантия, декларация истины.

Функциональные языки тоже декларативны, но почти случайно. В Haskel, например, a = b + c также утверждает инвариантное отношение, но только потому, что b и c неизменны.

person Daniel T.    schedule 29.12.2017
comment
хороший пример с Excel. действительно, программирование с ограничениями очень близко к декларативной парадигме. Однако функциональное программирование — это не программирование с ограничениями. В Haskell нет ничего декларативного в отношении a = b + c. Он определяет арифметические вычисления, которые должны выполняться только в одном направлении. Это просто SSA, язык устанавливается один раз. - person Will Ness; 29.12.2017

Нет большой разницы.

Я имею в виду, что сейчас компьютер — ваш раб(*) (а вы — очень несчастный король). Либо очень тупой, когда ты сам отдаешь ему приказы о каждой мельчайшей детали. Мол, "помыть первую лошадь в моей конюшне". (Или даже «отнесите ведро воды к первому стойлу в конюшне. Помойте лошадь там. Вымойте первое стойло в конюшне».) Затем «помойте мою вторую лошадь». (Или даже «ведро… второе стойло…. и т. д.»). И т.п.

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

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

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

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

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

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

редактировать: второй подчиненный отказывается понимать некоторые вещи от вас. Вы можете сказать первому, например: "n равно 1. Неси ведро воды в n-ю кабинку. n теперь 2. помыть лошадь в n-ом стойле. n теперь 3. clean до n-го киоска". Что приведет к ошибкам времени выполнения.

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


(*) Извините, что вызвал эту отвратительную парадигму из темной истории человечества; не так далеко в некоторых частях мира даже сегодня.

person Will Ness    schedule 22.11.2017
comment
Привет, Уилл, мне очень понравилась твоя тщательная аналогия! Большое спасибо, что нашли время ответить на мой вопрос. (*) О да, и это ближе, чем можно подумать... ft.com/content/7cb56786-cda1-11e7-b781-794ce08b24dc - person Marcelo; 23.11.2017
comment
Я не очень доволен этим ответом сейчас, на самом деле. вопрос действительно слишком широк. Наверное, мне захотелось разглагольствовать. :) согласитесь? - person Will Ness; 23.11.2017
comment
Да, я, конечно, могу это принять - тем не менее, я просто хочу посмотреть, что еще есть, если кто-то может внести свой вклад с другой точки зрения или даже добавить к тому, что вы уже ответили, и дополнить вашу аналогию. Я подожду пару дней, прежде чем принять окончательный ответ. Но теперь мне действительно любопытно, почему ты так не доволен? - person Marcelo; 23.11.2017
comment
Хорошо, полностью понимаю вашу точку зрения. Я имею в виду, я сделал слишком большой шаг назад здесь. C также можно использовать как функциональный язык, например. существуют существуют различия между функциональным и императивным; Думаю, я был больше сосредоточен на обещании декларативности, доводя ее до крайности. Но я как бы исправил это в последнем абзаце, я думаю.... - person Will Ness; 23.11.2017
comment
Кстати, вы, вероятно, этого не видите, но на данный момент по вашему вопросу проголосовали 4 человека. все, что нужно, это еще один голос, и вопрос будет закрыт (либо как дубликат, либо как слишком широкий). если это произойдет с вами еще несколько раз, вам грозит бан вопросов. Я не знаю подробностей о том, когда вступит в силу запрет, но если вы продолжите публиковать закрытые вопросы, за которые проголосовали против, это может произойти. в мете есть много информации о том, как задать хороший, то есть сфокусированный, конкретный вопрос о коде, с включенным кодом и т. д. К вашему сведению. :) - person Will Ness; 23.11.2017