Введение
Парадигма программирования
the computer programming paradigm
Procedural programming is a programming paradigm, classified as imperative programming, that involves implementing the behavior of a computer program as procedures (a. k. a. functions, subroutines) that call each other. The resulting program is a series of steps that forms a hierarchy of calls to its constituent procedures. The first major procedural programming languages appeared c. 1957–1964, including Fortran, ALGOL, COBOL, PL/I and BASIC. Pascal and C were published c. 1970–1972. Computer processors provide hardware support for procedural programming through a stack register and instructions for calling procedures and returning from them. Hardware support for other types of programming is possible, like Lisp machines or Java processors, but no attempt was commercially successful.
Парадигма компьютерного программирования
the computer programming paradigm
Procedural programming is a programming paradigm, classified as imperative programming, that involves implementing the behavior of a computer program as procedures (a. k. a. functions, subroutines) that call each other. The resulting program is a series of steps that forms a hierarchy of calls to its constituent procedures. The first major procedural programming languages appeared c. 1957–1964, including Fortran, ALGOL, COBOL, PL/I and BASIC. Pascal and C were published c. 1970–1972. Computer processors provide hardware support for procedural programming through a stack register and instructions for calling procedures and returning from them. Hardware support for other types of programming is possible, like Lisp machines or Java processors, but no attempt was commercially successful.
Процедурное программирование — это парадигма программирования, классифицируемая как императивное программирование, которая заключается в реализации поведения компьютерной программы в виде процедур (также известных как функции, подпрограммы), вызывающих друг друга. В результате программа представляет собой последовательность шагов, формирующих иерархию вызовов составляющих её процедур. Первые основные языки процедурного программирования появились примерно в 1957–1964 годах, включая Fortran, ALGOL, COBOL, PL/I и BASIC. Pascal и C были опубликованы примерно в 1970–1972 годах. Компьютерные процессоры обеспечивают аппаратную поддержку процедурного программирования посредством стекового регистра и инструкций для вызова процедур и возврата из них. Аппаратная поддержка других типов программирования, таких как Lisp или Java, возможна, но ни одна из попыток не увенчалась коммерческим успехом.
the computer programming paradigm
Procedural programming is a programming paradigm, classified as imperative programming, that involves implementing the behavior of a computer program as procedures (a. k. a. functions, subroutines) that call each other. The resulting program is a series of steps that forms a hierarchy of calls to its constituent procedures. The first major procedural programming languages appeared c. 1957–1964, including Fortran, ALGOL, COBOL, PL/I and BASIC. Pascal and C were published c. 1970–1972. Computer processors provide hardware support for procedural programming through a stack register and instructions for calling procedures and returning from them. Hardware support for other types of programming is possible, like Lisp machines or Java processors, but no attempt was commercially successful.
Практика развития
Некоторые практики разработки программного обеспечения часто применяются в процедурном программировании для повышения качества и снижения затрат на разработку и поддержку.
Модульность и определение сферы применения
Модульность – это организация процедур программы в отдельные модули, каждый из которых выполняет конкретную и понятную задачу. Уменьшение области видимости переменных и процедур может повысить качество программного обеспечения, снижая когнитивную нагрузку на процедуры и модули. Программа, лишенная модульности или использующая широкую область видимости, как правило, содержит процедуры, использующие множество переменных, которые также используются другими процедурами. В результате код становится сложным для понимания и сопровождения.
Обмен
Поскольку процедура может задавать чётко определённый интерфейс и быть самодостаточной, она способствует повторному использованию кода, особенно посредством программной библиотеки.
Императивная программа
Процедурное программирование классифицируется как императивное, поскольку предполагает непосредственное управление выполнением. Процедурное является подклассом императивного, так как процедурное программирование включает в себя понятия блоков и областей видимости, в то время как императивное описывает более общее понятие, не требующее таких особенностей. Процедурные языки обычно используют зарезервированные слова, определяющие блоки, такие как if, while и for, для реализации управления потоком выполнения, а неструктурированные императивные языки (например, язык ассемблера) используют операторы goto и таблицы переходов для этой цели.
Функциональное программирование
Принципы модульности и повторного использования кода в функциональных языках в основном такие же, как и в процедурных, поскольку оба они берут начало в структурированном программировании. Например: процедуры соответствуют функциям. Оба позволяют повторно использовать один и тот же код в различных частях программ и в различных точках их выполнения. По той же причине, вызовы процедур соответствуют применению функций. Функции и их модули разделены друг от друга аналогичным образом, посредством использования аргументов функций, возвращаемых значений и областей видимости переменных. Основное различие между этими стилями заключается в том, что функциональные языки программирования устраняют или, по крайней мере, снижают акцент на императивных элементах процедурного программирования. Поэтому набор возможностей функциональных языков предназначен для поддержки написания программ в максимально возможной степени с точки зрения чистых функций: в то время как процедурные языки моделируют выполнение программы как последовательность императивных команд, которые могут неявно изменять общее состояние, функциональные языки программирования моделируют выполнение как вычисление сложных выражений, которые зависят друг от друга только с точки зрения аргументов и возвращаемых значений. По этой причине функциональные программы могут иметь произвольный порядок выполнения кода, и языки могут предоставлять ограниченный контроль над порядком выполнения различных частей программы; например, аргументы вызова процедуры в Scheme вычисляются в произвольном порядке. Функциональные языки программирования поддерживают (и активно используют) функции первого класса, анонимные функции и замыкания, хотя эти концепции также были включены в процедурные языки, по крайней мере, начиная с Algol 68. Функциональные языки программирования, как правило, полагаются на оптимизацию хвостовых вызовов и функции высшего порядка вместо императивных циклов. Однако многие функциональные языки на самом деле являются нечистыми функциональными и предлагают императивные/процедурные конструкции, позволяющие программисту писать программы в процедурном стиле или в их комбинации. Обычно код ввода-вывода в функциональных языках пишется в процедурном стиле. Существуют также несколько эзотерических функциональных языков (например, Unlambda), которые отказываются от принципов структурированного программирования ради сложности программирования (и, следовательно, сложности освоения). Эти языки являются исключением из общих черт процедурных и функциональных языков.
Procedures correspond to functions. Both allow the reuse of the same code in various parts of the programs, and at various points of its execution. By the same token, procedure calls correspond to function application. Functions and their modularly separated from each other in the same manner, by the use of function arguments, return values and variable scopes. The main difference between the styles is that functional programming languages remove or at least deemphasize the imperative elements of procedural programming. The feature set of functional languages is therefore designed to support writing programs as much as possible in terms of pure functions:
Whereas procedural languages model execution of the program as a sequence of imperative commands that may implicitly alter shared state, functional programming languages model execution as the evaluation of complex expressions that only depend on each other in terms of arguments and return values. For this reason, functional programs can have a free order of code execution, and the languages may offer little control over the order in which various parts of the program are executed; for example, the arguments to a procedure invocation in Scheme are evaluated in an arbitrary order. Functional programming languages support (and heavily use) first class functions, anonymous functions and closures, although these concepts have also been included in procedural languages at least since Algol 68. Functional programming languages tend to rely on tail call optimization and higher order functions instead of imperative looping constructs. Many functional languages, however, are in fact impurely functional and offer imperative/procedural constructs that allow the programmer to write programs in procedural style, or in a combination of both styles. It is common for input/output code in functional languages to be written in a procedural style. There do exist a few esoteric functional languages (like Unlambda) that eschew structured programming precepts for the sake of being difficult to program in (and therefore challenging). These languages are the exception to the common ground between procedural and functional languages.