Процедурное программирование — это парадигма программирования , классифицируемая как императивное программирование , [1] , которая включает реализацию поведения компьютерной программы в виде процедур (они же функции, подпрограммы), которые вызывают друг друга. Результирующая программа представляет собой ряд шагов, которые формируют иерархию вызовов ее составляющих процедур.
Первые основные языки процедурного программирования появились около 1957–1964 гг., включая Fortran , ALGOL , COBOL , PL/I и BASIC . [2] Pascal и C были опубликованы около 1970–1972 гг.
Компьютерные процессоры обеспечивают аппаратную поддержку процедурного программирования через стековый регистр и инструкции для вызова процедур и возврата из них. Аппаратная поддержка других типов программирования возможна, например, машин Lisp или процессоров Java , но ни одна попытка не была коммерчески успешной. [ противоречиво ]
Определенные методы разработки программного обеспечения часто применяются совместно с процедурным программированием с целью повышения качества и снижения затрат на разработку и обслуживание.
Модульность заключается в организации процедур программы в отдельные модули, каждый из которых имеет конкретную и понятную цель.
Минимизация объема переменных и процедур может повысить качество программного обеспечения за счет снижения когнитивной нагрузки процедур и модулей.
Программа, лишенная модульности или широкой области действия, как правило, имеет процедуры, которые потребляют много переменных , которые потребляют и другие процедуры. Полученный код относительно сложен для понимания и поддержки.
Поскольку процедура может определять четко определенный интерфейс и быть самодостаточной, она поддерживает повторное использование кода — в частности, через программную библиотеку .
Процедурное программирование классифицируется как императивное программирование , поскольку оно подразумевает прямое управление исполнением.
Процедурный — это подкласс императивного, поскольку процедурный включает концепции блока и области действия , тогда как императивный описывает более общую концепцию, которая не требует таких функций. Процедурные языки обычно используют зарезервированные слова, которые определяют блоки, такие как if
, while
, и for
, для реализации потока управления , тогда как неструктурированные императивные языки (т. е. язык ассемблера ) используют для этой цели таблицы goto и branch.
Также классифицируемое как императивное, объектно-ориентированное программирование (ООП) подразумевает разделение реализации программы на объекты, которые раскрывают поведение (методы) и данные (члены) через четко определенный интерфейс. Напротив, процедурное программирование заключается в разделении реализации программы на переменные , структуры данных и подпрограммы . Важное отличие состоит в том, что в то время как процедурное программирование подразумевает процедуры для работы со структурами данных, ООП объединяет их вместе. Объект — это структура данных и поведение, связанное с этой структурой данных. [3]
Некоторые языки ООП поддерживают концепцию класса, которая позволяет создавать объект на основе определения.
Номенклатура у них разная, хотя семантика у них схожая:
Принципы модульности и повторного использования кода в функциональных языках в основе своей такие же, как и в процедурных языках, поскольку оба они вытекают из структурного программирования . Например:
Главное различие между стилями заключается в том, что функциональные языки программирования удаляют или, по крайней мере, ослабляют акцент на императивных элементах процедурного программирования. Поэтому набор функций функциональных языков разработан для поддержки написания программ в максимально возможной степени с точки зрения чистых функций :
Однако многие функциональные языки на самом деле не являются чисто функциональными и предлагают императивные/процедурные конструкции, которые позволяют программисту писать программы в процедурном стиле или в комбинации обоих стилей. Код ввода/вывода в функциональных языках обычно пишется в процедурном стиле.
Существуют несколько эзотерических функциональных языков (вроде Unlambda ), которые избегают предписаний структурного программирования ради того, чтобы на них было трудно программировать (и, следовательно, сложно). Эти языки являются исключением из общей основы между процедурными и функциональными языками.
В логическом программировании программа представляет собой набор предпосылок, а вычисления выполняются путем попытки доказать теоремы-кандидаты. С этой точки зрения логические программы являются декларативными , фокусируясь на сути проблемы, а не на том, как ее решить.
Однако метод обратного рассуждения , реализованный с помощью SLD Resolution , используемый для решения задач в языках логического программирования, таких как Prolog , рассматривает программы как процедуры сокращения цели. Таким образом, предложения вида:
имеют двойную интерпретацию, как процедуры
и как логические следствия:
Опытный программист-логист использует процедурную интерпретацию для написания эффективных и действенных программ, а декларативную интерпретацию — для обеспечения корректности программ.