[C++] as-if rule - 소스에 적힌 순서대로 실행되지 않는 이유

as-if rule이란, 프로그램의 실행 결과가 변하지 않는다면 소스에 적혀있는 것이 아닌 다른 방법으로 실행하는 것을 허용하는 규칙을 말한다. 이러한 규칙을 as-if rule이라는 이름으로 부르는 것은 C++에서만 찾을 수 있지만, C를 비롯한 다른 언어에서도 이러한 부류의 최적화를 허용한다.

as-if rule을 허용하는 이유는 크게 두 가지로 보인다. 우선 컴파일러의 최적화를 방해하지 않기 위함이다. 만약, 표준 문서에서 적용할 수 있는 최적화 방법을 화이트 리스트로 관리한다면, 새로운 최적화 기법이 나왔을 때, 컴파일러가 이를 적용하기 위해서는 표준을 수정해야 한다. 하지만 표준에서 허용하지 않는 동작만 기술해두면 컴파일러 구현체에서 새로운 최적화를 구현하는데 조금 더 자유로울 수 있다.

두 번째 이유는 C++이 가정하는 abstract machine이 엄밀하게 정의되지 않았기 때문이다. 일반적으로 C++의 실행 타깃은 native processor다. 이 프로세서는 제조사에 따라서, 혹은 칩 아키텍처에 따라서 다른 특성을 가질 수 있는데, C++ 표준은 이때 실행할 프로세서의 종류나 특성을 한정 짓지 않는다. 두 번째 이유는 C++이 가정하는 abstract machine이 실행 타깃에 의존하는 형태로 정의되었기 때문이다. 이를 parameterized nondeterministic abstract machine이라고 한다. 구현체는 이 parameter를 정해 실제 abstract machine을 완성한다. C++이 abstract machine을 이렇게 복잡한 방식으로 정의하는 이유는 C++의 실행 타깃이 가상 머신이 아닌 native processor이기 때문이다. 이 프로세서는 아키텍처에 따라서 다른 특성을 가질 수 있다. 다양한 아키텍처를 지원하기 위해 C++ 표준은 실행할 프로세서의 특성을 한정 짓지 않는다. CPU 별로 메모리 오더, 레지스터 크기, 레지스터 개수 등이 전부 다르므로 가능한 최적화도 전부 다르다. 따라서 표준에서 어떤 최적화를 허용할지 명시할 수 없고 as-if rule이라는 이름으로 코드의 실행 결과를 바꾸지 않는 최적화를 전부 허용하도록 명시한 것이다.

댓글

  1. 잘 읽었고 제가 이해하는 바와 동일합니다.

    다만
    > abstract machine이 엄밀하게 정의되지 않았기 때문이다
    이 문장이 다소 오해를 일으킬 수 있어 보여요.

    > abstract machine이 타깃 아키텍쳐에 의존적으로 정의되지 않았기 때문이다
    로 표현하시는 것이 더 말씀하시는 바를 잘 전달할 듯 합니다.
    왜냐하면 엄밀하게 정의되었다 (formally defined)란 수학적으로 명료하고 모순 없이 정의되었다 라는 뜻으로 프로그래밍 언어에서 쓰이기 때문입니다.
    따라서 타깃 아키텍쳐에 의존적으로 정의되었더라도 엄밀하게 정의가 가능합니다.

    답글삭제
    답글
    1. 제안 감사합니다. C++ 표준 문서에서 말하는 parameterized nondeterministic abstract machine을 설명하기 위해 그런 표현을 썼는데 말씀하신 대로 엄밀하게 정의한다는 것은 formally defined의 번역으로 많이 사용되기 때문에 오해의 여지가 있을 것 같네요. parameterized nondeterministic abstract machine이 C++ 표준문서에만 쓰이는 용어라서, 가능하면 쓰고 싶지 않아 다르게 표현해보려고 했는데 실패한 것 같네요. 그냥 이 단어를 사용해야 의미 전달이 잘 될 것 같아서 문장을 수정했습니다.

      삭제

댓글 쓰기

이 블로그의 인기 게시물

[MongoDB] ObjectId에 대해서

read-writers lock - 공유 자원 접근하기

[C++] enum class - 안전하고 쓰기 쉬운 enum