시맨틱에서 부작용은 어떻게 처리됩니까?


19

Anthony Aaby의 시맨틱 에 대한 "프로그래밍 언어 소개" 섹션에서 다음을 관찰합니다.

프로그래밍 언어의 의미론에서 대부분의 작업은 명령형 프로그램이있는 명령형 프로그램을 구성하고 이해하려고 할 때 발생하는 문제에 의해 동기가 부여됩니다. 대입 명령은 변수에 값을 재 할당하기 때문에 대입은 프로그램의 먼 부분에 예기치 않은 영향을 줄 수 있습니다.

이것은 부작용을 허용하는 것이 시맨틱 스 작업의 주요 부분에 동기를 부여한다는 놀라운 입장으로 저를 놀라게합니다.

어떻게의 존재 부작용 프로그래밍 언어에 미치는 영향의 계산 모델에 프로그램을지도 할 수있는 능력? 부작용을 허용하면서이 프로세스를 개선 할 수있는 상태 관리 방법이 있습니까?


이것이 소프트 질문으로 태그되어야합니까? "의미론 [...]의 많은 작업이 [부수 효과]에 의해 동기 부여"되므로, 짧고 엄격한 답변을 기대할 수는 없습니다.
Radu GRIGore

1
@Radu : MO의 경우 [big-picture]로 표시 될 것입니다. 대부분 [soft-question]이나 CW가 아닙니다.
Charles Stewart

태그가 큰 사진이 더 좋습니다. 잊어 버렸습니다.
Radu GRIGore

좋은 제안; 태그를 추가했습니다.
Shane

답변:


18

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 호출이 힙을 가져 오는 것뿐만 아니라 새로 작성된 오브젝트로 새 힙을 다시 제공해야합니다. 프로그램의 입력은 입력 힙의 모든 순열에서 변하지 않습니다. 여기에는 상당히 복잡한 수학적 구조가 포함될 수 있습니다 (예 :이 경우 모든 것이 적절한 순열 그룹으로 모듈로 작동하도록 보장하는 범주에서 작동).


"이 프로그램을 입력으로받은 클라이언트 프로그램이 다른 응답을 계산할 수없는 경우 두 프로그램이 동일합니다." 나는 이것으로 혼란스러워합니다. 프로그램 X와 클라이언트 프로그램 Y 가있는 경우 Y가 X를 '호출'한다는 의미로 사용합니다. 그러나 Y는 X의 텍스트를 입력 으로 읽습니다. 이 경우에는 거의 호출하지 않습니다. Y는 X의 '고객'입니다. 명확하게 말씀해 주시겠습니까?
Radu GRIGore

1
"X의 클라이언트"는 "프로그램 컨텍스트"와 동일 함을 의미합니다. "프로그램 컨텍스트"는 "하위 용어로 X를 포함하는 더 큰 프로그램"입니다.
Neel Krishnaswami

따라서 X는 Y에 적용된 람다라고 생각하기 때문에 'X는 Y의 클라이언트입니다'를 'X는 Y를 입력으로 읽습니다'와 상호 교환 가능합니까? 의미가 있지만 Java에 대해 이야기 할 때 약간 비틀어집니다. :)
Radu GRIGore

1
@RaduGRIGore : 프로그램 컨텍스트는 다른 것을 의미합니다. 게시물을 올바르게 읽고 있지만 X가 Y의 소스 코드를 입력으로 읽는 경우 (포스트를 해석하는 방식), 구문 적으로 다른 두 프로그램을 모두 구별 할 수 있습니다. 대신 Y가 X에서 람다 함수이면 너무 적은 프로그램을 구별 할 수 있습니다. "프로그램 컨텍스트"에 대한 Neel의 의견은 올바른 정의입니다. 프로그램 컨텍스트 Y는 AST에 구멍이있는 프로그램으로, 두 개의 서로 다른 프로그램 조각 X1 및 X2를 배치 할 수 있습니다.
Blaisorblade

@NeelKrishnaswami : 게시물에서 무슨 의미인지 분명히 알 수 있습니까? 예제를 계속 사용하고 하나 또는 다른 조각을 삽입 할 수있는 프로그램에 대해 이야기 할 수 있습니다.
Blaisorblade

12

물론 (의도적) 의미론에서 효과를 다루는 방법이 있습니다. 예를 들어, 계산 효과가 모나드 라는 Eugenio Moggi의 아이디어를 사용할 수 있습니다 (이 아이디어는 Haskell의 디자인에도 사용되었습니다). 이것의 문제점 중 하나는 모나드를 결합하기 어렵다는 것입니다. 고든 플롯 킨 (Gordon Plotkin)존 파워 (John Power)대수적 영향 을 포함하는 Moggi의 모나드를 Lawvere 이론 또는 대수 이론으로 개선 할 것을 제안했다 . 아니). 종합적인 치료법은 Matija Pretnar의 논문을 참조하십시오 .

또한 Frank Oles와 John Reynolds가 개발 한 지역 국가에 대한 가능한 세계 시맨틱에 대해 언급해야합니다 (죄송합니다. 더 나은 링크를 찾을 수 없습니다.이 자료는 1982 년입니다). Moggi의 모나드보다 앞서 있습니다. 그들은 presheaves의 범주를 사용하여 지방 상태의 많은 측면을 올바르게 모델링 한 알골 같은 언어의 의미론을 제공했습니다 (그러나 모두는 아니지만 모델이 스냅 백을 허용한다고 생각하지만 아마도 내 기억이 잘못되었습니다).


1
네, functor 카테고리 시맨틱은 모든 Meyer-Sieber 동등성을 검증하지 않았습니다. Peter O'Hearn과 Robert Tennant는 90 년대 중반에 (IIRC)가 Meyer-Sieber의 모든 예제를 얻은 functor-category 시맨틱의 파라 메트릭 버전을 개발했지만 완전히 추상적인지 여부는 알 수 없습니다.
Neel Krishnaswami

O'Hearn and Tennent 모델은 완전히 추상적 인 것은 아닙니다. 그것은 논문 자체에서 논의됩니다. 그러나 선형 람다 미적분학을 사용하는 O'Hearn과 Reynolds의 개선은 완전히 2 차로 추상화됩니다. 이 논문은 Ahmed, Dreyer, Birkedal et al.
Uday Reddy

12

Matthias Felleisen은 "통제와 국가의 구문론 (Syntactic Theory of Control and State)"에 관한 그의 시리즈에서 의미론의 부작용 문제에 대한 강력한 해결책을 제시했다.

이러한 작업으로 기능, 객체 지향, 명령 및 논리 언어를 간결하게 모델링 할 수있는 간단한 추상 시스템 프레임 워크 인 CESK 시스템이 탄생했습니다. CESK 프레임 워크는 부작용뿐만 아니라 예외, 연속, 게으름 및 스레드와 같은 "복잡한"제어 구문도 처리합니다.

CESK 머신과보다 작은 단계의 동작 의미론은 약 20 년 동안 프로그래밍 언어 이론의 사실상 표준이었습니다.

한마디로 CESK 머신은 모든 머신 상태를 설명하기위한 4 개의 구성 요소 (제어 문자열 (프로그램 카운터의 일반화), 환경, 저장소 (힙이라고도 함) 및 현재 연속성)가있는 작은 단계의 머신입니다.

환경은 변수를 주소에 매핑합니다. 상점은 주소를 값에 맵핑합니다.

따라서 변경 가능한 변수를 간단하게 모델링 할 수 있습니다. 주소의 값만 변경하면됩니다.

또한 포인터와 동적 할당을 쉽게 모델링 할 수 있습니다. 즉, 상점 주소를 일류 값으로 만 만들면됩니다.

비슷한 방식으로 일류 연속은 주소 지정 가능한 값으로 만들어집니다.


6

프로그래밍 언어에 부작용이 있으면 프로그램을 계산 모델에 매핑하는 기능에 어떤 영향을 줍니까?

반드시 어려운 것은 아니지만 큰 표현의 의미를 작은 표현으로 구성 할 수있는 방법에 제한을가합니다. 예를 들어, 고차원 함수를 전역 참조에 할당 할 수있는 언어에 대해 Scott 스타일의 의미 체계를 제공하려는 경우 특정 다른 프로그래밍 구조와 매우 나쁘게 상호 작용할 수 있습니다.

단순히 문제를 일으키는 상태와 같은 부작용은 아닙니다. Dijkstra의 보호 명령 언어와 같은 간단한 명령형 언어에는 이러한 종류의 부작용이 있으며 의미가 좋습니다. 부작용이없는 경우에도 프로그래밍 언어에서 예상되는 종류의 작동 의미론으로 람다 미적분의 확장으로 문제가 발생합니다. 가장 초기의 Plotkin의 PCF는 상대적으로 초기에 모형을 제공했지만 의미는 완전히 추상적이지 않았습니다. 의의 적 의미론은 그들의 동작 의미론과 정확히 일치하지 않는, 지나치게 일반적이었다. PCF는 1980 년대 후반에 게임 의미론으로 완전히 추상적 인 의미 론적 의미를 받았는데, 이는 Scott의 차수 이론적 의미론과 전혀 다릅니다. 동시성은 여전히 ​​완전히 적절한 치료를받지 못했습니다.

많은 사람들이 이런 종류의 의미론의 중요성에 의문을 제기합니다. "시맨틱"이 프로그램 소스이고 프로그램을 컴파일하고 실행 한 일부 머신의 이름 인 경우에도 항상 일종의 운영 의미론을 제공 할 수 있습니다. 이러한 이유로 Strachey는 운영 의미론을 비난했습니다. 그러나 Plotkin의 구조적 동작 의미론은 어떻게 동작 의미론이 기계 모델과 분리 될 수 있는지 보여 주었고, Pitt의 연구는 그러한 의미론이 프로그램과 프로그래밍 언어에 대한 유사 의미론과 유사한 추론을 어떻게 지원할 수 있는지를 보여 주었다. 따라서, 동작 시맨틱은 덴토 멘탈 시맨틱에 대한 실행 가능한 대안이며, 표준 ML과 같은 상당수의 프로그래밍 언어에 성공적으로 적용되었다.

부작용을 허용하면서이 프로세스를 개선 할 수있는 상태 관리 방법이 있습니까?

시맨틱을 제공하는 데 어려움이있는 것은 어느 정도 기대할 수있는 방식으로 작동하는 강력한 프로그래밍 언어를 제공하는 데 어려움이 있습니다. 실질적으로 동기 부여 된 디자인 결정 (예 : 메시지 전달 동시성을 통한 동시성과 함께 전역 상태 사용 방지)은 의미를보다 쉽게 ​​제공 할 수 있도록합니다.


Scott의 PCF는 상태가 없으며 Scott도 아닙니다. en.wikipedia.org/wiki/…
Andrej Bauer

@Andrej : Err, Luke Ong가 내 D.Phil을 감독했다는 점을 감안할 때, 그런 실수를해서는 안됩니다. 나는 밀너의 PCF와 WP의 LTU 이야기로보다 더 ... 간결하다 스콧의 LCF의 티저-요약을 게시 : lambda-the-ultimate.org/node/2196 그것은 나에게 발생 당신이 누락 된 스콧에 액세스 할 수 있음 (1969) 원고 ...
Charles Stewart

그것은 Plotkin의 PCF 일 것입니다. 필자는 :-) 원고를 잡으려고 노력할 수는 있지만 실제로는 가지고 있지 않습니다.
Andrej Bauer

그러나 요점은 PCF에 상태가 없다는 것입니다. Strachey가 운영 의미론을 정죄한다고 말하는 "이유"는 무엇입니까? 나에게는 분명하지 않았다. 마지막 단락은 앞서 말한 내용과 모순됩니다. 즉, 보호 명령에는 멋진 의미가 있지만 PCF에는 없습니다.
Uday Reddy

@Andrej, Uday : 3 년이 채 지나지 않아 게시물을 수정했습니다.
찰스 스튜어트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.