<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D0%BE%D0%B4%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0</id>
	<title>Подпрограмма - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D0%BE%D0%B4%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0&amp;action=history"/>
	<updated>2026-07-16T23:39:43Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0&amp;diff=21406&amp;oldid=prev</id>
		<title>2A02:8109:AB9A:7500:B060:BA1D:1DD7:4AAF: Дополнил синонимами, т.к. термин &quot;подпрограмма&quot; редко или практически не используется в современном программировании. Обычно используется &quot;функция&quot;, &quot;процедура&quot; или &quot;метод&quot;. Последние имеют небольшую разницу, но в данном случае являются синонимами. Синонимы можно так же найти в английской статье. Кроме того, поправил незаконченное/несогласованное предложение</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0&amp;diff=21406&amp;oldid=prev"/>
		<updated>2024-11-21T12:20:05Z</updated>

		<summary type="html">&lt;p&gt;Дополнил синонимами, т.к. термин &amp;quot;подпрограмма&amp;quot; редко или практически не используется в современном программировании. Обычно используется &amp;quot;функция&amp;quot;, &amp;quot;процедура&amp;quot; или &amp;quot;метод&amp;quot;. Последние имеют небольшую разницу, но в данном случае являются синонимами. Синонимы можно так же найти в английской статье. Кроме того, поправил незаконченное/несогласованное предложение&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Подпрограмма&amp;#039;&amp;#039;&amp;#039; ({{lang-en|subroutine}}) — поименованная или иным образом идентифицированная часть [[компьютерная программа|компьютерной программы]], содержащая описание определённого набора действий. Подпрограмма может быть многократно &amp;#039;&amp;#039;вызвана&amp;#039;&amp;#039; из разных частей программы. В языках программирования для оформления и использования подпрограмм существуют специальные синтаксические средства — процедуры, функции и методы являются вариациями подпрограмм.&lt;br /&gt;
&lt;br /&gt;
== Назначение подпрограмм ==&lt;br /&gt;
Подпрограммы изначально появились как средство оптимизации программ по объёму занимаемой памяти — они позволили не повторять в программе идентичные блоки кода, а описывать их однократно и вызывать по мере необходимости. В современной разработке важной функцией подпрограмм является организация кода, т.к. подпрограммы позволяют абстрагировать комплексные операции в виде одной команды.&lt;br /&gt;
&lt;br /&gt;
== Преимущества ==&lt;br /&gt;
Преимущества разбиения программы на подпрограммы включают:&lt;br /&gt;
* Декомпозиция комплексной программной задачи на простые шаги: это один из двух основных инструментов структурированного программирования и структур данных&lt;br /&gt;
* Уменьшение дублированного кода&lt;br /&gt;
* Возможность повторного использования кода в других программах&lt;br /&gt;
* Разделение крупной программной задачи между различными программистами, или различными стадиями проекта&lt;br /&gt;
* Сокрытие деталей реализации от пользователей подпрограммы&lt;br /&gt;
* Улучшение прослеживания (большинство языков предоставляют способ получить след вызова который включает в себя имена задействованных подпрограмм и возможно даже больше такой информации как имена файлов и номера строк). Без декомпозиции кода на подпрограммы, отладка была бы серьезно затруднена.&lt;br /&gt;
&lt;br /&gt;
== Механизм подпрограмм, их описание и вызов ==&lt;br /&gt;
В простейшем случае (в [[ассемблер]]ах) подпрограмма представляет собой последовательность команд (операторов), отдельную от основной части программы и имеющую в конце специальную команду выхода из подпрограммы. Обычно подпрограмма также имеет имя, по которому её можно вызвать, хотя ряд языков программирования допускает использование и неименованных подпрограмм. В языках высокого уровня описание подпрограммы обычно состоит по меньшей мере из двух частей: &amp;#039;&amp;#039;заголовка&amp;#039;&amp;#039; и &amp;#039;&amp;#039;тела&amp;#039;&amp;#039;. Заголовок подпрограммы описывает её имя и, возможно, параметры, то есть содержит информацию, необходимую для вызова подпрограммы. Тело — набор операторов, который будет выполнен всякий раз, когда подпрограмма будет вызвана.&lt;br /&gt;
&lt;br /&gt;
Вызов подпрограммы выполняется с помощью команды вызова, включающей в себя имя подпрограммы. В большинстве современных языков программирования команда вызова представляет собой просто имя вызываемой подпрограммы, за которым могут следовать фактические параметры (см. [[#Формальные и фактические параметры|ниже]]).&lt;br /&gt;
&lt;br /&gt;
В следующем примере на языке Паскаль подпрограмма subprog вызывается из основной программы трижды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  program SubProgExample;&lt;br /&gt;
    // Описание подпрограммы subprog&lt;br /&gt;
    procedure subprog; // Заголовок, включающий имя подпрограммы&lt;br /&gt;
    begin // начало тела подпрограммы&lt;br /&gt;
      WriteLn(&amp;#039;Bye&amp;#039;);&lt;br /&gt;
    end; // конец тела подпрограммы&lt;br /&gt;
  begin&lt;br /&gt;
    WriteLn(&amp;#039;Hello&amp;#039;);&lt;br /&gt;
    subprog; // 1-й вызов&lt;br /&gt;
    subprog; // 2-й вызов&lt;br /&gt;
    subprog; // 3-й вызов&lt;br /&gt;
  end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения такой программы станет вывод строки «Hello» и трёх строк «Bye».&lt;br /&gt;
&lt;br /&gt;
Для сохранения и восстановления контекста выполнения вызывающей процедуры, с целью исключения побочных эффектов, связанных с возможным нежелательным изменением используемых машинных регистров, компилятор формирует для каждой процедуры специальные последовательности команд, называемые [[Пролог процедуры|прологом и эпилогом]] процедуры.&lt;br /&gt;
&lt;br /&gt;
Некоторые языки программирования (например, Паскаль, Ада, Модула-2) допускают описание вложенных подпрограмм, то есть помещение подпрограмм внутрь других подпрограмм. Такие вложенные подпрограммы могут использоваться только в той подпрограмме, в которой они описаны. В иных случаях (например, в языке Си) вложение подпрограмм не допускается. Никаких принципиальных преимуществ вложение подпрограмм не даёт, но может быть удобно для более логичной структуризации программы (если какая-то подпрограмма используется только в некоторой другой подпрограмме, логично поместить первую во вторую).&lt;br /&gt;
&lt;br /&gt;
== Параметры подпрограмм ==&lt;br /&gt;
{{main|Параметр (программирование)}}&lt;br /&gt;
&lt;br /&gt;
=== Назначение параметров ===&lt;br /&gt;
Подпрограммы часто используются для многократного выполнения стереотипных действий над различными данными. Подпрограмма обычно имеет доступ к объектам данных, описанным в основной программе (по крайней мере, к некоторым из них), поэтому для того, чтобы передать в подпрограмму обрабатываемые данные, их достаточно присвоить, например, глобальным переменным. Но такой путь не особенно удобен и чреват ошибками.&lt;br /&gt;
&lt;br /&gt;
Для обеспечения контролируемой передачи параметров в подпрограмму и возврата результатов из неё используется механизм &amp;#039;&amp;#039;параметров&amp;#039;&amp;#039;. Параметры описываются при описании подпрограммы (в её заголовке) и могут использоваться внутри процедуры аналогично [[Переменная (программирование)|переменным]], описанным в ней. При вызове процедуры значения каждого из параметров указываются в команде вызова (обычно после имени вызываемой подпрограммы).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  program SubProgExample2;&lt;br /&gt;
    // Описание подпрограммы subprog&lt;br /&gt;
    procedure subprog(Line: String); // Заголовок, включающий имя подпрограммы&lt;br /&gt;
    begin // начало тела подпрограммы&lt;br /&gt;
      WriteLn(Line);&lt;br /&gt;
    end; // конец тела подпрограммы&lt;br /&gt;
  begin&lt;br /&gt;
    WriteLn(&amp;#039;Hello&amp;#039;);&lt;br /&gt;
    subprog(&amp;#039;Good bye,&amp;#039;); // 1-й вызов&lt;br /&gt;
    subprog(&amp;#039;my love,&amp;#039;);  // 2-й вызов&lt;br /&gt;
    subprog(&amp;#039;good bye!&amp;#039;); // 3-й вызов&lt;br /&gt;
  end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В приведённом примере параметр &amp;#039;&amp;#039;Line&amp;#039;&amp;#039; подпрограммы &amp;#039;&amp;#039;subprog&amp;#039;&amp;#039; в каждом вызове получает различное значение, благодаря чему выводятся не одинаковые строки, а разные.&lt;br /&gt;
&lt;br /&gt;
=== Формальные и фактические параметры ===&lt;br /&gt;
Чтобы отличать параметры подпрограммы, описанные в её заголовке и теле, от параметров, указываемых при вызове подпрограммы, используются формальные и фактические параметры. Формальные параметры указываются при объявлении или определении подпрограммы, а фактические — непосредственно при её вызове. Так, в последнем примере параметр &amp;#039;&amp;#039;Line&amp;#039;&amp;#039; в заголовке и теле подпрограммы &amp;#039;&amp;#039;subprog&amp;#039;&amp;#039; — это формальный параметр, а строка &amp;#039;&amp;#039; &amp;#039;Good bye&amp;#039; &amp;#039;&amp;#039;, использованная в первом вызове этой подпрограммы — фактический параметр. &amp;#039;&amp;#039;При вызове подпрограммы фактические параметры, указанные в команде вызова, становятся значениями соответствующих формальных параметров, чем и обеспечивается передача данных в подпрограмму.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Способ передачи параметров в подпрограмму ===&lt;br /&gt;
Существует несколько способов передачи параметров в подпрограмму.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Передача параметров по значению.&amp;#039;&amp;#039;&amp;#039; Формальному параметру присваивается &amp;#039;&amp;#039;значение&amp;#039;&amp;#039; фактического параметра. В этом случае формальный параметр будет содержать копию значения, имеющегося в фактическом, и никакое воздействие, производимое внутри подпрограммы на формальные параметры, не отражается на параметрах фактических. Так, если в качестве фактического параметра будет использована переменная, и внутри подпрограммы значение соответствующего формального параметра будет изменено, то фактический параметр останется без изменений.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;int func1(int x)&lt;br /&gt;
{&lt;br /&gt;
  x=x+2;&lt;br /&gt;
  return x;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Передача параметров по ссылке.&amp;#039;&amp;#039;&amp;#039; В формальный параметр может быть помещён &amp;#039;&amp;#039;сам&amp;#039;&amp;#039; фактический параметр (обычно это реализуется путём помещения в формальный параметр [[Ссылка (программирование)|ссылки]] на фактический). При этом любое изменение формального параметра в подпрограмме отразится на фактическом параметре — оба параметра во время вызова подпрограммы суть одно и то же. Параметры, передаваемые по ссылке, дают возможность не только передавать параметры внутрь подпрограммы, но и возвращать вычисленные значения в точку вызова. Для этого параметру внутри подпрограммы просто присваивается нужное значение, и после возврата из подпрограммы переменная, использованная в качестве фактического параметра, получает это значение.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;void func2(int &amp;amp;x)&lt;br /&gt;
{&lt;br /&gt;
  x=x+2;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Передача параметров по имени.&amp;#039;&amp;#039;&amp;#039; В формальный параметр может быть помещено произвольное выражение. При этом вычисление этого выражения произойдёт внутри подпрограммы в тот момент, когда потребуется его значение. Если это значение фигурирует несколько раз, то и вычисляться оно будет тоже несколько раз. Параметры, передаваемые по имени, дают возможность писать довольно универсальные подпрограммы. Такой способ передачи параметров используется, к примеру в языках [[Алгол]] или [[Алгол 68]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Передача параметров через стек.&amp;#039;&amp;#039;&amp;#039; Это фактически разновидность передачи параметра по значению «с ручным приводом», в данном случае отсутствует понятие формальных и фактических параметров. Все параметры лежат на стеке, причём их типы, количество и порядок не контролируются компилятором. Данный подход реализован в языке [[Forth|Форт]].&lt;br /&gt;
&lt;br /&gt;
Язык программирования может предоставлять возможность передавать параметры в подпрограммы либо только по значению, либо по значению и по ссылке, либо по имени и значению. В последних двух случаях для различения способов передачи параметра используются отдельные синтаксическая конструкции (в Паскале это ключевое слово &amp;#039;&amp;#039;var&amp;#039;&amp;#039; при описании параметра). В действительности, если язык содержит понятие ссылки (указателя), то можно обойтись и без передачи параметра по ссылке (её всегда можно смоделировать, описав параметр типа «ссылка»), но эта возможность удобна, так как позволяет работать с формальным параметром-ссылкой без [[разыменование|разыменования]], а также повышает надёжность и безопасность программы.&lt;br /&gt;
&lt;br /&gt;
На параметры, передаваемые по ссылке, накладываются естественные ограничения: фактический параметр, подставляемый на место такого параметра при вызове, обязан быть переменной (то есть иметь адрес), а в языках со строгой типизацией — ещё и иметь в точности такой же тип данных.&lt;br /&gt;
&lt;br /&gt;
== Виды подпрограмм ==&lt;br /&gt;
В языках программирования высокого уровня используется два типа подпрограмм: [[Процедура (программирование)|процедуры]] и [[Функция (программирование)|функции]].&lt;br /&gt;
* [[Функция (программирование)|Функция]] — это подпрограмма специального вида, которая, кроме получения параметров, выполнения действий и передачи результатов работы через параметры имеет ещё одну особенность— она всегда должна возвращать результат. Вызов функции является, с точки зрения языка программирования, выражением, он может использоваться в других выражениях или в качестве правой части присваивания.&lt;br /&gt;
* Процедура — это независимая именованная часть программы, которую после однократного описания можно многократно вызвать по имени из последующих частей программы для выполнения определенных действий.&lt;br /&gt;
&lt;br /&gt;
В [[Си (язык программирования)|C]]-подобных языках подпрограмма всегда описывается как функция. Процедура реализуется как функция типа &amp;#039;&amp;#039;void&amp;#039;&amp;#039;, то есть имеющая «пустой» тип и, соответственно, не возвращающая никакого значения.&lt;br /&gt;
&lt;br /&gt;
Подпрограммы, входящие в состав классов в объектных языках программирования, обычно называются [[Метод (программирование)|методами]]. Этим термином называют любые подпрограммы-члены класса, как функции, так и процедуры; когда требуется уточнение, говорят о &amp;#039;&amp;#039;методах-процедурах&amp;#039;&amp;#039; или &amp;#039;&amp;#039;методах-функциях&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Передача параметра]]&lt;br /&gt;
* [[Соглашение о вызове]]&lt;br /&gt;
&lt;br /&gt;
{{нет источников|дата=2013-11-16}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Подпрограммы| ]]&lt;br /&gt;
[[Категория:Концепции языков программирования]]&lt;/div&gt;</summary>
		<author><name>2A02:8109:AB9A:7500:B060:BA1D:1DD7:4AAF</name></author>
	</entry>
</feed>