2014-07-26 3 views
1

나는 Fortran과 C 언어로 프로그래밍을하고 있는데, C 전처리 기는 전처리 상수로 코드를 추가하거나 숨기는 유연성이 꽤 멋지다고 생각한다. Fortran에서이 작업을 수행하는 방법을 모르지만 궁금합니다. Fortran 컴파일러가 컴파일 타임에 제거 할 수있는 코드를 감지합니까?Fortran은 도달 할 수없는 분기를 최적화합니까?

program test_branch 
    implicit none   

    logical, parameter :: echo = .false. 
    integer :: n, sum 

    sum = 0 

    do n=1,100 

     sum = sum + n**2 

     if (echo) then 
      print *, "Sum:", sum 
     end if 

    end do 

end program test_branch 

는 에코의 값은 변경하지 않습니다,하지만 컴파일러는 이것을 실현하지 않는 경우, 그것은 여전히 ​​분기마다 검사뿐만 아니라 포함됩니다

예를 들어이 걸릴 실행 불가능한 코드. 분명히 이것은 분기 예측과 관련해서는 큰 차이가 아니지만 그와 같은 표현식을 추가 할 수 있고 문자 그대로 비용이 들지 않는지 궁금합니다. 이 작업을 수행하는 최적화 설정이 있습니까? 아니면 기본적으로 완료 될 수 있습니까?

+2

BTW 대부분의 Fortran 컴파일러에서 C 전 처리기를 사용할 수 있습니다. –

+2

'gcc' /'gfortran'의 경우 컴파일러 플래그'-fdump-tree-optimized'로 최적화 된 중간 코드를 출력 할 수 있습니다. – Stefan

답변

3

Fortran 및 C 컴파일러는 모두 데드 코드를 제거하여 최적화 할 수 있지만 반드시 그렇게 할 필요는 없습니다.

최적화는 컴파일러 문제입니다. 언어 스펙은 최적화가 할 수있는 것과 수행 할 수없는 것만 알려줍니다. 두 컴파일러가 다른 프런트 엔드하지만 일반적인 중간 엔드 및 공통 백엔드이 있기 때문에

당신이 (C 코드 즉, 포트란 코드에 대한 gfortrangcc) GCC를 사용하는 경우, 최적화, 종종 동일합니다. 그들의 최적화는 Fortran과 C에서 동일한 알고리즘을 코딩하는 경우 매우 유사한 내부 표현에서 작동합니다.

그리고 GCC는 요청하지 않으면 최적화하지 않습니다. -Wall -O2gcc 또는 gfortran 컴파일러 옵션으로 전달하려고합니다.

+1

@Stefan과'gfortran -O2'에서 제안한 것처럼'-fdump-tree-optimized'로 생성 된 코드를 보았습니다. 보고있는 것은 아름답습니다. 죽은 가지가 제거 될뿐만 아니라 사각형이 n * n으로 대체됩니다. 이 옵션은 모든 종류의 질문에 답합니다. '컴파일러는 X를합니까?' – bijancn

관련 문제