논리식의 평가
논리식의 평가
.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은 최종 결과에 기여하지 않는 논리식 부분을 평가하지 않도록 최적화할 수 있고, 그로 인해 함수 호출이 생략될 수 있다는 점을 경고로 알려줘요. 표준이 단락 평가를 강제하지 않기 때문에 다른 컴파일러로 옮길 때는 이런 동작 차이를 염두에 두는 게 좋아요.
더 알아보기
- GNU Fortran 컴파일러 특성 (Compiler Characteristics): 컴파일러가 표현식·변수를 처리하는 다양한 특성을 다뤄요.
- 에러 및 경고 옵션 (Options to Request or Suppress Errors and Warnings):
-Wfunction-elimination을 포함한 경고 옵션들의 목록이에요.