Charles의 답을 바탕으로, 프로그래밍 언어 이론의 주된 어려움은 프로그램의 동등성에 대한 자연적 개념이 일반적으로 제공 할 수있는 가장 간단한 수학적 의미론이나 기본 기계 모델에서 엄격한 평등이 아니라는 것입니다. 예를 들어, 다음과 같은 Java 유사 코드를 고려하십시오.
Object x = new Object();
Object y = new Object();
... some more code ...
따라서이 프로그램은 객체를 만들고 x라는 이름을 지정한 다음 y라는 두 번째 객체를 만든 다음 코드를 계속 실행합니다. 이제 프로그래머가이 두 객체의 할당 순서를 뒤집기로 결정했다고 가정합니다.
Object y = new Object();
Object x = new Object();
... some more code ...
이제 리팩토링이 프로그램의 동작을 변경합니까? 한편으로, 기본 컴퓨터에서 x와 y는 프로그램의 두 실행에서 다른 위치에 할당됩니다. 따라서 이런 의미에서 프로그램은 다르게 작동합니다.
그러나 Java와 같은 언어에서는 순서가 아닌 평등에 대한 참조 만 테스트 할 수 있으므로 "더 많은 코드" 가 관찰 할 수없는 차이입니다 . 결과적으로 대부분의 프로그래머는 순서를 바꾸면 최종 답변과 아무런 차이가 없을 것으로 기대하며 대부분의 컴파일러 작성자는이 기준으로 재정렬 및 최적화를 수행 할 수있을 것으로 기대합니다. 반면에 C와 같은 언어에서는 먼저 포인터를 정수로 캐스트하여 순서에 대한 포인터를 비교할 수 있으므로이 순서가 반드시 관찰 가능한 동작을 유지 하지는 않습니다 .
시맨틱 스의 주요 질문 중 하나는 두 프로그램이 관찰 가능할 때의 질문에 대답하는 것입니다. 우리의 관찰 개념은 프로그래밍 언어의 기능에 달려 있기 때문에 "클라이언트 프로그램이 입력으로 해당 프로그램을 수신하여 다른 응답을 계산할 수없는 경우 두 프로그램은 동일합니다."와 같은 정의로 끝납니다. 모든 클라이언트 프로그램에 대한 수량화는이 질문을 어렵게 만듭니다. 가능한 모든 클라이언트 프로그램에 대해 두 가지 특정 코드 조각에 대해 말해야하는 것처럼 보입니다.
dentational semantics를 사용하는 요령은이 보편적 인 정량화를 피할 수있는 수학적 해석을 제공하는 것입니다. 코드의 의미는 수학적 가치라고 말하며 수학적으로 동일한 지 확인하여 비교합니다. 아니. 이는 로컬 (예 : 구성)이며 가능한 모든 클라이언트에 대한 수량화와 관련이 없습니다. (denotational 의미론은 그것이 의미가 있다는 것을 의미하는 문맥 상 동등성을 함축하고 있음을 보여줄 필요가있다. 그것이 완성되면-denotational equality가 문맥 상 동등성과 정확히 동일 할 때, 우리는 의미론이 "완전히 추상적"이라고 말한다.)
그러나 의미 상 의미론이 해당 동등성을 검증하는지 확인해야 함을 의미합니다. 따라서이 예제에서이 Java와 같은 언어에 대해 의미 론적 의미론을 제공하려면 new 호출이 힙을 가져 오는 것뿐만 아니라 새로 작성된 오브젝트로 새 힙을 다시 제공해야합니다. 프로그램의 입력은 입력 힙의 모든 순열에서 변하지 않습니다. 여기에는 상당히 복잡한 수학적 구조가 포함될 수 있습니다 (예 :이 경우 모든 것이 적절한 순열 그룹으로 모듈로 작동하도록 보장하는 범주에서 작동).