다른 극단적 인 점은 두 개의 프로그램이 동일한 기능을 계산할 때 동등하다는 것입니다 (또는 유사한 환경에서 동일한 관찰 가능한 동작을 보여줍니다). 그러나 이것들은 좋지 않습니다. 우선 순위를 검사하는 모든 프로그램이 같은 것은 아닙니다. 결과에 영향을주지 않고 코드 줄을 추가 할 수 있으며 여전히 동일한 프로그램으로 간주합니다.
이것은 극단적 인 것은 아니다 : 프로그램 동등성 은 관측의 개념과 관련 하여 정의되어야한다 .
PL 연구에서 가장 일반적인 정의는 문맥 상 동등성입니다. 문맥 상 등가에서, 우리는 프로그램을 더 큰 프로그램의 구성 요소 (컨텍스트)로 사용함으로써 프로그램을 관찰한다는 아이디어입니다. 따라서 두 프로그램이 모든 상황에 대해 동일한 최종 값을 계산하면 동일한 것으로 판단됩니다. 이 정의는 가능한 모든 프로그램 컨텍스트를 수량화하기 때문에 직접 작업하기가 어렵습니다. PL의 전형적인 연구 프로그램은 문맥 상 동등성을 암시하는 구성 추론 원칙을 찾는 것입니다.
그러나 이것이 유일하게 가능한 관측 개념은 아닙니다. 예를 들어 프로그램의 메모리, 시간 또는 전원 동작을 관찰 할 수 있다고 쉽게 말할 수 있습니다. 이 경우 더 많은 프로그램을 구별 할 수 있기 때문에 프로그램 동등성이 줄어 듭니다 (예를 들어, mergesort는 이제 quicksort와 구별 가능합니다). 타이밍 채널 공격에 영향을받지 않는 언어를 설계하거나 공간에 한정된 프로그래밍 언어를 설계하려는 경우 이는 일종의 작업입니다.
또한 계산의 중간 상태 중 일부를 관찰 가능한 것으로 판단 할 수도 있습니다. 이는 간섭 가능성으로 인해 동시 언어에서 항상 발생합니다. 그러나 순차 언어의 경우에도이보기를 원할 수 있습니다. 예를 들어, 암호화되지 않은 데이터를 주 메모리에 저장하지 않는 계산을하려면 주 메모리에 대한 쓰기를 관찰 가능한 것으로 간주해야합니다.
기본적으로 프로그램 동등성에 대한 단일 개념은 없습니다. 그것은 항상 당신이 선택한 관측의 개념과 관련이 있으며, 그것은 당신이 생각하는 응용에 달려 있습니다.