programing

"만약" 규칙이란 정확히 무엇입니까?

prostudy 2022. 9. 8. 17:43
반응형

"만약" 규칙이란 정확히 무엇입니까?

제목에 있듯이:

"만약" 규칙이란 정확히 무엇입니까?

일반적인 답변은 다음과 같습니다.

프로그램의 관찰 가능한 동작을 변경하지 않는 모든 코드 변환을 허용하는 규칙

이 규칙에 기인하는 특정 구현에서 동작이 계속 발생하는 경우가 있습니다.여러 번 틀렸다.

그럼, 이 규칙이 정확히 뭐죠?이 기준에서는 이 규칙을 섹션이나 단락으로 명확하게 기술하고 있지 않습니다만, 이 규칙의 범위에 해당하는 것은 정확히 무엇입니까?

표준으로 상세하게 정의되어 있지 않은 회색 영역인 것 같습니다.기준에서 인용한 내용을 인용해서 자세히 설명해 주실 수 있나요?

주의: 이 태그는 C와 C++로 지정합니다.이것은 양쪽 언어에 관련되어 있기 때문입니다.

"만약" 규칙이 뭐죠?

"as-if" 규칙은 기본적으로 구현이 합법적인 C++ 프로그램에서 수행할 수 있는 변환을 정의합니다.즉, 프로그램의 "관측 가능한 동작"에 영향을 미치지 않는 모든 변환(정확한 정의는 아래 참조)이 허용됩니다.

목적은 프로그램의 동작이 추상 머신에 관해 C++ 표준에 의해 지정된 의미에 준거하고 있는 한, 최적화를 실행할 수 있는 자유를 실장하는 것이다.


이 기준은 어디에 이 규칙을 도입하고 있는가?

C++11 표준은 문단 1.9/1에 "만약 그대로" 규칙을 도입한다.

이 국제 표준의 의미 설명은 매개 변수화된 비결정론적 추상 기계를 정의한다.본 국제표준은 적합 구현 구조에 대해 어떠한 요구사항도 두지 않는다.특히 추상 기계의 구조를 복사하거나 에뮬레이트할 필요가 없습니다.대신, 다음과 같이 추상 머신의 관찰 가능한 동작을 에뮬레이트(만)하기 위해 적합한 구현이 필요합니다.

또한 설명 각주에는 다음이 추가되어 있습니다.

이 조항은 때때로 "만약" 규칙이라고 불리기도 하는데, 그 이유는 프로그램의 관찰 가능한 동작에서 결정될 수 있는 한, 그 결과가 준수된 것처럼 이 국제 표준의 모든 요구사항을 자유롭게 무시할 수 있기 때문이다.예를 들어, 실제 구현은 그 값이 사용되지 않고 프로그램의 관찰 가능한 동작에 영향을 미치는 부작용이 발생하지 않는다고 추론할 수 있다면 표현의 일부를 평가할 필요가 없다.


그 규칙은 정확히 무엇을 의무화합니까?

1.9/5항은 다음 사항을 추가로 명시한다.

적절한 형식프로그램실행하는 적합 실장은 동일한 프로그램동일한 입력을 가진 추상기계의 해당 인스턴스의 가능한 실행하나와 동일한 관찰 가능한 동작을 생성해야 한다.단, 이러한 실행이 정의되지 않은 동작을 포함하는 경우, 본 국제표준은 해당 입력으로 프로그램을 실행하는 구현에 대한 요구사항을 부여하지 않는다(첫 번째 정의되지 않은 동작 이전의 동작에 대해서도 마찬가지).

이 제약은 "잘 형성된 프로그램 실행" 시에만 적용되며 정의되지 않은 동작을 포함하는 프로그램 실행 시 발생할 수 있는 결과는 제약되지 않는다는 점을 강조할 필요가 있습니다.이는 문단 1.9/4에도 명시되어 있다.

이 국제표준에서는 특정 다른 조작이 정의되지 않은 것으로 기술되어 있습니다(예를 들어 const 객체를 수정하려는 경우의 영향).[주의:이 국제 표준은 정의되지 않은 동작을 포함하는 프로그램의 동작에 대해 어떠한 요구사항도 부과하지 않습니다.: end note ]

마지막으로, "관찰 가능한 행동"의 정의에 관하여, 제1.9/8항은 다음과 같다.

적합 실장에 관한 최소한의 요건은 다음과 같습니다.

- 휘발성 객체에 대한 액세스는 추상 머신의 규칙에 따라 엄격하게 평가됩니다.

— 프로그램 종료 시 파일에 기록된 모든 데이터는 추상적 의미론에 따라 프로그램을 실행했을 때 발생할 수 있는 결과 중 하나와 동일해야 합니다.

- 인터랙티브 디바이스의 입력 및 출력 다이내믹스는 프로그램이 입력을 대기하기 전에 프롬프트 출력이 실제로 전달되도록 해야 합니다.인터랙티브 디바이스를 구성하는 것은 구현 정의입니다.

이러한 동작을 프로그램의 관찰 가능한 동작이라고 합니다.[주의:추상적 의미론과 실제 의미론 사이의 보다 엄격한 대응은 각 구현에 의해 정의될 수 있다.: end note ]


이 규칙이 적용되지 않는 경우가 있습니까?

내가 아는 한, "as-if" 규칙의 유일한 예외는 복사/이동 생략이며, 이는 클래스의 복사 생성자, 이동 생성자 또는 소멸자에 부작용이 있더라도 허용됩니다.이에 대한 정확한 조건은 문단 12.8/31에 명시되어 있다.

특정 조건이 충족되면 복사/이동 작업을 위해 선택된 생성자/또는 개체에 대한 소멸자가 부작용이 있더라도 구현은 클래스 개체의 복사/이동 구성을 생략할 수 있습니다. [...]

C11에서는 규칙이 해당 이름으로 호출되지 않습니다.그러나 C는 C++와 마찬가지로 추상적인 기계로 동작을 정의합니다.as-if 규칙은 C11 5.1.2.3p4p6에 있습니다.

  1. 추상기계에서 모든 표현은 의미론에 의해 지정된 대로 평가된다.실제 구현에서는 그 값이 사용되지 않고 필요한 부작용이 발생하지 않는다고 추론할 수 있는 경우(함수를 호출하거나 휘발성 객체에 액세스하여 발생하는 부작용 포함)에는 표현의 일부를 평가할 필요가 없습니다.

  2. [...]

  3. 적합 실장에 관한 최소한의 요건은 다음과 같습니다.

    • 에의 액세스volatile오브젝트는 추상 머신의 규칙에 따라 엄격하게 평가됩니다.
    • 프로그램 종료 시 파일에 기록된 모든 데이터는 추상적 의미론에 따라 프로그램을 실행한 결과와 동일해야 한다.
    • 상호작용 장치의 입력 및 출력 역학은 7.21.3에 명시된 대로 이루어져야 한다.이러한 요건의 목적은 프로그램 입력을 대기하기 전에 프롬프트메시지가 실제로 표시되도록 가능한 한 빨리 버퍼링되지 않은 출력 또는 회선 버퍼링되지 않은 출력을 표시하는 것입니다.

     

    이것은 프로그램의 관찰 가능한 동작입니다.

C, C++, Ada, Java, SML...에서는 프로그램의 동작(보통 I/O포트에서의 일련의 상호작용에 표시됨)을 기술함으로써 잘 지정된 프로그래밍 언어에는 명확한 as-if 규칙이 없습니다.

다른 규칙의 예로는 0으로 나누면 예외가 발생하거나(Ada, Caml), 늘 디레퍼런스가 예외 발생(Java)하는 규칙이 있습니다.규칙을 변경하여 다른 언어를 지정할 수 있습니다(일부 사용자는 이를 "변역(*)"이라고 부릅니다).명확한 문법규칙이 구문구성을 커버하는 것처럼 프로그래밍 언어의 고유한 용도를 특정하는 규칙이 있습니다.

(*) 일부 언어학자에 따르면 방언은 "군"이 있는 언어입니다.그런 맥락에서, 그것은 위원회와 컴파일러 편집자의 특정 산업이 없는 프로그래밍 언어를 의미할 수 있다.

as-if 규칙은 구별되는 규칙이 아닙니다.특정 프로그램을 망라하지 않으며 논의, 삭제, 변경이 가능한 규칙도 아닙니다.이른바 "규칙"은 단순히 프로그램 의미론이 정의되어 있으며 프로그램 실행의 가시적인 상호 작용의 관점에서만 이식성(범용)으로 정의될 수 있습니다.'거짓말'의 세계와 함께요

외부 세계는 I/O 인터페이스(stdio), GUI, 순수 응용 언어의 결과 값을 출력하는 인터랙티브 인터프리터일 수도 있습니다.C 및 C++에는 휘발성 객체에 대한 (명시적으로 지정된) 액세스가 포함되어 있습니다.이는 특정 포인트의 일부 객체가 ABI(Application Binary Interface)에 따라 메모리에 정확하게 표현되어야 한다는 것을 나타내는 또 다른 방법입니다.ABI는 명시적으로 언급하지 않습니다.

실행 트레이스(visible 또는 observable behavior라고도 함)의 정의는 "as-if rule"이 의미하는 바를 정의합니다.as-if 규칙은 그것을 설명하려고 하지만, 그렇게 함으로써, 그것은 구현에 더 많은 여유를 주는 추가적인 의미 규칙이라는 표현을 주기 때문에 사물을 명확히 하는 것보다 더 많은 사람들을 혼란스럽게 합니다.

요약:.

  • 이른바 "as-if 규칙"은 구현에 대한 어떠한 제약도 완화하지 않습니다.
  • 가시적인 동작(외부 세계와의 상호작용을 위해 구성된 실행 트레이스)으로 지정된 프로그래밍 언어에서 as-if 규칙을 삭제하여 고유한 사투리를 얻을 수 없습니다.
  • as-if 규칙은 가시적인 동작으로 지정되지 않은 프로그래밍 언어에 추가할 수 없습니다.

언급URL : https://stackoverflow.com/questions/15718262/what-exactly-is-the-as-if-rule

반응형