Fortran이 아닌 주 프로그램
Fortran이 아닌 주 프로그램 (Non-Fortran Main Program)
프로그램의 시작점(주 프로그램)을 Fortran이 아니라 C나 다른 언어로 작성하는 경우가 있어요. 이 절은 그런 상황에서 gfortran으로 컴파일한 코드를 제대로 초기화하는 방법을 다뤄요. 다만, 대부분의 혼합 언어 개발자에게는 이 내용을 몰라도 될 때가 많아요.
본문
혼합 언어 프로그래밍을 하고 있더라도, 이 절의 내용을 꼭 알고 써야 할 경우는 드물어요. 이 절은 GNU Fortran의 내부 구조에 관한 내용이라, GCC의 마이너 릴리스에서도 바뀔 수 있어요.
GNU Fortran으로 PROGRAM을 컴파일하면, 오브젝트 파일의 심볼 테이블에 main이라는 이름의 함수가 생성돼요. 이 함수는 libgfortran 라이브러리를 초기화한 다음, 실제 프로그램을 호출해요. 실제 프로그램은 역사적인 이유로 MAIN__이라는 이름을 사용해요.
만약 GNU Fortran으로 컴파일한 절차를 C나 C++ 프로그램, 혹은 다른 컴파일러로 컴파일한 Fortran 프로그램에 링크한다면, libgfortran 라이브러리가 초기화되지 않아요. 그러면 몇몇 내장 절차(intrinsic procedure)가 제대로 동작하지 않아요. 예를 들어 커맨드 라인 인자를 얻어 오는 내장 함수들이 그런 경우예요.
따라서 PROGRAM이 GNU Fortran으로 컴파일되지 않았고, GNU Fortran으로 컴파일한 절차가 라이브러리 초기화에 의존하는 내장 함수를 쓴다면, 여러분이 직접 라이브러리를 초기화해야 해요.
기본 옵션을 쓰면 gfortran은 _gfortran_set_args와 _gfortran_set_options를 호출해요. 전자(_gfortran_set_args)의 초기화는 호출된 절차가 커맨드 라인(그리고 백트레이싱 backtrace)에 접근할 때 필요하고, 후자(_gfortran_set_options)는 선택한 표준이나 백트레이싱 활성화에 따라 몇 가지 플래그를 설정해요. 전형적인 프로그램에서는 어떤 초기화 함수도 호출할 필요가 없어요.
PROGRAM이 GNU Fortran으로 컴파일되었다면, 아래 함수들은 직접 호출하면 안 돼요. 다음 초기화 함수들은 C 문법으로 표시되어 있지만, C 바인딩을 쓰면 Fortran에서도 접근할 수 있어요.
_gfortran_set_args— Save command-line arguments_gfortran_set_options— Set library option flags_gfortran_set_convert— Set endian conversion_gfortran_set_record_marker— Set length of record markers_gfortran_set_fpe— Enable floating point exception traps_gfortran_set_max_subrecord_length— Set subrecord length
요약하면, 주 프로그램이 Fortran이 아닐 때는 (1) libgfortran 초기화가 필요할 수 있고, (2) 필요하다면 gfortran이 기본으로 하는 초기화 호출을 직접 해 줘야 하며, (3) 반대로 주 프로그램이 Fortran이라면 이 초기화 함수들을 손대면 안 된다는 흐름이에요.
더 알아보기
- 이름 짓기와 인자 전달 규약
- C와의 상호운용(Interoperability with C)
libgfortran런타임 초기화 함수 목록