C 언어와의 상호 운용
C 언어와의 상호 운용 (Interoperability with C)
Fortran 코드에서 C 라이브러리 함수를 부르거나, 반대로 C 코드에서 Fortran으로 작성한 프로시저를 불러야 할 때가 있죠? Fortran 2003부터는 C 언어와 상호 운용(interoperable)할 수 있는 표준화된 방법이 마련되어 있어요. 이 글에서는 그 핵심 개념을 살펴볼게요.
본문
BIND(C) 속성
Fortran 2003(ISO/IEC 1539-1:2004(E))부터 C 언어(ISO/IEC 9899:1999)와 상호 운용할 수 있는 프로시저, 파생 타입(derived type) 선언, 그리고 전역 변수를 생성하는 표준적인 방법이 도입됐어요. 여기서 핵심이 되는 게 BIND(C) 속성이에요.
BIND(C) 속성은 컴파일러에게 해당 심볼이 C와 상호 운용되어야 한다는 사실을 알려주는 역할을 해요. 이 속성이 붙으면 몇 가지 제약(constraint)도 함께 적용돼요. 그리고 C의 모든 기능이 Fortran에 대응하는 것은 아니라는 점을 기억해야 해요. 예를 들어 C의 부호 없는 정수(unsigned integer)나 가변 인자(variable number of arguments) 함수는 Fortran에 대응하는 개념이 없어요.
배열 차원의 차이
C와 Fortran을 연동할 때 가장 헷갈리기 쉬운 부분이 바로 배열이에요. 배열 차원의 순서가 C와 Fortran에서 반대로 되어 있고, 배열의 시작 인덱스도 달라요. C 배열은 항상 0부터 시작하는 반면, Fortran 배열은 기본적으로 1부터 시작하죠.
그래서 Fortran에서 A(n,m)으로 선언된 배열은 C에서 A[m][n]과 대응돼요. 그리고 Fortran의 A(i,j) 요소에 접근하는 것은 C의 A[j-1][i-1]에 접근하는 것과 같아요. 메모리에서 A(i,j)(C: A[j-1][i-1], i < n 가정) 다음에 오는 요소는 A(i+1,j)(C: A[j-1][i])예요.
상호 운용의 세부 주제들
C와의 상호 운용은 한 방향으로만 이루어지는 게 아니라 여러 측면으로 나뉘어요. 각각을 정리하면 다음과 같아요.
- Intrinsic Types — 기본 타입의 대응
- Derived Types and struct — 파생 타입과 구조체
- Interoperable Global Variables — 전역 변수
- Interoperable Subroutines and Functions — 서브루틴과 함수
- Working with C Pointers — C 포인터 다루기
- Further Interoperability of Fortran with C — 추가 상호 운용
- Generating C prototypes from Fortran — Fortran에서 C 프로토타입 생성
더 알아보기
- 기본 타입을 C 타입과 정확히 맞추는 방법은 Intrinsic Types 문서에서 확인할 수 있어요.
- 전역 변수를 C에서 접근 가능하게 만드는 방법은 Interoperable Global Variables 문서를 참고해 보세요.
- 함수와 서브루틴을 C와 연동하는 구체적인 예는 Interoperable Subroutines and Functions 문서에서 다뤄요.