논리식의 평가

논리식의 평가

.AND..OR.로 이어진 논리식에서, 결과가 이미 정해졌다면 나머지 함수 호출은 정말 실행될까요? Fortran 표준이 이에 대해 어떻게 말하는지, 그리고 GNU Fortran이 어떤 식으로 동작하는지 이 장에서 설명할게요.

출처: Evaluation of logical expressions (The GNU Fortran Compiler)

본문

Fortran 표준은 최종 결과에 기여하지 않는 표현식의 일부를 컴파일러가 평가하지 않아도 된다고 요구하지 않아요. 특히 .AND..OR. 연산자를 가진 논리식에서, GNU Fortran은 그 없이도 표현식 결과를 확정할 수 있다면 함수 호출(불순(impure) 함수에 대한 호출까지도)을 최적화로 제거해요. 하지만 모든 컴파일러가 그렇게 하는 건 아니고, 그런 최적화가 프로그램 흐름과 이후 결과를 바꿀 수도 있기 때문에, GNU Fortran은 그런 상황에 대해 -Wfunction-elimination 플래그로 경고를 내보내요.

즉, 논리식의 단락 평가(short-circuit)로 인해 어떤 함수가 호출되지 않을 수 있다는 점을 컴파일러가 최적화할 수 있지만, 이는 프로그램의 부수 효과를 바꿀 위험이 있으니 경고를 통해 알려주는 거예요.

한 가지 짚고 넘어갈 점은, 이런 최적화가 일어나는 조건이 결과가 이미 확정된 경우라는 거예요. 예를 들어 a .OR. f()에서 a가 참이라면 f()의 값과 무관하게 전체 결과가 참이 되므로, 컴파일러는 f() 호출을 없앨 수 있어요. 상태를 바꾸거나 출력을 내는 부수 효과를 가진 불순 함수를 그렇게 제거하면 프로그램의 동작이 달라질 수 있어요. 그런 잠재적 변화를 개발자가 알 수 있도록 GNU Fortran은 -Wfunction-elimination 경고를 켜 놓을 수 있어요. 이 경고는 -Wextra에 포함돼요.

정리하면, GNU Fortran은 최종 결과에 기여하지 않는 논리식 부분을 평가하지 않도록 최적화할 수 있고, 그로 인해 함수 호출이 생략될 수 있다는 점을 경고로 알려줘요. 표준이 단락 평가를 강제하지 않기 때문에 다른 컴파일러로 옮길 때는 이런 동작 차이를 염두에 두는 게 좋아요.

더 알아보기