Fortran 방언을 제어하는 컴파일 옵션

Fortran 방언을 제어하는 컴파일 옵션

컴파일러가 받아들이는 Fortran 문법의 세부 사항을 조정하는 옵션들을 모아 둔 문서예요. 소스 형태(자유 형식/고정 형식)를 정하는 것부터, DEC 호환 모드, OpenMP·OpenACC, 정수·실수 기본 타입 폭 변경까지 컴파일러의 '성격'을 바꾸는 스위치라 보면 돼요. 각 옵션 이름은 원문 그대로 두고 설명만 번역했어요.

출처: Fortran Dialect Options (The GNU Fortran Compiler)

본문

다음 옵션들은 컴파일러가 받아들이는 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 — 고정 형식 소스에서 dD로 시작하는 줄을 특별 취급해요. -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·RECORDUNION·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-includeINCLUDE를 문(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 PRECISION1.d0 같은 더블 실수 상수의 기본 폭을 16바이트로 승격해요. -fdefault-double-8-fdefault-real-8과 함께 주면 DOUBLE PRECISION과 더블 실수 상수는 승격되지 않아요. -freal-4-real-8과 달리, 명시적 kind 선언이 있는 변수는 승격하지 않아요.

  • -fdefault-real-10 — 기본 실수 타입을 10바이트 타입으로 설정해요. 1.0 같은 더블이 아닌 실수 상수의 kind에도 영향을 줘요. 가능하면 DOUBLE PRECISION1.d0의 기본 폭을 16바이트로 승격해요. -fdefault-double-8을 함께 주면 두 타입 모두 승격되지 않아요. -freal-4-real-10과 달리 명시적 kind 선언이 있는 변수는 승격하지 않아요.

  • -fdefault-real-16 — 기본 실수 타입을 16바이트 타입으로 설정해요. 1.0 같은 더블이 아닌 실수 상수의 kind에도 영향을 줘요. 가능하면 DOUBLE PRECISION1.d0의 기본 폭을 16바이트로 승격해요. -fdefault-double-8을 함께 주면 두 타입 모두 승격되지 않아요. -freal-4-real-16과 달리 명시적 kind 선언이 있는 변수는 승격하지 않아요.

  • -fdefault-double-8DOUBLE PRECISION 타입과 1.d0 같은 더블 실수 상수를 8바이트 타입으로 설정해요. 이미 기본이면 아무것도 하지 않아요. 이 옵션은 -fdefault-real-8, -fdefault-real-10, -fdefault-real-16DOUBLE PRECISION1.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를 동반해요.