정수 내장 함수의 타입 변형

정수 내장 함수의 타입 변형

오래된 DEC 계열 프로그램을 다루다 보면, 똑같은 내장 함수가 앞글자만 달라진 이름으로 여럿 등장하는 걸 보게 돼요. 마치 실수 함수에서 DC 접두사를 붙여 입출력 타입을 지정하듯, 정수 함수에서도 B/I/J/K 접두사로 정수 타입을 구분하는 방식이에요. GNU Fortran이 이 호환성을 어떻게 지원하는지 함께 볼게요.

출처: Type variants for integer intrinsics

본문

실수 함수에서 DC 접두사가 입력·출력 타입을 지정하는 것과 비슷하게, GNU Fortran은 DEC 프로그램과의 호환성을 위해 정수 함수에 B/I/J/K 접두사를 제공해요. 각 접두사가 뜻하는 타입은 다음과 같아요.

B - INTEGER(kind=1)
I - INTEGER(kind=2)
J - INTEGER(kind=4)
K - INTEGER(kind=8)

이 기능은 -fdec-intrinsic-ints 플래그로 켤 수 있어요. 접두사 버전이 존재하는 내장 함수와 그 형태는 Intrinsic Procedures 항목에서 따로 표시돼요. 지원되는 내장 함수 전체 목록은 아래 표에 정리되어 있어요.

| Intrinsic | B | I | J | K | | ABS — Absolute value | BABS | IIABS | JIABS | KIABS | | BTEST — Bit test function | BBTEST | BITEST | BJTEST | BKTEST | | MOD — Remainder function | BMOD | IMOD | JMOD | KMOD | | NOT — Logical negation | BNOT | INOT | JNOT | KNOT | | REAL — Convert to real type | -- | FLOATI | FLOATJ | FLOATK |

표를 보면 패턴이 금방 보여요. 예를 들어 절댓값을 구하는 ABSBABS(1바이트), IIABS(2바이트), JIABS(4바이트), KIABS(8바이트)로 나뉘죠. 특이하게 REAL은 1바이트 버전이 없어서 --로 표시되어 있고, 2·4·8바이트가 각각 FLOATI, FLOATJ, FLOATK예요.

이 방식 덕분에 특정 정수 크기를 명시적으로 다루던 옛 코드를 그대로 컴파일할 수 있어요. 다만 기본적으로 꺼져 있는 비표준 확장이니, 꼭 필요한 코드에서만 -fdec-intrinsic-ints를 켜는 편이 좋아요.

더 알아보기

  • -fdec-intrinsic-ints 는 DEC 호환 계열 옵션 중 하나예요. 이 옵션을 붙여야 접두사 버전이 활성화돼요.
  • 다른 DEC 호환 확장(예: STRUCTURE/RECORD, UNION/MAP)도 비슷하게 플래그로 제어되는데, 각각 용도가 달라요.
  • 어떤 내장 함수에 접두사 버전이 있는지 확실히 보려면 GNU Fortran 매뉴얼의 Intrinsic Procedures 항목을 같이 참고하면 좋아요.