Исследуя (книги, Википедию, похожие вопросы по SE и т. Д.), Я понял, что императивное программирование является одной из основных парадигм программирования, где вы описываете серию команд (или операторов), которые должен выполнять компьютер (так что вы довольно Многое прикажи ему предпринять конкретные действия, отсюда и название «императив»). Все идет нормально.
С другой стороны, процедурное программирование - это особый тип (или подмножество) императивного программирования, где вы используете процедуры (т. Е. Функции) для описания команд, которые должен выполнять компьютер.
Первый вопрос : существует ли императивный язык программирования, который не является процедурным? Другими словами, вы можете иметь императивное программирование без процедур?
Обновление : на этот первый вопрос, похоже, дан ответ. Язык МОЖЕТ быть императивным, не будучи процедурным или структурированным. Пример - чистый ассемблер.
Затем у вас также есть Структурное программирование, которое, кажется, является другим типом (или подмножеством) императивного программирования, которое появилось, чтобы убрать зависимость от оператора GOTO.
Второй вопрос : в чем разница между процедурным и структурным программированием? Можете ли вы иметь одно без другого, и наоборот? Можем ли мы сказать, что процедурное программирование является подмножеством структурного программирования, как на рисунке?
Первый вопрос: да, многие чисто объектно-ориентированные языки соответствуют требованиям. Хотя у них есть методы, которые очень близки к функциям, они рассматривают эти методы с точки зрения сообщений и не придают им достаточного веса, чтобы назвать язык процедурным.
Второй вопрос: разница часто в другой сфере. Вы можете иметь функцию с операторами goto повсеместно, которая будет в процедурном стиле, но не в структурированном программировании. С другой стороны, большинство ОО-языков поддерживают и поощряют структурированное программирование, но не процедурное программирование.
Процедурное программирование описывает глобальное упорядочение программы. Процедурные программы - те, которые наиболее эффективно поняты, глядя на их графы вызовов. Структурное программирование является локальным свойством, оно применяется к использованию if и while, а не к goto.
Таким образом, эти два свойства не связаны, вы можете иметь одно без другого.
источник
unsafePerformIO
позволяет Wreaking Havok). Другие шутят, что Haskell - их любимый императивный язык программирования. Но факт в том, что очень большая часть кода на Haskell живет четко отделеннойIO
, не использует нестандартных лазеек для проникновения побочных эффектов и является чисто функциональной.Большинство популярных языков за последние 50 лет были разработаны вокруг распространенной компьютерной архитектуры, называемой архитектурой фон Неймана , по имени одного из ее создателей, Джона фон Неймана.
Эти языки называются императивными языками.
На компьютере von Neumaan данные и программы хранятся в одной и той же памяти. Процессор, который выполняет инструкции, отделен от памяти. Поэтому инструкции и данные должны передаваться из памяти в CPU. Результаты операций в ЦП должны быть перенесены обратно в память. Почти все цифровые компьютеры, построенные с 1940-х годов, основаны на архитектуре фон Неймана.
источник
Боюсь, что ни один из ответов, приведенных до сих пор, не отражает ядро концепций очень хорошо.
Императивный, процедурный и структурированный не являются взаимоисключающими свойствами, они просто сосредоточены на одном аспекте логики моделирования.
Императив является противоположностью декларативного императива, в основном означает, что вы говорите компьютеру, что делать , выполняя ряд инструкций, которые вы предоставляете. Декларативная программа, с другой стороны, говорит, чего достичь . Другими словами, определите шаги вместо определения результата.
Процедурное программирование - это способность процессора (аппаратного обеспечения или интерпретатора) объединять инструкции в соединения, переходить к такому соединению и возвращаться к точке после перехода после выполнения соединения. Это может показаться тривиальным, и по сегодняшним меркам это так, но вам нужна некоторая базовая поддержка в машине, прежде чем вы сможете это сделать: способность прыгать, какой-то стек, чтобы выдвинуть адрес, на который можно вытолкнуть и перейти к нему позже, и указатель стека. Микропроцессоры вскоре предложили эту функцию, но вы можете представить себе примитивный процессор, который способен только последовательно выполнять команды, подаваемые на него, например, процессор перфоленты или перфокарты.
Структурное программирование - это следующий шаг от способности перейти к другой инструкции. В конечном итоге все сводится к переходам, но если у вас могут быть условные переходы, вы можете создавать базовые операторы потока управления, такие как if-then, for, while, repeat-till и switch. Их применение называется структурированным программированием.
В любой современной среде программирования вы будете иметь все вышеперечисленное и принимать их как должное, чтобы мы больше не говорили о них как таковых. Дифференцирующие свойства между языками уже давно перешли к парадигмам более высокого уровня, таким как объектно-ориентированное и функциональное программирование.
Декларативное программирование все еще не является обычным явлением, в основном потому, что оно всегда будет зависеть от предметной области, по крайней мере, до некоторой степени. Вы не можете иметь декларативный язык общего назначения. Вот почему мы все еще застряли с так называемыми языками третьего поколения, где декларативное программирование или «моделирование» считалось бы четвертым поколением.
источник