Введение

Парадигма программирования

Парадигма компьютерного программирования

Процедурное программирование — это парадигма программирования, классифицируемая как императивное программирование, которая заключается в реализации поведения компьютерной программы в виде процедур (также известных как функции, подпрограммы), вызывающих друг друга. В результате программа представляет собой последовательность шагов, формирующих иерархию вызовов составляющих её процедур. Первые основные языки процедурного программирования появились примерно в 1957–1964 годах, включая Fortran, ALGOL, COBOL, PL/I и BASIC. Pascal и C были опубликованы примерно в 1970–1972 годах. Компьютерные процессоры обеспечивают аппаратную поддержку процедурного программирования посредством стекового регистра и инструкций для вызова процедур и возврата из них. Аппаратная поддержка других типов программирования, таких как Lisp или Java, возможна, но ни одна из попыток не увенчалась коммерческим успехом.

Практика развития

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

Модульность и определение сферы применения

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

Обмен

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

Императивная программа

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

Функциональное программирование

Принципы модульности и повторного использования кода в функциональных языках в основном такие же, как и в процедурных, поскольку оба они берут начало в структурированном программировании. Например: процедуры соответствуют функциям. Оба позволяют повторно использовать один и тот же код в различных частях программ и в различных точках их выполнения. По той же причине, вызовы процедур соответствуют применению функций. Функции и их модули разделены друг от друга аналогичным образом, посредством использования аргументов функций, возвращаемых значений и областей видимости переменных. Основное различие между этими стилями заключается в том, что функциональные языки программирования устраняют или, по крайней мере, снижают акцент на императивных элементах процедурного программирования. Поэтому набор возможностей функциональных языков предназначен для поддержки написания программ в максимально возможной степени с точки зрения чистых функций: в то время как процедурные языки моделируют выполнение программы как последовательность императивных команд, которые могут неявно изменять общее состояние, функциональные языки программирования моделируют выполнение как вычисление сложных выражений, которые зависят друг от друга только с точки зрения аргументов и возвращаемых значений. По этой причине функциональные программы могут иметь произвольный порядок выполнения кода, и языки могут предоставлять ограниченный контроль над порядком выполнения различных частей программы; например, аргументы вызова процедуры в Scheme вычисляются в произвольном порядке. Функциональные языки программирования поддерживают (и активно используют) функции первого класса, анонимные функции и замыкания, хотя эти концепции также были включены в процедурные языки, по крайней мере, начиная с Algol 68. Функциональные языки программирования, как правило, полагаются на оптимизацию хвостовых вызовов и функции высшего порядка вместо императивных циклов. Однако многие функциональные языки на самом деле являются нечистыми функциональными и предлагают императивные/процедурные конструкции, позволяющие программисту писать программы в процедурном стиле или в их комбинации. Обычно код ввода-вывода в функциональных языках пишется в процедурном стиле. Существуют также несколько эзотерических функциональных языков (например, Unlambda), которые отказываются от принципов структурированного программирования ради сложности программирования (и, следовательно, сложности освоения). Эти языки являются исключением из общих черт процедурных и функциональных языков.