Fortran 방언 옵션 — gfortran의 표준·문법 조정
Fortran 방언 옵션 — gfortran의 표준·문법 조정
컴파일할 때 어떤 Fortran 문법을 받아들일지, 확장 기능을 얼마나 켤지는 옵션으로 조정할 수 있어요. "예전 코드를 그대로 컴파일해야 한다"든 "표준을 엄격히 지키고 싶다"든 하는 요구가 다를 테니, gfortran이 제공하는 방언(dialect) 옵션을 하나씩 살펴볼게요.
본문
아래 옵션들은 컴파일러가 받아들이는 Fortran 방언의 세부 사항을 제어해요.
-ffree-form / -ffixed-form
소스 파일에 쓰인 배치(layout)를 지정해요. 자유 형식(free form) 배치는 Fortran 90에서 도입됐고, 고정 형식(fixed form)은 예전 Fortran 프로그램에서 전통적으로 쓰였어요. 두 옵션 중 아무것도 지정하지 않으면 파일 확장자로 소스 형식을 결정합니다.
-fall-intrinsics
모든 내장 함수(내장 프로시저)를 GNU 특유 확장까지 포함해 받아들이도록 해요. -std=와 함께 쓰면 표준 준수는 강제하면서도 gfortran이 제공하는 전체 내장 함수에는 접근할 수 있어 유용해요. 결과적으로 -Wintrinsics-std는 무시되고, 내장 함수와 같은 이름의 사용자 정의 프로시저는 명시적으로 EXTERNAL로 선언하지 않는 한 호출되지 않아요.
-fallow-argument-mismatch
일부 코드는 외부 프로시저 호출에서 호출과 프로시저 정의 사이, 또는 서로 다른 호출끼리 인자가 어긋나는 경우가 있어요. 그런 코드는 표준에 맞지 않아 보통 오류로 표시되죠. 이 옵션은 오류를 경고로 낮추고, 그 경고는 -w로 모든 경고를 끄지 않는 한 끌 수 없어요. 경고는 인자 하나당 한 번만 표시됩니다. -fallow-argument-mismatch는 -std=legacy에 포함됩니다.
이 옵션 사용은 강력히 권장하지 않아요. 명시적 인터페이스와 TYPE(*)을 쓰면 서로 다른 타입의 인자를 받는 표준 준수 코드를 짤 수 있거든요.
-fallow-invalid-boz
BOZ 리터럴 상수는 표준 준수 Fortran에서 제한된 문맥에서만 쓸 수 있어요. 이 옵션은 오류 조건을 경고로 낮춰서, Fortran 표준이 그 사용을 금지하는 곳에서도 BOZ 리터럴 상수가 나타날 수 있게 해줍니다.
-fd-lines-as-code / -fd-lines-as-comments
고정 형식 소스에서 d 또는 D로 시작하는 줄에 대한 특별 처리를 켜요. -fd-lines-as-code를 주면 그 줄을 첫 열이 공백인 것처럼 취급하고, -fd-lines-as-comments를 주면 주석 줄로 취급합니다.
-fdec
DEC 호환 모드예요. 예전 컴파일러(예: DEC)의 기본 동작을 흉내 내는 확장과 기능을 켭니다. 이런 기능은 비표준이라 되도록 피해야 해요. 이 스위치로 켜지는 다른 플래그들은 다음과 같아요.
-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
비문자 변수에 대한 배정(assignment)과 DATA 문에서 문자 리터럴을 쓸 수 있게 해줘요.
-fdec-structure
DEC의 STRUCTURE와 RECORD, 그리고 UNION, MAP, 그리고 멤버 구분자로서의 점(.)(%에 더하여)을 켜요. 호환용으로만 제공되며, 가능하면 Fortran 90 유도형(derived type)을 쓰는 게 좋아요.
-fdec-intrinsic-ints
기존 정수 함수의 B/I/J/K kind 변형(예: BIAND, IIAND, JIAND 등)을 켜요. 내장 함수의 전체 목록은 Intrinsic Procedures 문서를 참고해요.
-fdec-math
구식(obsolete) 플래그예요. 이 옵션의 목적은 COTAN, 각도 단위 삼각 함수(예: TAND, ATAND 등) 같은 예전 수학 내장 함수를 예전 코드와의 호환을 위해 켜는 것이었지만, 더 이상 작동하지 않아요. 삼각 함수들은 이제 Fortran 2023의 일부이거나 GNU 확장이에요.
-fdec-static
DEC 스타일의 STATIC, AUTOMATIC 속성을 켜서 변수와 다른 객체의 저장(스토리지)을 명시적으로 지정할 수 있게 해줘요.
-fdec-include
INCLUDE를 행이 아니라 문(statement)으로도 파싱할 수 있게 해줘요. 문으로 파싱되면 INCLUDE는 한 줄에 있을 필요가 없고 줄 연속(continuation)을 쓸 수 있어요.
-fdec-format-defaults
포맷 지정자 F, G, I를 폭 지정자 없이 쓸 수 있게 해줘요. 대신 기본 폭을 사용합니다.
-fdec-blank-format-item
포맷 지정의 끝에 빈 포맷 항목(즉 마지막 쉼표 뒤에 아무것도 없는 것)을 허용해요.
-fdollar-ok
심볼 이름에서 첫 글자가 아닌 위치에 $를 쓸 수 있게 해줘요. $로 시작하는 심볼은 거부되는데, 벤더마다 암시적 타입 규칙을 다르게 구현해서 어떤 규칙을 적용할지 불분명하기 때문이에요. IMPLICIT 문에서 $를 쓰는 것도 거부돼요.
-fbackslash
문자열 리터럴에서 백슬래시의 해석을 단일 백슬래시 문자에서 "C 스타일" 이스케이프 문자로 바꿔요. \a, \b, \f, \n, \r, \t, \v, \\, \0은 각각 ASCII 문자 alert, backspace, form feed, newline, carriage return, horizontal tab, vertical tab, backslash, NUL로 확장됩니다. 추가로 \xnn, \unnnn, \Unnnnnnnn(각 n은 16진수 자릿수)은 해당 코드 포인트에 대응하는 유니코드 문자로 번역돼요. `가 앞에 붙은 문자의 다른 모든 조합은 확장되지 않습니다.
-fmodule-private
모듈 엔터티의 기본 접근성을 PRIVATE로 설정해요. use로 연결된 엔터티는 명시적으로 PUBLIC으로 선언하지 않는 한 접근할 수 없어요.
-ffixed-line-length-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`
소스 파일의 일반적인 자유 형식 줄에서 무시되는 열 위치 이후의 문자를 설정해요. 기본값은 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 지시문 처리를 켜요. -fopenacc를 지정하면 컴파일러는 OpenACC Application Programming Interface v2.6(https://www.openacc.org)에 따라 가속 코드를 생성해요. 이 옵션은 -pthread를 수반하므로 -pthread를 지원하는 대상에서만 지원되고, -frecursive도 수반해요.
-fopenmp
Fortran에서 !$omp OpenMP 지시문 처리를 켜요. 추가로 조건부 컴파일 센티널 !$도 켭니다. 고정 형식 소스에서는 센티널이 c나 *로 시작할 수도 있어요. -fopenmp를 지정하면 컴파일러는 OpenMP Application Program Interface v4.5(https://www.openmp.org)에 따라 병렬 코드를 생성해요. 이 옵션은 -pthread를 수반하므로 -pthread를 지원하는 대상에서만 지원됩니다. -fopenmp는 -fopenmp-simd와 -frecursive도 수반해요.
-fopenmp-allocators
!$omp allocators와 !$omp allocate 구조로 할당되는 Fortran allocatable·pointer 변수의 할당, 재할당, 해제 처리를 켜요. 두 지시문 중 어느 하나를 포함한 파일은 -fopenmp에 더해 이 옵션도 함께 컴파일해야 해요. 추가로, OpenMP allocator로 할당된 변수를 해제하거나 재할당할 수 있는 모든 파일은 이 옵션으로 컴파일해야 합니다. 여기에는 재할당이 일어날 수 있는 allocatable 변수로의 내장 배정과, 범위 끝, 명시적 해제, intent(out), allocatable 컴포넌트 해제 등으로 인한 해제가 포함돼요. 할당 상태를 바꾸지 않는 파일이나, 그 두 지시문으로 할당되지 않은 유도형 컴포넌트에만 관련된 파일은 이 옵션으로 컴파일할 필요가 없어요. 일반 Fortran allocator로 할당·해제된 후 그런 변수를 다루는 파일도 마찬가지예요.
-fopenmp-simd
Fortran에서 !$omp와 함께 OpenMP의 simd, declare simd, declare reduction, assume, ordered, scan, loop 지시문 및 simd를 구성 요소로 하는 결합·복합 지시문 처리를 켜요. 추가로 조건부 컴파일 센티널 !$도 켭니다. 고정 형식 소스에서는 센티널이 c나 *로 시작할 수도 있어요. 다른 OpenMP 지시문은 무시됩니다. -fopenmp가 추가로 지정되지 않으면 loop 영역은 지정된 bind 절과 무관하게 현재 태스크 영역에 바인딩돼요.
-fno-range-check
컴파일 중 상수 표현식 단순화 결과에 대한 범위 검사를 끄요. 예를 들어 GNU Fortran은 a = 1. / 0을 단순화할 때 컴파일 타임 오류를 내요. 이 옵션을 쓰면 오류 없이 a에 +Infinity 값이 배정됩니다. 표현식이 [-HUGE():HUGE()]의 해당 범위 밖 값으로 평가되면, 그 표현식은 상황에 맞게 -Inf 또는 +Inf로 교체돼요. 마찬가지로 DATA i/Z'FFFFFFFF'/는 대부분의 시스템에서 정수 오버플로를 일으키지만, -fno-range-check를 쓰면 값이 "감싸(wrap 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-real-8과 함께 -fdefault-double-8을 주면 DOUBLE PRECISION과 배정밀도 실수 상수는 승격되지 않아요. -freal-4-real-8과 달리 -fdefault-real-8은 명시적 kind 선언이 있는 변수를 승격시키지 않습니다.
-fdefault-real-10
기본 실수 타입을 10바이트 폭 타입으로 설정해요. 1.0 같은 비-배정밀도 실수 상수의 kind에도 영향을 줍니다. 가능하면 DOUBLE PRECISION과 1.d0 같은 배정밀도 실수 상수의 기본 폭을 16바이트로 승격시켜요. -fdefault-real-10과 함께 -fdefault-double-8을 주면 DOUBLE PRECISION과 배정밀도 실수 상수는 승격되지 않아요. -freal-4-real-10과 달리 -fdefault-real-10은 명시적 kind 선언이 있는 변수를 승격시키지 않습니다.
-fdefault-real-16
기본 실수 타입을 16바이트 폭 타입으로 설정해요. 1.0 같은 비-배정밀도 실수 상수의 kind에도 영향을 줍니다. 가능하면 DOUBLE PRECISION과 1.d0 같은 배정밀도 실수 상수의 기본 폭을 16바이트로 승격시켜요. -fdefault-real-16과 함께 -fdefault-double-8을 주면 DOUBLE PRECISION과 배정밀도 실수 상수는 승격되지 않아요. -freal-4-real-16과 달리 -fdefault-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가 있어요. 번역된 Fortran 코드의 중간 표현을 -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-real-16, -fdefault-double-8이 기본·배정밀도 실수 kind에 대해 우선하며, 실수 리터럴 상수와 kind 번호 없는 선언 모두에 적용돼요. REAL(KIND=KIND(1.0))의 경우 리터럴이 승격된 뒤 결과가 다시 승격될 수 있으니 주의해요. 이 옵션들은 신중히 써야 하고 여러분의 코드에 적합하지 않을 수도 있어요. 우려되는 영역으로는 외부 프로시저 호출, EQUIVALENCE 및/또는 COMMON의 정렬, 제네릭 인터페이스, BOZ 리터럴 상수 변환, I/O, 그리고 kind= 더미 인자에 값을 넘길 때의 내장 프로시저 호출이 있어요. -fdump-fortran-original 또는 -fdump-tree-original로 생성한 번역된 Fortran 코드의 중간 표현을 살펴보는 것을 권장합니다. 참고: 이 옵션들은 사용자 정의 유도형 I/O(DTIO)와 호환되지 않아요.
-std=std`
프로그램이 따르도록 기대되는 표준을 지정해요. 값은 f95, f2003, f2008, f2018, f2023, gnu, legacy 중 하나일 수 있어요. std의 기본값은 gnu로, GNU Fortran이 지원하는 모든 확장을 포함하는 최신 Fortran 표준의 상위 집합을 지정하지만, 새 코드에서 쓰기를 권장하지 않는 구식(obsolete) 확장에 대해서는 경고가 나옵니다. legacy 값은 동일하되 구식 확장에 대한 경고가 없어서, 예전의 비표준 프로그램에 유용할 수 있어요. f95, f2003, f2008, f2018, f2023 값은 각각 Fortran 95, 2003, 2008, 2018, 2023 표준에 대한 엄격한 준수를 지정하며, 관련 언어 표준을 벗어나는 모든 확장에 대해 오류가 나고, 허용되지만 이후 표준에서 구식인 Fortran 77 기능에 대해서는 경고가 나와요. 더 이상 쓰지 않는 옵션 -std=f2008ts는 -std=f2018의 별칭 역할을 해요. 이전 gfortran 버전과의 하위 호환을 위해서만 존재하며 더 이상 쓰면 안 됩니다. -std=f202y는 -std=f2023의 별칭 역할을 하며 Fortran 202y 테스트용 제안 기능을 켭니다. Fortran 202y 표준이 발전함에 따라 구현이 바뀌거나 실험적 새 기능이 제거될 수 있어요.
-ftest-forall-temp
대부분의 forall 배정이 임시(temporary)를 사용하도록 강제해서 테스트 커버리지를 높여요.
-funsigned
실험적인 부호 없는(unsigned) 확장을 허용해요.