Fortran과 C의 추가 상호운용
Fortran과 C의 추가 상호운용
Fortran 2003·2008의 C 상호운용을 확장한 기술 사양(Technical Specification)에 대해 GNU Fortran이 어떻게 구현했는지를 설명하는 짧은 문서예요. 기존 BIND(C)의 제약을 풀고, 추정 타입·추정 랭크 같은 새 변수를 C 함수와 주고받을 수 있게 된 내용이 핵심이에요.
출처: Further Interoperability of Fortran with C (The GNU Fortran Compiler)
본문
GNU Fortran은 기술 사양 ISO/IEC TS 29113:2012를 구현해요. 이 사양은 Fortran 2003과 Fortran 2008의 상호운용 지원을 확장한 것으로, 지금은 2018 Fortran 표준의 일부가 됐어요. 이 사양은 몇몇 제한과 제약을 없애는 것 외에도 추정 타입(assumed-type, TYPE(*)) 과 추정 랭크(assumed-rank, DIMENSION(..)) 변수를 추가하고, 추정 형태(assumed-shape)·추정 랭크·지연 형태(deferred-shape) 배열과 allocatable·포인터의 상호운용을 허용해요. 이런 타입의 객체는 <ISO_Fortran_binding.h> 헤더 파일에 선언된 표준 인터페이스를 가진 디스크립터(descriptor) 로 BIND(C) 함수에 전달돼요.
참고로 현재 GNU Fortran은 내부적으로 기술 사양에 명시된 배열 디스크립터(dope vector)를 쓰지 않아요. BIND(C) 속성이 없는 함수에서는 필드가 다른 배열 디스크립터를 사용하죠. BIND(C)로 표시된 함수에 넘기는 인자는 명시된 형태로 변환돼요. GNU Fortran의 내부 배열 디스크립터에 직접 접근해야 한다면 Chasm Language Interoperability Tools(chasm-interop.sourceforge.net)를 쓸 수 있어요.
더 알아보기
TYPE(*)와DIMENSION(..)는 C 함수에 다양한 타입·랭크의 배열을 한 번에 넘길 수 있게 해주는 핵심 기능이에요.- 상호운용 인터페이스는 공식적으로
<ISO_Fortran_binding.h>에 정의돼 있어서, C 쪽에서도 표준적인 방식으로 디스크립터를 다룰 수 있어요. - 내부 디스크립터 구조가 표준과 다르다는 점 때문에, GNU Fortran 내부 표현에 기대는 코드는 버전마다 바뀔 수 있음에 유의해야 해요.