Fortran 방언을 제어하는 컴파일 옵션
Fortran 방언을 제어하는 컴파일 옵션
컴파일러가 받아들이는 Fortran 문법의 세부 사항을 조정하는 옵션들을 모아 둔 문서예요. 소스 형태(자유 형식/고정 형식)를 정하는 것부터, DEC 호환 모드, OpenMP·OpenACC, 정수·실수 기본 타입 폭 변경까지 컴파일러의 '성격'을 바꾸는 스위치라 보면 돼요. 각 옵션 이름은 원문 그대로 두고 설명만 번역했어요.
본문
다음 옵션들은 컴파일러가 받아들이는 Fortran 방언(dialect)의 세부 사항을 제어해요.
-
-ffree-form/-ffixed-form— 소스 파일에 쓰이는 레이아웃을 지정해요. 자유 형식(free form)은 Fortran 90에서 도입됐고, 고정 형식(fixed form)은 옛날 Fortran 프로그램에서 전통적으로 쓰였어요. 둘 다 지정하지 않으면 파일 확장자로 소스 형식을 판단해요. -
-fall-intrinsics— 모든 내장 프로시저(내장 확장 포함)를 받아들이게 해요.-std=와 함께 쓰면 표준 준수를 유지하면서도gfortran이 제공하는 전체 내장 프로시저에 접근할 수 있어서 유용해요. 덕분에-Wintrinsics-std는 무시되고, 내장과 같은 이름의 사용자 정의 프로시저는 명시적으로EXTERNAL로 선언하지 않는 한 호출되지 않아요. -
-fallow-argument-mismatch— 일부 코드는 외부 프로시저 호출에서 인자 타입이 정의와 맞지 않거나 호출끼리 서로 맞지 않는 경우가 있어요. 그런 코드는 비표준이라 보통 오류로 표시되는데, 이 옵션은 오류를 경고로 낮춰줘요. 이 경고는-w로 모든 경고를 끄지 않으면 없앨 수 없고, 인자 하나당 한 번만 표시돼요.-std=legacy를 쓰면 이 옵션이 함께 적용돼요.이 옵션을 쓰는 건 강력히 권장하지 않아요. 서로 다른 타입의 인자를 허용하는 표준 준수 코드는 명시적 인터페이스와
TYPE(*)로 만들 수 있어요. -
-fallow-invalid-boz— BOZ 리터럴 상수는 표준 준수 Fortran에서 제한된 문맥에서만 나타날 수 있어요. 이 옵션은 오류 조건을 경고로 낮추고, 표준이 금지하는 위치에도 BOZ 리터럴 상수를 쓸 수 있게 해요. -
-fd-lines-as-code/-fd-lines-as-comments— 고정 형식 소스에서d나D로 시작하는 줄을 특별 취급해요.-fd-lines-as-code를 주면 첫 열에 공백이 있는 것처럼 취급하고,-fd-lines-as-comments를 주면 주석 줄로 취급해요. -
-fdec— DEC 호환 모드예요. 옛 컴파일러(예: DEC)의 기본 동작을 흉내 내는 확장·기능을 켜요. 이런 기능은 비표준이라 가급적 피해야 해요. GNU Fortran의 구현 상세는 전체 문서를 참고하세요.이 스위치가 함께 켜는 플래그는 다음과 같아요:
-fdollar-ok -fcray-pointer -fdec-char-conversions -fdec-structure -fdec-intrinsic-ints -fdec-static -fdec-math -fdec-include -fdec-blank-format-item -fdec-format-defaults만약
-fd-lines-as-code/-fd-lines-as-comments가 지정되지 않았다면,-fdec는-fd-lines-as-comments도 함께 설정해요. -
-fdec-char-conversions— 문자 타입이 아닌 변수에 대한 대입과DATA문에서 문자 리터럴을 쓸 수 있게 해요. -
-fdec-structure— DEC의STRUCTURE·RECORD와UNION·MAP, 그리고 멤버 구분자로 점('.')도 허용해요(%에 더해서). 호환용일 뿐이므로 가능하면 Fortran 90 파생 타입을 쓰는 게 좋아요. -
-fdec-intrinsic-ints— 기존 정수 함수의 B/I/J/K kind 변형(예:BIAND,IIAND,JIAND등)을 켜요. 내장 프로시저 전체 목록은 Intrinsic Procedures를 보세요. -
-fdec-math— 더 이상 동작하지 않는 플래그예요. 원래는COTAN이나 각도 단위 삼각 함수(예:TAND,ATAND등) 같은 예전 수학 내장을 켜서 옛 코드와 호환하려는 용도였어요. 지금은 이 삼각 함수들이 Fortran 2023의 일부거나 GNU 확장이라서 이 옵션은 쓸모가 없어요. -
-fdec-static— DEC 스타일의STATIC·AUTOMATIC속성을 켜서 변수·객체의 저장 기간을 명시적으로 지정하게 해요. -
-fdec-include—INCLUDE를 문(statement)으로도 해석하게 해요(줄 단위로만이 아니라). 문으로 해석되면INCLUDE가 한 줄에 있을 필요가 없고 줄 연속을 쓸 수 있어요. -
-fdec-format-defaults— 형식 지정자 'F', 'G', 'I'를 폭 지정자 없이 쓸 수 있게 해요. 이때 기본 폭이 사용돼요. -
-fdec-blank-format-item— 형식 지정 끝에 빈 형식 항목을 허용해요. 즉 마지막 쉼표 뒤에 아무것도 없어도 되게 해요. -
-fdollar-ok— 심볼 이름의 첫 글자가 아닌 위치에 '$'를 허용해요. '$'로 시작하는 심볼은 암묵적 타입 규칙이 벤더마다 달라 적용할 규칙이 불분명해서 거부돼요.IMPLICIT문에서 '$'를 쓰는 것도 거부돼요. -
-fbackslash— 문자열 리터럴에서 백슬래시를 단일 백슬래시 문자 대신 "C 스타일" 이스케이프 문자로 해석하게 바꿔요. 다음 조합이 확장돼요: '\a', '\b', '\f', '\n', '\r', '\t', '\v', '\\', '\0'이 각각 alert, backspace, form feed, newline, carriage return, horizontal tab, vertical tab, backslash, NUL ASCII 문자로 바뀌어요. 추가로 '\xnn', '\unnnn', '\Unnnnnnnn'(각 n은 16진수 자릿수)은 지정된 코드 포인트에 해당하는 유니코드 문자로 번역돼요. 그 외 '\'가 앞에 붙은 조합은 확장되지 않아요. -
-fmodule-private— 모듈 개체의 기본 접근성을PRIVATE로 설정해요. use로 연결된 개체는 명시적으로PUBLIC으로 선언하지 않으면 접근할 수 없어요. -
-ffixed-line-length-n— 고정 형식 줄에서 n 열 이후를 무시하게 해요. 그리고-fno-pad-source를 쓰지 않았다면 짧은 고정 형식 줄 끝에 그 길이만큼 공백이 채워진 듯 가정해요.n의 흔한 값으로는 72(표준이자 기본값), 80(카드 이미지), 132(일부 인기 컴파일러의 "extended-source" 옵션에 대응)가 있어요. n은 'none'이 될 수도 있는데, 이때는 줄 전체가 의미를 갖고 연속된 문자 상수에 줄을 채우는 암묵적 공백이 붙지 않아요.
-ffixed-line-length-0은-ffixed-line-length-none과 같은 뜻이에요. -
-fno-pad-source— 기본적으로 고정 형식 줄은 짧은 줄 끝에 공백이 채워진 것으로 가정하는데, 이 옵션을 쓰면 그렇게 하지 않아요.-ffixed-line-length-0,-ffixed-line-length-none,-fno-pad-source중 하나를 쓰면 연속된 문자 상수에 줄을 채우는 암묵적 공백이 붙지 않아요. -
-ffree-line-length-n— 자유 형식 줄에서 n 열 이후를 무시하도록 설정해요. 기본값은 132예요. n은 'none'이 될 수 있고 그 경우 줄 전체가 의미를 가져요.-ffree-line-length-0은-ffree-line-length-none과 같은 뜻이에요. -
-fmax-identifier-length=n— 허용되는 최대 식별자 길이를 지정해요. 흔한 값은 31(Fortran 95)과 63(Fortran 2003 이후)이에요. -
-fimplicit-none— 명시적IMPLICIT문으로 재정의하지 않는 한 암묵적 타입 지정을 허용하지 않게 해요. 모든 프로시저 시작에implicit none을 붙인 것과 같은 효과예요. -
-fcray-pointer— C 포인터와 유사한 기능을 제공하는 Cray 포인터 확장을 켜요. -
-fopenacc— 자유 형식 Fortran의 '!$acc'와 고정 형식 Fortran의 '!$acc', 'c$acc', '*$acc' OpenACC 지시문 처리를 켜요. 이 옵션을 주면 컴파일러는 OpenACC API v2.6(openacc.org)에 따라 가속 코드를 생성해요. 이 옵션은-pthread를 포함하므로-pthread를 지원하는 대상에서만 쓸 수 있어요.-fopenacc는-frecursive도 포함해요. -
-fopenmp— Fortran의 '!$omp' OpenMP 지시문 처리를 켜요. 조건부 컴파일 센티널 '!$'도 추가로 활성화해요. 고정 소스 형식에서는 센티널이 'c'나 '*'로 시작할 수도 있어요. 이 옵션을 주면 OpenMP API v4.5(openmp.org)에 따라 병렬 코드를 생성해요.-pthread를 포함하므로-pthread지원 대상에서만 쓸 수 있고,-fopenmp-simd와-frecursive도 포함해요. -
-fopenmp-allocators— '!$omp allocators'와 '!$omp allocate' 구조로 할당된 Fortran allocatable·포인터 변수의 할당·재할당·해제 처리를 켜요. 두 지시문 중 하나가 든 파일은-fopenmp에 더해 이 옵션으로 컴파일해야 해요. 또 OpenMP 할당자로 할당된 변수를 해제·재할당할 수 있는 모든 파일도 이 옵션으로 컴파일해야 해요. 여기엔 재할당이 일어날 수 있는 allocatable 변수로의 내장 대입과, 범위 종료·명시적 해제·'intent(out)'·allocatable 컴포넌트 해제 등으로 인한 해제가 포함돼요. 할당 상태를 바꾸지 않는 파일이나, 두 지시문으로 할당되지 않은 파생 타입 컴포넌트만 다루는 파일은 이 옵션이 필요 없어요. 일반 Fortran 할당자로 할당·해제된 이후의 변수를 다루는 파일도 마찬가지예요. -
-fopenmp-simd— OpenMP의simd,declare simd,declare reduction,assume,ordered,scan,loop지시문과,simd를 구성 요소로 하는 결합·복합 지시문을 '!$omp'로 처리하는 걸 켜요. 조건부 컴파일 센티널 '!$'도 활성화해요. 고정 소스 형식에서는 센티널이 'c'나 '*'로 시작할 수도 있어요. 다른 OpenMP 지시문은 무시돼요.-fopenmp를 추가로 지정하지 않으면loop영역은 지정된bind절과 무관하게 현재 task 영역에 묶여요. -
-fno-range-check— 컴파일 중 상수 표현식을 단순화한 결과의 범위 검사를 끄요. 예를 들어a = 1. / 0을 단순화할 때 GNU Fortran은 컴파일 타임 오류를 내는데, 이 옵션이 있으면 오류 없이a에+Infinity를 할당해요. 표현식 값이 [-HUGE():HUGE()] 범위를 벗어나면 상황에 따라-Inf나+Inf로 바꿔요. 마찬가지로DATA i/Z'FFFFFFFF'/는 대부분의 시스템에서 정수 오버플로를 일으키지만,-fno-range-check에서는 값이 "감싸져서"(wraps around)i가 -1로 초기화돼요. -
-fdefault-integer-8— 기본 정수·논리 타입을 8바이트 타입으로 설정해요.42같은 정수 상수의 kind에도 영향을 줘요.-finteger-4-integer-8과 달리, 명시적 kind 선언이 있는 변수는 승격하지 않아요. -
-fdefault-real-8— 기본 실수 타입을 8바이트 타입으로 설정해요.1.0같은 더블이 아닌 실수 상수의 kind에도 영향을 줘요. 가능하면DOUBLE PRECISION과1.d0같은 더블 실수 상수의 기본 폭을 16바이트로 승격해요.-fdefault-double-8을-fdefault-real-8과 함께 주면DOUBLE PRECISION과 더블 실수 상수는 승격되지 않아요.-freal-4-real-8과 달리, 명시적 kind 선언이 있는 변수는 승격하지 않아요. -
-fdefault-real-10— 기본 실수 타입을 10바이트 타입으로 설정해요.1.0같은 더블이 아닌 실수 상수의 kind에도 영향을 줘요. 가능하면DOUBLE PRECISION과1.d0의 기본 폭을 16바이트로 승격해요.-fdefault-double-8을 함께 주면 두 타입 모두 승격되지 않아요.-freal-4-real-10과 달리 명시적 kind 선언이 있는 변수는 승격하지 않아요. -
-fdefault-real-16— 기본 실수 타입을 16바이트 타입으로 설정해요.1.0같은 더블이 아닌 실수 상수의 kind에도 영향을 줘요. 가능하면DOUBLE PRECISION과1.d0의 기본 폭을 16바이트로 승격해요.-fdefault-double-8을 함께 주면 두 타입 모두 승격되지 않아요.-freal-4-real-16과 달리 명시적 kind 선언이 있는 변수는 승격하지 않아요. -
-fdefault-double-8—DOUBLE PRECISION타입과1.d0같은 더블 실수 상수를 8바이트 타입으로 설정해요. 이미 기본이면 아무것도 하지 않아요. 이 옵션은-fdefault-real-8,-fdefault-real-10,-fdefault-real-16이DOUBLE PRECISION과1.d0같은 더블 실수 상수를 16바이트로 승격하는 것을 막아요. -
-finteger-4-integer-8— 모든INTEGER(KIND=4)개체를INTEGER(KIND=8)로 승격해요.KIND=8을 쓸 수 없으면 오류를 내요. 이 옵션은 신중히 써야 하고 코드에 적합하지 않을 수도 있어요. 우려되는 영역으로는 외부 프로시저 호출,EQUIVALENCE·COMMON에서의 정렬, 제네릭 인터페이스, BOZ 리터럴 상수 변환, I/O가 있어요. 번역된 코드의 중간 표현을-fdump-tree-original로 만들어 확인하는 걸 권해요. -
-freal-4-real-8,-freal-4-real-10,-freal-4-real-16,-freal-8-real-4,-freal-8-real-10,-freal-8-real-16— 모든REAL(KIND=M)개체를REAL(KIND=N)으로 승격해요.REAL(KIND=N)을 쓸 수 없으면 오류를 내요.-freal-4-계열 플래그는 기본 실수 kind에도,-freal-8-계열 플래그는 배정밀도 실수 kind에도 영향을 줘요. 다른 실수 kind 타입은 이 옵션의 영향을 받지 않아요. 승격은 기본·배정밀도 kind의 실수 리터럴 상수와, 각각 kind 번호가 4 또는 8로 지정된 상수에도 적용돼요. 다만-fdefault-real-8,-fdefault-real-10,-fdefault-double-8은 기본·배정밀도 실수 kind에 대해 리터럴 상수든 kind 번호 없는 선언이든 우선해요.REAL(KIND=KIND(1.0))의 경우 리터럴이 승격된 뒤 결과가 다시 승격될 수 있음을 기억하세요. 이런 옵션은 신중히 써야 하고 코드에 적합하지 않을 수도 있어요. 우려 영역은 외부 프로시저 호출,EQUIVALENCE·COMMON정렬, 제네릭 인터페이스, BOZ 리터럴 상수 변환, I/O, 그리고kind=더미 인자에 값을 넘길 때 내장 프로시저 호출이에요.-fdump-fortran-original이나-fdump-tree-original로 확인하는 걸 권해요. 참고: 이 옵션들은 사용자 정의 파생 타입 I/O(DTIO)와 호환되지 않아요. -
-std=std— 프로그램이 준수해야 할 표준을 지정해요. 값은 'f95', 'f2003', 'f2008', 'f2018', 'f2023', 'gnu', 'legacy' 중 하나예요. 기본값은 'gnu'로, GNU Fortran이 지원하는 모든 확장을 포함한 최신 Fortran 표준의 상위 집합을 지정하되 새 코드에 권장되지 않는 구식 확장에는 경고를 줘요. 'legacy' 값은 경고 없이 같은 동작을 하므로 옛 비표준 프로그램에 유용할 수 있어요. 'f95', 'f2003', 'f2008', 'f2018', 'f2023' 값은 각각 해당 표준에 대한 엄격한 준수를 지정해요. 해당 언어 표준을 벗어난 모든 확장은 오류가 되고, 이후 표준에서 허용되지만 구식인 Fortran 77 기능에는 경고가 나요. 폐기된 옵션인-std=f2008ts는-std=f2018의 별칭으로 동작해요. 옛 gfortran 버전과의 하위 호환용으로만 남아 있으니 더 이상 쓰지 말아요.-std=f202y는-std=f2023의 별칭이며 Fortran 202y를 시험하기 위한 제안 기능을 켜요. Fortran 202y 표준이 발전함에 따라 구현이 바뀌거나 실험적 기능이 제거될 수 있어요. -
-ftest-forall-temp— 대부분의 forall 대입이 임시 변수를 쓰도록 강제해 테스트 커버리지를 높여요. -
-funsigned— 실험적인 unsigned 확장을 허용해요.
더 알아보기
- 자유 형식/고정 형식의 기본 판단은 파일 확장자로 이뤄져요.
.f,.for,.ftn등은 고정 형식,.f90,.f95,.f03등은 자유 형식으로 취급돼요. - 표준 준수가 중요하다면
-std=f2018또는-std=f2023을, 옛 코드를 그대로 돌려야 한다면-std=legacy를 고려해 보세요. - 병렬 처리는
-fopenmp, 가속기는-fopenacc로 시작해요. 둘 다-pthread와-frecursive를 동반해요.