stringtranslate.com

Побочный эффект (информатика)

В информатике операция, функция или выражение считаются имеющими побочный эффект , если они имеют какой-либо наблюдаемый эффект, отличный от их основного эффекта чтения значения своих аргументов и возврата значения вызывающему операцию. Примеры побочных эффектов включают изменение нелокальной переменной , статической локальной переменной или изменяемого аргумента, переданного по ссылке ; возникновение ошибок или исключений; выполнение ввода-вывода ; или вызов других функций с побочными эффектами. [1] При наличии побочных эффектов поведение программы может зависеть от истории; то есть порядок оценки имеет значение. Понимание и отладка функции с побочными эффектами требуют знания контекста и ее возможных историй. [2] [3] Побочные эффекты играют важную роль в проектировании и анализе языков программирования . Степень использования побочных эффектов зависит от парадигмы программирования. Например, императивное программирование обычно используется для создания побочных эффектов, для обновления состояния системы. Напротив, декларативное программирование обычно используется для сообщения о состоянии системы без побочных эффектов.

Функциональное программирование направлено на минимизацию или устранение побочных эффектов. Отсутствие побочных эффектов упрощает формальную проверку программы. Функциональный язык Haskell устраняет побочные эффекты, такие как ввод-вывод и другие вычисления с сохранением состояния, заменяя их монадическими действиями. [4] [5] Функциональные языки, такие как Standard ML , Scheme и Scala, не ограничивают побочные эффекты, но программисты обычно избегают их. [6]

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

Ссылочная прозрачность

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

Временные побочные эффекты

Побочные эффекты, вызванные временем, необходимым для выполнения операции, обычно игнорируются при обсуждении побочных эффектов и ссылочной прозрачности. Существуют некоторые случаи, такие как аппаратное хронометрирование или тестирование, когда операции вставляются специально для их временных побочных эффектов, например sleep(5000)или for (int i = 0; i < 10000; ++i) {}. Эти инструкции не изменяют состояние, за исключением того, что для их завершения требуется некоторое время.

Идемпотентность

Подпрограмма с побочными эффектами является идемпотентной , если множественные применения подпрограммы оказывают тот же эффект на состояние системы, что и одно применение, другими словами, если функция из пространства состояний системы в себя, связанная с подпрограммой, является идемпотентной в математическом смысле . Например, рассмотрим следующую программу на Python :

х  =  0def  setx ( n ):  глобальный  x  x  =  nsetx ( 3 ) утверждение  x  ==  3 setx ( 3 ) утверждение  x  ==  3

setxявляется идемпотентным, поскольку второе применение setxк 3 оказывает такое же влияние на состояние системы, как и первое применение: xуже было установлено в 3 после первого применения, и оно все еще установлено в 3 после второго применения.

Чистая функция идемпотентна , если она идемпотентна в математическом смысле . Например, рассмотрим следующую программу на Python:

def  abs ( n ):  возвращает  - n  если  n  <  0  иначе  nутверждать  абс ( абс ( - 3 ))  ==  абс ( - 3 )

absявляется идемпотентным, поскольку второе применение absк возвращаемому значению первого применения к -3 возвращает то же значение, что и первое применение к -3.

Пример

Одной из распространенных демонстраций поведения побочных эффектов является оператор присваивания в C. Присваивание a = b— это выражение, которое вычисляется с тем же значением, что и выражение b, с побочным эффектом сохранения R-значения в bL -значении . aЭто допускает множественное присваивание:

a = ( b = 3 ); // b = 3 вычисляется как 3, которое затем присваивается a     

Поскольку оператор справа ассоциирует , это эквивалентно

а = б = 3 ;    

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

while ( b == 3 ) {} // проверяет, равно ли b 3     

с

while ( b = 3 ) {} // b = 3 вычисляется как 3, что затем приводится к true, поэтому цикл бесконечен     

Смотрите также

Ссылки

  1. ^ Spuler, David A.; Sajeev, A. Sayed Muhammed (январь 1994 г.). Compiler Detection of Function Call Side Effects . James Cook University . CiteSeerX  10.1.1.70.2096 . Термин Side Effect относится к изменению нелокальной среды. Обычно это происходит, когда функция (или процедура) изменяет глобальную переменную или аргументы, переданные ссылочными параметрами. Но вот другие способы, которыми нелокальная среда может быть изменена. Мы рассматриваем следующие причины побочных эффектов через вызов функции: 1. Выполнение ввода-вывода. 2. Изменение глобальных переменных. 3. Изменение локальных постоянных переменных (например, статических переменных в C). 4. Изменение аргумента, переданного по ссылке. 5. Изменение локальной переменной, как автоматической, так и статической, функции, расположенной выше в последовательности вызова функции (обычно через указатель).
  2. ^ Тернер, Дэвид А. , ред. (1990). Темы исследований в функциональном программировании . Addison-Wesley . стр. 17–42.Через Хьюза, Джона. "Почему функциональное программирование имеет значение" (PDF) . Архивировано (PDF) из оригинала 2022-06-14 . Получено 2022-08-06 .
  3. ^ Collberg, Christian S. (2005-04-22). "CSc 520 Principles of Programming Languages". Department of Computer Science, University of Arizona . Архивировано из оригинала 2022-08-06 . Получено 2022-08-06 .
  4. ^ "Отчет по Haskell 98". 1998.
  5. ^ Джонс, Саймон Пейтон; Вадлер, Фил (1993). Императивное функциональное программирование . Отчет о конференции 20-го ежегодного симпозиума ACM по принципам языков программирования. стр. 71–84.
  6. ^ Феллейзен, Маттиас ; Финдлер, Роберт Брюс; Флэтт, Мэтью; Кришнамурти, Шрирам (2014-08-01). «Как разрабатывать программы» (2-е изд.). MIT Press .