Hollerith 상수 지원

Hollerith 상수 지원

포인터(?) 코드에서 쓰였던 옛날 방식인 Hollerith 상수를 GNU Fortran이 어떻게 지원하는지 설명하는 문서예요. 문자 상수를 숫자형 변수에 바이트 단위로 저장하던 초기 Fortran의 관례가 지금도 컴파일러에서 어떻게 동작하는지, 그리고 표준적인 대체 방법은 무엇인지를 함께 보여줘요.

출처: Hollerith constants support (The GNU Fortran Compiler)

본문

GNU Fortran은 대입, DATA 문, 함수·서브루틴 인자에서 Hollerith 상수를 지원해요. Hollerith 상수는 문자 개수를 나타내는 정수 상수가 앞에 붙고 그다음에 문자 H 또는 h가 오는 문자열로 작성되며, 숫자(INTEGER, REAL, COMPLEXLOGICAL·CHARACTER 변수에 바이트 단위로 저장돼요. 이 상수는 저장되는 변수의 크기에 맞춰 공백으로 채워지거나 잘려요.

Hollerith 상수의 유효한 사용 예:

complex*16 x(2)
data x /16Habcdefghijklmnop, 16Hqrstuvwxyz012345/
x(1) = 16HABCDEFGHIJKLMNOP
call foo (4h abc)

Hollerith 상수 예시:

integer*4 a
a = 0H        ! Invalid, at least one character is needed.
a = 4HAB12    ! Valid
a = 8H12345678 ! Valid, but the Hollerith constant is truncated.
a = 3Hxyz     ! Valid, but the Hollerith constant is padded.

일반적으로 Hollerith 상수는 Fortran 77에 CHARACTER 변수가 도입되기 전, 초기 Fortran 컴파일러에서 문자열을 다루는 기초적인 수단으로 쓰였어요. 그런 경우의 표준 준수 대응책은 프로그램을 제대로 된 문자 문자열을 쓰도록 바꾸는 거예요. 다만 가끔은 특정 바이트 시퀀스로 숫자 변수를 초기화하려는 의도가 명확한 경우도 있는데, 그때는 TRANSFER 문으로 같은 결과를 얻을 수 있어요.

integer(kind=4) :: a
a = transfer ("abcd", a)   ! equivalent to: a = 4Habcd

-fdec 옵션을 쓰면 Hollerith 상수의 지원이 비교(comparison)까지 확장돼요:

integer*4 a
a = 4hABCD
if (a .ne. 4habcd) then
  write(*,*) "no match"
end if

지원되는 타입은 숫자(INTEGER, REAL, COMPLEX)와 CHARACTER예요.

더 알아보기

  • Hollerith 상수는 표준 Fortran 77 이전의 유산이에요. 새 코드에서는 CHARACTER 문자열이나 TRANSFER를 쓰는 게 권장돼요.
  • -fdec(DEC 호환 모드)를 켜면 비교 연산에서도 Hollerith 상수를 쓸 수 있어요.
  • 잘림과 패딩은 저장 변수의 크기를 기준으로 일어나므로, 상수 길이와 변수 타입의 크기를 항상 함께 고려해야 해요.