다른 언어와의 상호 운용 옵션

다른 언어와의 상호 운용 옵션 (Interoperability Options)

Fortran으로 작성한 코드를 C 언어와 연동해야 할 때가 있죠? gfortran에는 이렇게 다른 언어와 상호 운용(interoperability)할 수 있도록 도와주는 명령행 옵션이 따로 준비되어 있어요. 이 글에서는 바로 그 옵션들, 특히 C 프로토타입을 생성해 주는 옵션들을 자세히 살펴볼게요.

출처: Interoperability Options

본문

-fc-prototypes

이 옵션은 BIND(C) 속성이 붙은 변수 선언, 타입, 그리고 프로시저 인터페이스로부터 C 프로토타입을 생성해 표준 출력(standard output)으로 써 내보내는 옵션이에요. 참고로 ENUM은 아직 지원되지 않아요.

생성된 프로토타입은 <stdint.h><stdlib.h> 같은 적절한 헤더를 포함해야 할 수 있어요. 또 iso_c_binding 모듈에서 적절한 kind로 지정되지 않은 타입에 대해서는 코드에 주석(comment)으로 경고가 추가돼요.

함수 포인터의 경우에는, 명시적인 인자 목록 없이 int를 반환하는 함수를 가리키는 포인터가 생성돼요.

사용 예를 볼게요.

 $ gfortran -fc-prototypes -fsyntax-only foo.f90 > foo.h

이렇게 생성한 foo.h를, Fortran 코드와 상호 운용하려는 C 코드에서 #include "foo.h"로 포함해서 사용하면 돼요.

-fc-prototypes-external

이 옵션은 외부 함수와 서브루틴으로부터 C 프로토타입을 생성해 표준 출력으로 써 내보내는 옵션이에요. Fortran 코드에 대한 C 바인딩이 제대로 되었는지 확인할 때 유용해요. 하지만 BIND(C) 프로시저에 대해서는 프로토타입을 생성하지 않아요. 그 경우에는 앞서 본 -fc-prototypes를 사용해야 해요.

여기서도 생성된 프로토타입이 <stdint.h><stdlib.h> 같은 적절한 헤더를 필요로 할 수 있어요.

이 옵션은 주로 레거시 코드를 대상으로, 기존 C 바인딩이 gfortran이 내보내는 내용과 일치하는지 확인하기 위한 목적이에요. 생성된 C 프로토타입은 현재 버전의 컴파일러에 대해서는 정확해야 하지만, 다른 컴파일러나 이전 버전의 gfortran이 필요로 하는 것과는 일치하지 않을 수 있어요. 새로 개발하는 코드라면 BIND(C) 기능을 사용하는 편이 권장돼요.

사용 예를 볼게요.

 $ gfortran -fc-prototypes-external -fsyntax-only foo.f > foo.h

역시 Fortran 코드와 상호 운용하려는 C 코드에서 #include "foo.h"로 포함해 사용할 수 있어요.

두 옵션의 차이

정리하면 두 옵션은 목적이 달라요. -fc-prototypesBIND(C)로 명시적으로 선언한 인터페이스를 C 프로토타입으로 바꿔 주고, -fc-prototypes-external은 명시적으로 BIND(C)를 쓰지 않은 외부 함수/서브루틴으로부터 프로토타입을 만들어 주는 거죠. 그래서 레거시 코드의 바인딩 검증에는 후자가, 새 코드의 상호 운용 설계에는 전자가 어울려요.

더 알아보기