이름 짓기 규약
이름 짓기 규약 (Naming conventions)
Fortran 소스에서 foo라고 쓴 함수가, 컴파일된 오브젝트 파일과 링커 심볼 테이블에서는 실제로 어떤 이름으로 등장하는지 궁금한 적 있나요? 기본적으로는 소문자로 바뀌고 밑줄이 붙지만, 몇 가지 옵션과 대상 시스템에 따라 달라져요. 이 규약을 이해하면 다른 언어와 링크할 때 헷갈리지 않아요.
본문
Fortran 표준에 따르면 유효한 Fortran 이름은 A부터 Z, a부터 z, 숫자 0부터 9, 그리고 밑줄(_)로 구성돼요. 단, 이름은 문자(letter)로만 시작해야 한다는 제약이 있어요.
벤더 확장으로 달러 기호($)는 -fdollar-ok 옵션과 함께라면 추가로 허용돼요. 다만 $는 첫 글자가 될 수 없고, 대상 시스템이 이를 지원할 때만 쓸 수 있어요.
기본적으로 절차 이름은 Fortran 이름을 소문자로 바꾼 뒤 밑줄(_)을 덧붙인 형태가 돼요. -fno-underscoring을 쓰면 밑줄이 붙지 않고, -fsecond-underscoring을 쓰면 밑줄이 두 개 붙어요.
-fno-underscoring은 이름에 변조가 거의 없어서 C 쪽과 이름이 그대로 맞아떨어져 편리하지만, 밑줄로 끝나는 Fortran 이름이 C 이름과 충돌할 위험이 있어요. 반대로 -fsecond-underscoring이 필요한 상황은, 밑줄 하나를 이미 쓴 이름(foo_bar 같은)과 안 쓴 이름(foobar_ 같은)이 겹치는 것을 구분하고 싶을 때예요.
대상 시스템과 호출 규약(calling convention)에 따라 절차 이름에 추가 장식이 붙을 수도 있어요. 예를 들어 32비트 Windows에서 stdcall 호출 규약을 쓰면, 이름 뒤에 @와 정수 숫자가 덧붙여져요. 호출 규약을 바꾸는 방법은 GNU Fortran Compiler Directives 절을 참고하면 돼요.
공통 블록(common block)에도 같은 규약이 적용돼요. 즉 기본적으로 소문자로 바꾼 Fortran 이름 뒤에 밑줄이 붙어요. 빈 공통 블록(blank common)은 __BLNK__라는 이름을 가져요.
모듈의 명세 공간(specification space)에 선언된 절차와 변수는 이름이 이렇게 만들어져요. __ 뒤에 소문자 모듈 이름, _MOD_, 그리고 소문자 Fortran 이름이 붙는 형태예요. 이때는 밑줄이 마지막에 추가되지 않는다는 점을 주의해야 해요.
! 예: module mymod 안의 proc 이름
! → __mymod_MOD_proc
이자나 기호 정렬을 신경 쓰기보다는, "모듈 안 심볼은 __<모듈>_MOD_<이름> 형태"라는 패턴만 기억하면 다른 언어나 디버거에서 심볼을 찾을 때 크게 도움이 돼요.
더 알아보기
-fno-underscoring,-fsecond-underscoring옵션- 인자 전달 규약(Argument passing conventions)
- GNU Fortran 컴파일러 지시문