В чем разница между императивным, процедурным и структурным программированием?

85

Исследуя (книги, Википедию, похожие вопросы по SE и т. Д.), Я понял, что императивное программирование является одной из основных парадигм программирования, где вы описываете серию команд (или операторов), которые должен выполнять компьютер (так что вы довольно Многое прикажи ему предпринять конкретные действия, отсюда и название «императив»). Все идет нормально.

С другой стороны, процедурное программирование - это особый тип (или подмножество) императивного программирования, где вы используете процедуры (т. Е. Функции) для описания команд, которые должен выполнять компьютер.

Первый вопрос : существует ли императивный язык программирования, который не является процедурным? Другими словами, вы можете иметь императивное программирование без процедур?

Обновление : на этот первый вопрос, похоже, дан ответ. Язык МОЖЕТ быть императивным, не будучи процедурным или структурированным. Пример - чистый ассемблер.

Затем у вас также есть Структурное программирование, которое, кажется, является другим типом (или подмножеством) императивного программирования, которое появилось, чтобы убрать зависимость от оператора GOTO.

Второй вопрос : в чем разница между процедурным и структурным программированием? Можете ли вы иметь одно без другого, и наоборот? Можем ли мы сказать, что процедурное программирование является подмножеством структурного программирования, как на рисунке?

введите описание изображения здесь

Даниэль Скокко
источник

Ответы:

52

Многие термины могут быть повторно использованы (часто неправильно) в языках программирования, особенно те, которые не являются объектно-ориентированными.

Вот несколько небольших описаний терминов.

  1. Императивное программирование. В старые добрые времена, когда программирование было в основном на ассемблере, в коде было бы множество GOTO. Даже языки более высокого уровня, такие как FORTRAN и BASIC, начали использовать одни и те же примитивы. В этой парадигме программирования вся программа представляет собой единый алгоритм или полную функциональность, написанную линейно - шаг за шагом. Это императивный стиль . Поймите, что действительно можно написать совершенно плохую императивную работу даже на современном языке Си, но довольно просто организовать код на языках более высокого уровня.

  2. Структурное и модульное программирование. Чаще всего мы должны использовать термин взаимозаменяемо, но с небольшими различиями. Когда языки более высокого уровня стали становиться все богаче, стало понятно, что все единицы работы должны быть разбиты на более мелкие части - то есть, когда появились функции, и программирование стало иерархией функций, и многие на более низком уровне можно было бы использовать повторно.

    • Структурированное программирование - это любое программирование, когда функциональные возможности делятся на блоки, подобные for loop, while loop, if... thenблочной структуре и т. Д.
    • Кроме того, здесь фрагмент кода (функция) может быть использован повторно.
    • В модульном программировании можно создать физическую форму пакета - то есть кусок кода, который может быть отправлен; которые довольно общего назначения и многоразового использования. Это называется модулями элементов, скомпилированных вместе.
    • Поэтому вряд ли можно увидеть модульные программы, которые не структурированы и наоборот; техническое определение несколько отличается, но в основном структурированный код может быть выполнен модульным и другим способом.
  3. Затем появилось «объектно-ориентированное программирование», которое хорошо определено в литературе. Поймите, что объектно-ориентированное программирование является формой структурированного программирования по определению. Новое имя для всего того кода, основанного на функциях, который является структурированным кодом, но НЕ объектно-ориентированным, часто называют процедурным программированием.

    • Таким образом, в основном структурированный код, где функции (или процедуры) доминируют над данными, называется процедурным, тогда как представление на основе классов и объектов называется объектно-ориентированным. Оба по определению также являются модульными.

Многие люди думают - все структурное программирование (возможно, пропускающее Object-based) как императивное программирование; Я предполагаю, что это только из-за отсутствия четкого определения императивного программирования - но это неправильно. Вы занимаетесь структурированным программированием, когда не выполняете никаких императивов! Но я все еще могу написать много функций, а также много операторов goto внутри C или FORTRAN программы для смешивания.

Чтобы быть конкретными на ваши вопросы:

Первый вопрос : Чистый ассемблер является императивным языком, который НЕ является структурированным или процедурным. (Наличие поэтапного потока интерпретирующего управления не означает процедурный - но разделение функциональности на функции делает язык процедурным).

  • исправление * Большинство современных форм сборки поддерживают использование функций. Фактически, все, что возможно в коде высокого уровня, ДОЛЖНО существовать на низком уровне для работы. Хотя гораздо лучше создавать процедурный код, можно написать как процедурный, так и императивный код. В отличие от последнего, он более удобен в обслуживании и легче для понимания (избегая ужасного кода спагетти). Я думаю, что есть сценарии shell / bash, которые лучше подходят для того, чтобы быть чисто императивными, но даже тогда, когда у большинства есть функции, разработчики определенно понимают, насколько они ценны.

Второй вопрос : процедурное программирование - это ФОРМА структурированного программирования.


БОНУС

Дипан Мехта
источник
1
Итак, вы бы сказали, что процедурное программирование обязательно является также структурированным программированием, тогда как обратное неверно (хотя часто и так)?
Даниэль Скокко
2
Да, я бы так сказал.
Дипан Мехта
1
В своем ответе я определил императивное или структурированное - где императивное программирование написано просто с пошаговым выполнением и не структурировано. Однако, согласно некоторому определению, существует другая классификация; это классификация между декларативным (или функциональным языком) и императивом. Декларативные языки позволяют выполнять вычисления, не описывая поток управления, где в качестве обязательного указывается явный поток управления (шаг за шагом). Исходя из этой классификации, императивное программирование для некоторых может быть суперструктурированным набором. Некоторые не совсем следуют этому определению.
Дипан Мехта
У меня другое мнение относительно определения структурного программирования. Структурное программирование и модульное программирование - это не одно и то же. Пожалуйста, смотрите определение в конце этой заметки. По той же ссылке можно предположить, что Assembler ** - это ** язык структурированного программирования! Ссылка для определения STP: en.wikipedia.org/wiki/Structured_programming - Эммад Карим
NoChance
Является ли «физическая форма пакета» ... файлом или каталогом / архивом файлов? (Или это не так, а что-то еще.)
n611x007
4

Первый вопрос: да, многие чисто объектно-ориентированные языки соответствуют требованиям. Хотя у них есть методы, которые очень близки к функциям, они рассматривают эти методы с точки зрения сообщений и не придают им достаточного веса, чтобы назвать язык процедурным.

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

Процедурное программирование описывает глобальное упорядочение программы. Процедурные программы - те, которые наиболее эффективно поняты, глядя на их графы вызовов. Структурное программирование является локальным свойством, оно применяется к использованию if и while, а не к goto.

Таким образом, эти два свойства не связаны, вы можете иметь одно без другого.

thiton
источник
1
Единственным лакмусовым тестом для того, чтобы быть процедурным, является то, что язык содержит процедуры (функции или методы ) и является императивным, т.е. без декларативных. Это означает, что большинство ОО-языков, которые не являются чисто функциональными, будут процедурными.
dietbuddha
1
@dietbuddha: По этому определению Haskell будет квалифицироваться как процедурный язык благодаря использованию монад. Я бы потребовал определенной опоры на процедуры, чтобы сделать язык процедурным.
thiton
Я не очень хорошо знаю Haskell, но я думал, что Haskell - чисто функциональный язык, потому что он оборачивает побочные эффекты в Monads.
dietbuddha
2
Ну, некоторые люди утверждают , Haskell не является чисто функциональным , поскольку она позволяет любому взаимодействию с внешним миром (или потому , что в GHC расширение , unsafePerformIOпозволяет Wreaking Havok). Другие шутят, что Haskell - их любимый императивный язык программирования. Но факт в том, что очень большая часть кода на Haskell живет четко отделенной IO, не использует нестандартных лазеек для проникновения побочных эффектов и является чисто функциональной.
1
@ С этим я не согласен. Монады тоже являются функциональными конструкциями; они выглядят обязательными только из-за синтаксического сахара в Haskell («do notation»). Когда вы desugar монады, их функциональная природа становится очевидной. Напротив, ОО-языки действительно необходимы: в своей основе они основаны на последовательном выполнении операторов.
Андрес Ф.
2

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

Эти языки называются императивными языками.

На компьютере von Neumaan данные и программы хранятся в одной и той же памяти. Процессор, который выполняет инструкции, отделен от памяти. Поэтому инструкции и данные должны передаваться из памяти в CPU. Результаты операций в ЦП должны быть перенесены обратно в память. Почти все цифровые компьютеры, построенные с 1940-х годов, основаны на архитектуре фон Неймана.

anandmon
источник
1
+1 не уверен, что это имеет отношение к вопросу, но это интересный ответ.
Чак Конвей
2
Какая? Где часть об Императиве против Процессуального, и т. Д.?
bbqchickenrobot
Я думаю, суть в том, что спор о структуре программы (императивный, декларативный, процедурный, объектно-ориентированный, функциональный и т. Д.) - это языковые конструкции, и все программы в конечном итоге обрабатываются на машинах архитектуры фон Неймана. Это похоже на то, что все языки Turing Complete эквивалентны.
Чак Коттрилл
2

Боюсь, что ни один из ответов, приведенных до сих пор, не отражает ядро ​​концепций очень хорошо.

Императивный, процедурный и структурированный не являются взаимоисключающими свойствами, они просто сосредоточены на одном аспекте логики моделирования.

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

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

Структурное программирование - это следующий шаг от способности перейти к другой инструкции. В конечном итоге все сводится к переходам, но если у вас могут быть условные переходы, вы можете создавать базовые операторы потока управления, такие как if-then, for, while, repeat-till и switch. Их применение называется структурированным программированием.

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

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

Мартин Маат
источник