이펙트

Effect system

컴퓨팅에서 효과 시스템부작용과 같은 컴퓨터 프로그램의 계산적 효과를 설명하는 공식적인 시스템이다.효과 시스템은 프로그램의 가능한 효과에 대한 컴파일 시간 확인을 제공하는 데 사용될 수 있다.

효과 시스템은 유형의 개념을 효과 종류와 지역을 구성하는 "효과" 구성요소로 확장한다.효과 종류는 수행되고 있는 을 설명하고, 영역은 수행되고 있는 (모수)으로 설명한다.

효과 시스템은 전형 시스템의 확장이다.이 경우에는 「유형·효과 시스템」이라는 용어가 쓰이기도 한다.흔히 값의 유형은 그 효과와 함께 형식 ! 효과와 함께 표시된다. 여기서 형식 구성 요소와 효과 구성 요소 모두 특정 영역을 언급한다(예를 들어, 돌연변이 메모리 셀의 유형은 셀이 있는 메모리 영역의 라벨에 의해 매개변수화된다)."알제브라 효과"라는 용어는 형식 체계에서 따온 것이다.

효과 시스템은 특정한 내부 불순 정의의 외부 순도를 입증하기 위해 사용될 수 있다. 예를 들어, 함수가 내부적으로 메모리 영역을 할당하고 수정하지만 함수의 유형이 해당 영역을 언급하지 않는 경우, 해당 효과는 함수의 영향에서 지워질 수 있다.[1]

효과 시스템으로 설명할 수 있는 행동의 일부 예는 다음과 같다.

  • 읽기, 쓰기 또는 메모리 할당: 효과 종류는 읽기, 쓰기, 할당 또는 자유이며, 영역은 할당이 수행된 프로그램의 지점이다(즉, 할당이 수행되는 각 프로그램 지점에는 고유한 라벨이 할당되고, 지역 정보는 데이터 흐름을 따라 정적으로 전파된다).메모리를 사용하는 대부분의 함수는 실제로 지역 변수에서 다형성이 될 것이다. 예를 들어, 메모리의 두 위치를 스왑하는 함수는 유형을 가질 것이다.forall r1 r2, unit ! {read r1, read r2, write r1, write r2}.
  • 파일과 같은 리소스로 작업: 예를 들어, 효과 종류가 열려 있고, 읽고 닫힐 수 있으며, 다시 말하지만, 영역은 리소스가 열려 있는 프로그램의 지점이다.
  • 연속 및 긴 점프를 통한 제어 전송: 효과 종류는 goto(즉, 코드 조각이 점프를 수행할 수 있음)와 출처(즉, 코드 조각이 점프의 대상이 될 수 있음)일 수 있으며, 영역은 점프를 수행할 수 있는 프로그램의 지점을 나타낸다.

프로그래머의 관점에서, 효과는 특정 행동의 구현(방법)을 수행할 행동의 명세와 구분할 수 있기 때문에 유용하다.예를 들어, 묻기 이름 효과는 콘솔에서 읽거나 창을 열거나 기본값을 반환할 수 있다.제어 흐름은 (실행이 계속된다는 점에서) 수율과 (처리되지 않은 효과가 취급될 때까지 아래로 전파된다는 점에서) 투척의 혼합으로 설명될 수 있다.[2]

구현

핵심 기능

  • Koka는 대수 효과 핸들러를 주요 특징으로 하는 정적으로 타이핑기능 프로그래밍 언어다.[3]
  • eff는 대수 효과 핸들러를 중심으로 정적으로 입력된 기능 프로그래밍 언어다.[4]
  • 유니즌은 형식 시스템의 핵심 부분으로 대수적 효과 핸들러(언어로는 "기능"이라고 함)를 가진 정적으로 입력된 기능 프로그래밍 언어다.[5]

전체 지원

  • Haskell은 효과의 인코딩을 허용하는 여러 패키지가 포함된 정적으로 타이핑된 기능 프로그래밍 언어다.[6]

부분적 지원 및 프로토타입

  • Scala 3.1은 예외에 한정된 효과에 대한 실험적 지원을 포함하는 정적으로 타이핑되고 기능적이며 객체 지향적인 프로그래밍 언어로서,CanThrow능력[7]
  • Java는 정적으로 타이핑된 객체 지향 프로그래밍 언어로서, 체크된 예외는 효과 시스템의 상대적으로 제한된 예다.단 하나의 효과 종류 -throws— 사용 가능하며, 값을 사용하여 재개할 수 있는 방법이 없으며, 함수가 사용자 정의를 구현하지 않는 한 기능(방법만)으로 사용할 수 없다.@FunctionalInterface.[8]
  • 자바스크립트동적으로 타이핑된 언어로 대수적 효과를 구현하는 제안서를 가지고 있다.[9]

참조

  1. ^ Albin., Turbak, Franklyn (2010). Design concepts in programming languages. PHI Learning. ISBN 978-81-203-3996-5. OCLC 1261053520.
  2. ^ Abramov, Dan. "Algebraic Effects for the Rest of Us". overreacted.io.
  3. ^ "The Koka Manual". koka-lang.github.io.
  4. ^ Pretnar, Matija (2021-12-07), Eff, retrieved 2021-12-11
  5. ^ "The Unison language". www.unisonweb.org. Retrieved 2021-12-07.
  6. ^ Vera, Josh (18 April 2020). "joshvera/freemonad-benchmark". GitHub. A benchmark comparing the performance of different free monad implementations.
  7. ^ "CanThrow Abilities". Scala Documentation. Retrieved 2021-12-07.
  8. ^ "Java 8 Lambda function that throws exception?". Stack Overflow. Retrieved 2021-12-25.
  9. ^ Macabeus, Bruno (16 September 2020). "macabeus/js-proposal-algebraic-effects: 📐Let there be algebraic effects in JS". GitHub.

교과서장

  • Hankin, Chris; Nielson, Flemming; Nielson, Hanne Riis (1999). Principles of Program Analysis. Berlin: Springer. ISBN 978-3-540-65410-0.
  • Gifford, David; Turbak, Franklyn A.; Sheldon, Mark A. (2008). "16". Design Concepts in Programming Languages. Cambridge, Mass: MIT Press. ISBN 978-0-262-20175-9.

개요서

추가 읽기