디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

제 N장: C 언어 인터페이스 연동

나르시갤로그로 이동합니다. 2025.09.27 22:34:43
조회 63 추천 0 댓글 0

제 N장: C 언어 인터페이스 연동

Ada는 높은 신뢰성과 안전성이 요구되는 시스템 개발에 널리 사용되지만, 기존에 C 언어로 작성된 수많은 라이브러리 및 하드웨어 인터페이스와 연동해야 하는 경우가 빈번합니다. Ada는 이러한 상호 운용성을 지원하기 위해 Interfaces.C 패키지를 비롯한 강력한 기능을 제공합니다.

본 장에서는 제공된 C 언어 헤더 파일의 인터페이스를 분석하고, 이를 Ada에서 안전하고 효율적으로 사용하기 위한 Ada 스펙 파일을 작성하는 과정을 단계별로 학습하겠습니다.


1. 분석 대상 C 인터페이스

연동할 C 인터페이스는 플러그인 구조를 정의하고 있으며, CimPlugin을 진입점으로 사용합니다. 관련 자료구조는 다음과 같습니다.

C 코드:

typedef struct _CimInfo  CimInfo;
struct _CimInfo {
  uint32_t cim_api_major;
  uint32_t cim_api_minor;
  uint32_t cim_api_micro;
  uint32_t padding;
  const char* name;
  const char* desc;
  void* reserved[4];
};

typedef struct _CimPlugin  CimPlugin;
struct _CimPlugin {
  CimIcVTable* vtable;
  int  (*init) (void);
  void (*fini) (void);
  const CimInfo* (*get_info) (void);
  void* reserved[4];
};

이 인터페이스를 Ada에서 사용하기 위해서는 C의 각 자료형을 상응하는 Ada 자료형으로 변환하고, 구조체의 메모리 레이아웃을 C와 동일하게 맞춰주어야 합니다.


2. C 자료형과 Ada 자료형 매핑

Ada에서 C 인터페이스를 연동하기 위한 첫 단계는 C 자료형을 Ada의 자료형으로 정확하게 매핑하는 것입니다. 표준 라이브러리 패키지인 Interfaces.C가 이러한 목적으로 사용됩니다.

  • uint32_t: 32비트 부호 없는 정수입니다. Ada에서는 Interfaces.C.unsigned_int에 해당합니다.
  • const char*: 널(null) 문자로 끝나는 C 스타일 문자열을 가리키는 포인터입니다. Interfaces.C.Strings.chars_ptr로 매핑할 수 있습니다.
  • void*: 특정 자료형을 가리키지 않는 일반적인 포인터입니다. Ada의 System.Address에 해당합니다.
  • int (*func)(void): 함수 포인터입니다. Ada에서는 access function 또는 access procedure로 선언하여 표현합니다.
  • CimIcVTable*: CimIcVTable이라는 불완전한 자료형(Incomplete Type)을 가리키는 포인터입니다. 정의가 제공되지 않았으므로, Ada에서도 불완전한 자료형과 이에 대한 접근(access) 자료형으로 선언하여 포인터만 다룰 수 있도록 합니다.

3. C 구조체의 Ada 레코드 표현

이제 C의 struct를 Ada의 record로 변환합니다. 이때 pragma Convention (C, ...)를 사용하여 해당 레코드가 C 언어의 메모리 정렬 규칙을 따르도록 명시해야 합니다.

3.1. CimInfo 구조체 변환

CimInfo 구조체는 플러그인의 버전, 이름, 설명 등 메타데이터를 담고 있습니다.

Ada 레코드 정의 (Cim_Info_Record):

-- C의 CimInfo* 에 해당하는 접근 자료형을 미리 선언합니다.
type Cim_Info_Record;
type Cim_Info_Access is access all Cim_Info_Record;

-- C의 struct _CimInfo 에 해당하는 레코드 정의
type Cim_Info_Record is record
   Cim_Api_Major : Interfaces.C.unsigned_int;
   Cim_Api_Minor : Interfaces.C.unsigned_int;
   Cim_Api_Micro : Interfaces.C.unsigned_int;
   Padding       : Interfaces.C.unsigned_int;
   Name          : Interfaces.C.Strings.chars_ptr;
   Desc          : Interfaces.C.Strings.chars_ptr;
   Reserved      : array (1 .. 4) of System.Address;
end record;
pragma Convention (C, Cim_Info_Record);
  • 각 필드는 앞서 분석한 자료형 매핑 규칙에 따라 선언되었습니다.
  • void* reserved[4] 배열은 array (1 .. 4) of System.Address로 표현됩니다.
  • CimInfo*에 해당하는 Cim_Info_Access 자료형을 정의하여 포인터 연산에 사용합니다.
3.2. CimPlugin 구조체 변환

CimPlugin 구조체는 실제 플러그인의 동작을 정의하는 함수 포인터들을 포함합니다.

Ada 레코드 정의 (Cim_Plugin_Record):

-- C의 CimIcVTable* 에 해당하는 불완전한 자료형 선언
type Cim_Ic_VTable;
type Cim_Ic_VTable_Access is access all Cim_Ic_VTable;
pragma Convention (C, Cim_Ic_VTable);

-- 함수 포인터들에 대한 접근 자료형 선언
type Init_Func is access function return Interfaces.C.int;
pragma Convention (C, Init_Func);

type Fini_Func is access procedure;
pragma Convention (C, Fini_Func);

type Get_Info_Func is access function return Cim_Info_Access;
pragma Convention (C, Get_Info_Func);

-- C의 struct _CimPlugin 에 해당하는 레코드 정의
type Cim_Plugin_Record is record
   VTable   : Cim_Ic_VTable_Access;
   Init     : Init_Func;
   Fini     : Fini_Func;
   Get_Info : Get_Info_Func;
   Reserved : array (1 .. 4) of System.Address;
end record;
pragma Convention (C, Cim_Plugin_Record);
  • 레코드에 포함될 함수 포인터 자료형(Init_Func, Fini_Func, Get_Info_Func)을 access 자료형으로 먼저 정의합니다. 이들 역시 C와의 호환을 위해 pragma Convention (C, ...)를 지정합니다.
  • 정의가 제공되지 않은 CimIcVTable은 불완전한 자료형으로 선언하고, 포인터에 해당하는 Cim_Ic_VTable_Access를 정의하여 레코드의 필드로 사용합니다.

4. 완성된 Ada 스펙 파일

위의 변환 과정을 종합하여 하나의 완전한 Ada 패키지 스펙 파일(.ads)로 작성할 수 있습니다. 이 파일은 C 라이브러리의 헤더 파일과 같은 역할을 수행합니다.

cim_interface.ads

with Interfaces.C;
with Interfaces.C.Strings;
with System;

package Cim_Interface is
   pragma Preelaborate;

   --========================================================================
   -- CimInfo 관련 정의
   --========================================================================

   -- C의 CimInfo* 에 해당하는 접근 자료형
   type Cim_Info_Record;
   type Cim_Info_Access is access all Cim_Info_Record;
   pragma Convention (C, Cim_Info_Access);

   -- C의 struct _CimInfo 에 해당하는 레코드
   type Cim_Info_Record is record
      Cim_Api_Major : Interfaces.C.unsigned_int;
      Cim_Api_Minor : Interfaces.C.unsigned_int;
      Cim_Api_Micro : Interfaces.C.unsigned_int;
      Padding       : Interfaces.C.unsigned_int;
      Name          : Interfaces.C.Strings.chars_ptr;
      Desc          : Interfaces.C.Strings.chars_ptr;
      Reserved      : array (1 .. 4) of System.Address;
   end record;
   pragma Convention (C, Cim_Info_Record);

   --========================================================================
   -- CimPlugin 관련 정의
   --========================================================================

   -- C의 CimIcVTable* 에 해당하는 불완전 자료형 선언
   type Cim_Ic_VTable;
   type Cim_Ic_VTable_Access is access all Cim_Ic_VTable;
   pragma Convention (C, Cim_Ic_VTable);
   pragma Convention (C, Cim_Ic_VTable_Access);

   -- 함수 포인터 자료형 선언
   type Init_Func is access function return Interfaces.C.int;
   pragma Convention (C, Init_Func);

   type Fini_Func is access procedure;
   pragma Convention (C, Fini_Func);

   type Get_Info_Func is access function return Cim_Info_Access;
   pragma Convention (C, Get_Info_Func);

   -- C의 struct _CimPlugin 에 해당하는 레코드
   type Cim_Plugin_Record is record
      VTable   : Cim_Ic_VTable_Access;
      Init     : Init_Func;
      Fini     : Fini_Func;
      Get_Info : Get_Info_Func;
      Reserved : array (1 .. 4) of System.Address;
   end record;
   pragma Convention (C, Cim_Plugin_Record);

   --========================================================================
   -- 플러그인 진입점 (C 라이브러리의 심볼)
   --========================================================================

   -- C 라이브러리에서 export된 "CimPlugin" 심볼을 Ada 객체로 가져옵니다.
   -- 이 변수를 통해 C 플러그인 객체에 접근할 수 있습니다.
   Plugin_Entry_Point : aliased Cim_Plugin_Record;
   pragma Import (C, Plugin_Entry_Point, "CimPlugin");

end Cim_Interface;
  • pragma Import를 사용하여 C 라이브러리에 정의된 전역 변수 CimPlugin을 Ada의 Plugin_Entry_Point 객체와 연결했습니다. 이를 통해 Ada 코드에서 C 플러그인의 함수 포인터를 호출하고 데이터에 접근할 수 있습니다.

5. 결론

본 장에서는 C 언어로 정의된 인터페이스를 Ada에서 사용하기 위한 스펙을 작성하는 방법을 살펴보았습니다. 핵심은 Interfaces.C 패키지를 활용하여 자료형을 정확히 매핑하고, pragma Convention pragma Import를 사용하여 메모리 레이아웃과 외부 심볼 연결을 보장하는 것입니다. 이렇게 잘 정의된 인터페이스 스펙을 통해, Ada의 강력한 타입 검사와 안정성을 유지하면서 C로 작성된 기존 자산을 효과적으로 활용할 수 있습니다.


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 우리나라를 대표해서 UN 연설자로 내보내고 싶은 스타는? 운영자 25/09/29 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
2892852 AMI를 vmdk로 추출 후 vmware에서 부팅해본사람 ㅇㅇ갤로그로 이동합니다. 09.29 47 0
2892849 스레드가 뭔지도 모르는 새끼가 왜 비동기로 개념싸움 거는거야 [2] ㅇㅇ(106.241) 09.29 87 1
2892843 밥버러지... 고기도 익고... 명절한상 1주 시작. 넥도리아(220.74) 09.29 83 0
2892842 파이썬 질문인데 sha256 체크섬이 일치하지 않는다고 뜨는데.. [1] 프갤러(125.249) 09.29 80 0
2892841 ㅅㅂ... 알콜중독인가 잠이안와서 갈비탕 한그릇에 맥주깠다 ㅇㅇ(223.38) 09.29 42 0
2892840 밥 언재끔 커피 뿌려주었는데... 넥도리아(220.74) 09.29 81 0
2892839 밥짓는중. 넥도리아(220.74) 09.29 42 0
2892834 운영체제 충 돼서, 운영체제 모르면 개발이 불가능하다 생각하는데 ㅇㅇ(106.241) 09.29 71 0
2892832 저희는 가짜 프로그래머입니다. [1] 프갤러(110.8) 09.29 100 0
2892830 여기서 좀 정상적인 글쓰면 저능아들 꼬이는 그게 문제긴함 [1] ㅆㅇㅆ(124.216) 09.29 77 0
2892829 님들 진짜 프로그래머 맞나요 [3] Fjeoeieie갤로그로 이동합니다. 09.28 127 0
2892828 드이어 야구 동영상 옮긴다. 외장 볼륨있게 넥도리아(220.74) 09.28 48 0
2892824 나님 월 마일리지 인증 [7] ♥냥덩이♥갤로그로 이동합니다. 09.28 135 0
2892823 나님 이민 전략 칼럼 하나 쓰긴 써야하는데 [3] ♥냥덩이♥갤로그로 이동합니다. 09.28 100 0
2892804 나님 한국자격증 다 외국자격증으로 바꾸는중 [5] ♥냥덩이♥갤로그로 이동합니다. 09.28 117 0
2892788 클로드랑 GPT 물어봐서 앱 만들었어요 [2] zian갤로그로 이동합니다. 09.28 90 0
2892783 얼룩젖소무늬의 비밀 [1] ♥냥덩이♥갤로그로 이동합니다. 09.28 68 0
2892772 ❤+ [3] ♥냥덩이♥갤로그로 이동합니다. 09.28 108 0
2892769 오늘은 뭐할까 고민되네 ㅠㅠ 나르시갤로그로 이동합니다. 09.28 43 0
2892766 병신찐따 영포티 ㅋㅅㅋ ♥냥덩이♥갤로그로 이동합니다. 09.28 87 0
2892764 어흥! 호피무늬 모모링❤ [4] ♥냥덩이♥갤로그로 이동합니다. 09.28 126 0
2892761 인텔 ddr6 램64 10코어 이상 15w 미만 소비전력 아니면 안사줌 ♥냥덩이♥갤로그로 이동합니다. 09.28 48 0
2892754 주기적으로 컴퓨터, 노트북, 폰 포맷하는데 이상하나 ㅇㅇ(106.241) 09.28 43 0
2892747 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 09.28 37 0
2892746 AI 시대 최고 수혜 주식은? [4] 나르시갤로그로 이동합니다. 09.28 88 0
2892739 자바로 뭐 할수있음? [8] ㅇㅇ갤로그로 이동합니다. 09.28 106 0
2892737 ㅆㅇㅆ 모기 새끼 프갤러(210.217) 09.28 76 5
2892735 아 조만간 연휴구나 [2] 루도그담당(58.239) 09.28 66 0
2892732 모기떄문에 짜증난다. 프갤러(210.217) 09.28 59 4
2892729 게임쪽은 계속하고 싶은데 돈이 없다. ㅆㅇㅆ(124.216) 09.28 59 0
2892726 게임쪽 창업<<이거 씨발 사기만 안먹었어도 계속했는데 [4] ㅆㅇㅆ(124.216) 09.28 111 0
2892725 if문에서 3일 걸리는 애들도 있네 [6] 루도그담당(58.239) 09.28 131 0
2892720 매일 4~5시간 자니까 건강이 엉망되었네 ㅎㅎ 나르시갤로그로 이동합니다. 09.28 38 0
2892719 ㅆㅇㅆ 이사람 요즘 뭐함? [2] ㅇㅇ갤로그로 이동합니다. 09.28 82 3
2892718 SM이 기술력이 낮다? 규모도 기술력이란걸 간과하지마 프갤러(219.115) 09.28 45 0
2892708 나님두 부천Bj 하구 싶당 야차 뜨실 분 구함 ♥냥덩이♥갤로그로 이동합니다. 09.28 66 0
2892697 하... 할 일들은 많고 시간은 없고 마음만 조급하고 후달린다... ㅇㅇ(223.38) 09.28 78 0
2892691 게임 같은거 만들 때, 컴하하스러운 내용 넣으면 어떤거 같음? [1] ㅇㅇ(106.241) 09.28 43 0
2892688 [애니뉴스] 소설 연재 사이트 제작 현황 프갤러(121.172) 09.28 40 0
2892677 러스트는 어려운 언어가 아니라 귀찮은 언어입니다. 프갤러(110.8) 09.28 63 0
2892676 방정리중 [1] 넥도리아(220.74) 09.28 69 0
2892673 크래시 에러 찾기 겁나 쉬워요 나르시갤로그로 이동합니다. 09.28 59 0
2892672 ■개발자 평균 정년은 40대 중반.jpg ㅇㅇ갤로그로 이동합니다. 09.28 111 1
2892670 리액트 이런거 쓰는거 진짜 위험하네 [3] ㅇㅇ(118.34) 09.28 183 0
2892669 러스트 아무도 안 써요 [9] 나르시갤로그로 이동합니다. 09.28 89 0
2892667 비전공자 특 ㅇㅇ(211.234) 09.28 70 2
2892666 바이브코딩으로는 넘을 수 없는 장벽은 존재함. 컴파일러라거나 ㅆㅇㅆ(124.216) 09.28 92 0
2892665 그래도 도저히 프로그래밍 못 놓겠다하면 바이브코딩부터 시작해라 ㅆㅇㅆ(124.216) 09.28 72 0
2892664 그냥 중딩이면 바이브 코딩으로 시작해라 파이썬, 자바 배우는건 그때가서 ㅆㅇㅆ(124.216) 09.28 79 0
2892662 중고등학생이면 그냥 대학 성적 잘받아라. 이거밖에 없다 [4] ㅆㅇㅆ(124.216) 09.28 117 0
뉴스 악뮤 수현, 아이유 패션 지적 “예쁜 옷만 입지…” 울상 디시트렌드 10.04
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2