컴퓨터 과학에서 불변이 중요한 이유


16

나는 문자 그대로의 '불변'을 이해합니다. 코드를 입력 할 때도 인식합니다. 그러나 나는 컴퓨터 과학의 맥락에서이 용어의 중요성을 이해하지 못한다고 생각합니다.

유명한 프로그래머 \ 컴퓨터 과학자들로부터 언어 디자인에 관한 대화 / 백서를 읽을 때마다 '불변'이라는 용어가 계속 전문 용어로 등장합니다. 그것이 내가 이해하지 못하는 부분입니다. 그것에 대해 특별한 점은 무엇입니까?


나는 버그 가능성을 줄이기 위해 정확성을 보장하기 위해 어설 션을 많이 사용합니다.
Job

답변:


7

알고리즘은 반복 가능한 프로세스입니다. 반복 가능하면 반복으로 변경되지 않는 속성이 있어야합니다. 이들은 당신의 불변입니다. 불변은 알고리즘에 공급 될 (잠재적으로) 변하는 데이터와 결합 및 / 또는 작동합니다.

따라서 프로그래밍의 핵심은 변하지 않는 것, 즉 본질적으로 프로그램을 식별하는 것입니다.

객체 지향 프로그램에서는 각 객체가 단일 작업을 잘 수행해야한다는 개념이 있습니다. 이것은 본질적으로 (클래스 기반 OOP의 경우) 클래스가 객체에 필요할 수있는 변형 데이터에 대한 자리 표시 자 (변수)와 함께 단일 알고리즘에 대한 변형을 정의 함을 의미합니다. 이상적으로 OO에서는 가능한 한 다양한 것을 분리하여 각 객체가 거의 변하지 않도록합니다.


27

불변의 개념은 '부작용'과 밀접한 관련이 있습니다. 나는 이것이 소프트웨어 디자인에 대한 Bertrand Meyer의 'DbC (Design by Contract)'접근 방식에 의해 촉진되었다고 생각합니다.

DbC는 3 가지 중요한 개념, 전제 조건, 사후 조건, 변형이없는 추상 데이터 유형 (클래스 백본)을 강화 합니다. 절차를 참조 할 때 쉽게 설명 할 수 있으므로 다음과 관련하여 설명하려고합니다.

  1. 전제는 절차가 프로 시저를 호출하기 위해 준수해야하는 조건의 입력 데이터를 나타낸다. 이 전제 조건은 해당 특정 절차의 고객이 존중하고 시행해야합니다. 그러나 프로 시저 디자이너는 해당 조건을 프로 시저의 첫 번째 줄로 선언하여 전제 조건을 존중하지 않는 클라이언트로부터 방어 할 수 있습니다. 예를 들어 double divide(double dividend, double divisor), 전제 조건을 갖는 메소드 가있을 수 있습니다 divisor != 0.

  2. 사후 조건 은 프로 시저가 리턴 된 후 출력 데이터 의 조건을 나타냅니다. 전제 조건이 존중되는 경우,이 사후 조건을 존중하는 것은 전적으로 절차 설계자의 임무입니다. 리턴하기 전에 방어 프로그래밍 스타일에서 사후 조건을 주장 할 수 있습니다.

  3. 불변는 A A 전제 양 및 사후 조건으로 간주하지만, 상기 개념에서 사전 조건 및 사후 조건의 다른 이해 될 수있다. 불변은 기본적으로 입력이 프로 시저가 호출되기 전에 특정 조건이 충족되면 프로 시저가 호출 된 후에 해당 조건이 유효하다고 말합니다. 예를 들어, 프로 시저에 유효한 불변 은 호출 이전의 boolean search(int term, int array[])상태가 array호출 이후의 상태 와 같다고 말할 수 있습니다 .

절차 (및 절차뿐만 아니라)에 변하지 않는 것을 적용하는 것은 부작용을 줄이기 때문에 큰 일입니다 . 부작용은 프로그래밍에 큰 악이 있기 때문에 유용합니다. 특정 프로시 저는 입력 인수의 상태를 변경하거나 일부 전역 변수의 상태를 변경하거나 일부 전역 변수에 따라 달라질 수 있습니다. 이로 인해 동일한 프로 시저에서 동일한 입력으로 두 개의 동일한 호출이 다른 출력을 생성 할 수있는 불쾌한 상황이 발생할 수 있습니다. 이로 인해 호출 기록을 알 수 있으며 특히 멀티 스레딩 컨텍스트에서 디버깅하기가 매우 어렵습니다.


2

불변은 일부 연산에 의해 보존되는 논리적 속성입니다.

  • 루프에 대해 추론하기 위해 불변이 필요합니다. 얼마나 많은 반복이 있을지 미리 알지 못하기 때문에 (또는 루프가 필요하지 않음) 각 반복은 불변을 유지해야하며 결국에는 루프에 대한 유용한 속성을 증명할 수 있습니다.

  • 캡슐화 된 데이터의 속성에 대해 추론하기 위해 변형이 필요합니다. 종종 모듈이나 객체 내부의 다양한 데이터는 올바른 작업을 위해 특정 속성을 충족해야합니다 (예 : 집합을 나타내는 목록은 항상 정렬되어야 함). 데이터에서 작동하는 각 함수 또는 메소드가 이러한 특성을 유지하므로 불변이기도합니다.


0

내가 알고있는 것에서 불변의 중요성은 그것이 알고리즘이 특정 기능을 계산한다는 것을 입증하기위한 빌딩 블록이라는 사실에서 비롯됩니다. 예를 들어 새로운 정렬 알고리즘을 개발했지만 모든 입력 또는 모든 올바른 출력으로 실제로 정렬되도록하려면 어떻게해야합니까? 다음 단계는 알고리즘의 흐름에 해당하는 불변량을 구성하고 불변량을 사용하여 정렬한다는 것을 증명하는 것입니다.


0

프로그래밍 언어의 타입 시스템과 관련하여, 불변 타입은 변환 불가능한 타입이다. 예를 들어, java에서 메소드를 오버로드 할 때 모든 매개 변수는 변하지 않지만 리턴 유형은 공변량입니다 (동일하거나 하위 유형일 수 있음).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.