Параметр (программирование)


Пара́метр в программировании — принятый функцией аргумент. Термин «аргумент» подразумевает, что конкретно и какой конкретной функции было передано, а параметр — в каком качестве функция применила это принятое. То есть вызывающий код передает аргумент в параметр, который определен в члене спецификации функции.

Семантика использования формальных и фактических параметров называется стратегией вычисления. Заданная стратегия вычисления диктует, когда следует вычислять аргументы функции (метода, операции, отношения), и какие значения следует передавать. Существует довольно много разнообразных стратегий вычисления.

Примечание — использование распространённого в сообществе императивного программирования термина «передача параметра» для многих языков программирования является не вполне корректным — например, в случае вызова по необходимости, применяемого в языке Haskell, параметр может быть использован в теле функции, но ни разу не передан за все случаи её вызова, и даже полностью исключён из результирующего машинного кода.

Наиболее часто упоминаемыми стратегиями вычисления являются вызов по значению и вызов по ссылке, однако в действительности использование этих терминов не всегда уместно. Например, в сообществе языка Java говорят «Java использует вызов по значению, где „значением“ является ссылка на объект», в сообществе языка Ruby говорят «Ruby использует вызов по ссылке», однако в действительности оба эти языка используют стратегию вызов по соиспользованию (англ. call-by-sharing)[3][4]. Многие языки, например Си, не имеют механизма вызова по ссылке, но позволяют симулировать его внутри семантики вызова по значению посредством ссылочных типов, в частности, указателей. В последнем случае в сообществах таких языков часто говорят «язык поддерживает две стратегии вычисления», а также о «вызове по указателю» или «вызове по адресу».

На практике, модель вычисления многих промышленных языков (Java, C#) сводится к стратегии «вызов-при-упоминании/передача-по-ссылке». Некоторые более старые языки, в особенности небезопасные языки, такие как C++, сочетают несколько разных моделей вызова, включая экзотичные, такие как «вызов-по-ссылке-на-константу». Исторически вызов по значению и вызов по имени восходят к Алголу-60, созданному в конце 1950-х годов. Только чистые функциональные языки, такие как Clean и Haskell, используют вызов по необходимости (англ. call-by-need), который часто отождествляют (что также не вполне корректно) с ленивыми вычислениями.

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