디시인사이드 갤러리

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

갤러리 본문 영역

Ada, Rust의 0 오버헤드 C 바인딩

나르시갤로그로 이동합니다. 2025.11.24 15:30:26
조회 106 추천 0 댓글 2

주의:

LLM으로 작성한 글입니다. 글에 틀린 내용이 있을 수 있습니다.

제가 아직 Ada, Rust 관련 글의 내용을 검증할 수준이 못됩니다.


개요

이 문서는 Ada와 Rust에서 C 바인딩을 오버헤드 없이(Zero-Overhead) 구현하는 방법을 기술적으로 설명합니다. 여기서 “오버헤드 없음”이란 C 함수 호출과 동일한 수준에서 추가적인 런타임 변환, 복사, 마샬링이 발생하지 않고, 호출 규약과 데이터 레이아웃이 완전히 일치하는 상태를 의미합니다.


C ABI 기본 조건

  • 호출 규약(Call Convention): 함수는 C 호출 규약을 따라야 합니다.
  • 데이터 표현(Representation): 전달되는 타입은 크기, 정렬, 필드 순서, 패딩이 C와 동일해야 합니다.
  • 심볼 이름(Name Mangling): 내보내는 심볼은 C와 동일한 이름으로 유지해야 합니다.
  • 스택 언와인딩(Unwinding): 예외나 패닉은 언어 경계를 넘어가면 안 됩니다.
  • 정수/포인터 폭: 플랫폼 ABI(LP64, ILP32 등)에 맞춰야 합니다.

Ada: Zero-Overhead C 바인딩

함수 Import/Export

with Interfaces.C;

procedure Foo (X : Interfaces.C.int);
pragma Import (C, Foo, "foo");

function Bar (A, B : Interfaces.C.int) return Interfaces.C.int;
pragma Export (C, Bar, "bar");
  • pragma Import/Export (C, ...)를 사용하면 Ada 함수가 C ABI와 동일하게 호출됩니다.

구조체 레이아웃

type C_Context is record
   Dummy : Interfaces.C.int;
end record;
pragma Convention (C, C_Context);
  • pragma Convention (C, ...)로 구조체 레이아웃을 C와 동일하게 강제합니다.
  • 필요 시 for ... use record 표현절로 필드 오프셋을 명시할 수 있습니다.

비트마스크/집합 타입

type Event_Condition is (Input, Output, Hang_Up, Error);
for Event_Condition'Size use 8;

type Event_Conditions is set of Event_Condition;
for Event_Conditions'Size use 32;
pragma Convention (C, Event_Conditions);
  • Event_Conditions는 32비트로 강제되며, C의 uint32_t와 동일한 ABI를 가집니다.

콜백 (함수 포인터)

type Event_Callback is access procedure
  (FD        : Interfaces.C.int;
   Events    : Event_Conditions;
   User_Data : System.Address)
with Convention => C;
  • Convention => C를 붙이면 Ada의 access procedure가 C 함수 포인터와 ABI 일치합니다.

Rust: Zero-Overhead C 바인딩

함수 Import/Export

extern "C" {
    fn foo(x: i32);
}

#[no_mangle]
pub extern "C" fn bar(a: i32, b: i32) -> i32 {
    a + b
}
  • extern "C"로 호출 규약을 C와 동일하게 설정합니다.
  • #[no_mangle]로 심볼 이름을 그대로 유지합니다.

구조체 레이아웃

#[repr(C)]
pub struct CContext {
    pub dummy: i32,
}
  • #[repr(C)]로 구조체 레이아웃을 C와 동일하게 강제합니다.

비트마스크

bitflags::bitflags! {
    #[repr(C)]
    pub struct EventMask: u32 {
        const INPUT   = 0x01;
        const OUTPUT  = 0x02;
        const HANG_UP = 0x04;
        const ERROR   = 0x08;
    }
}
  • 내부적으로 u32이므로 C의 uint32_t와 동일합니다.

콜백 (함수 포인터)

pub type EventCallback =
    extern "C" fn(fd: i32, events: u32, user_data: *mut core::ffi::c_void);

extern "C" {
    fn 레지스터_cb(cb: EventCallback);
}
  • extern "C" fn은 C 함수 포인터와 ABI가 동일합니다.

데이터 타입 일치 조건

  • 정수: Ada는 Interfaces.C.*, Rust는 i32, u32 등 고정 폭 타입 사용.
  • 포인터: Ada는 System.Address, Rust는 *mut T / *const T.
  • 구조체: Ada pragma Convention (C), Rust #[repr(C)].
  • 열거형: Ada는 for Enum'Size use ..., Rust는 #[repr(u32)].
  • 집합/비트마스크: Ada는 for Set'Size use 32, Rust는 u32.

예외 처리 및 안전성

  • Ada 예외와 Rust 패닉은 C로 넘어가면 안 됩니다.
  • Ada에서는 예외를 잡아 에러 코드로 변환, Rust에서는 catch_unwind 사용.
  • 메모리 관리와 버퍼는 언어 경계에서 직접 전달하며, 소유권은 한쪽 언어에서만 책임집니다.

검증 방법

  • 크기/정렬 확인: Ada Type'Size, Rust std::mem::size_of::<T>().
  • 심볼 확인: nm, objdump, readelf로 확인.
  • 성능 검증: 마이크로벤치마크로 변환/복사 코드가 없는지 확인.

요약

Ada와 Rust 모두 다음 조건을 만족하면 C와 오버헤드 없는 바인딩을 구현할 수 있습니다:

  • C 호출 규약(pragma Import/Export (C) / extern "C")
  • C 호환 레이아웃(pragma Convention (C) / #[repr(C)])
  • 고정 폭 정수 및 포인터 타입 사용
  • 예외/패닉 언와인딩 금지
  • 심볼 이름 unmangled 유지

이렇게 하면 Ada와 Rust에서 작성한 코드가 C와 동일한 ABI를 가지며, 변환 계층 없이 직접 호출 가능합니다.


주의:

LLM으로 작성한 글입니다. 글에 틀린 내용이 있을 수 있습니다.

제가 아직 Ada, Rust 관련 글의 내용을 검증할 수준이 못됩니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 이제는 의미 없어진 것 같은 시상식은? 운영자 25/12/01 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48799 65
2905883 나님… 멧챠 카와이.. ❤+ [1] 따당갤로그로 이동합니다. 10:19 13 0
2905881 나의 인버스 동지들 맘고생이 많소 chironpractor갤로그로 이동합니다. 10:16 16 0
2905879 컴컴.. ㅇㅅㅇ [3] 헤르 미온느갤로그로 이동합니다. 09:59 19 0
2905877 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 09:55 10 0
2905876 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 09:52 13 0
2905871 인지과학조져라 [1] 손발이시립디다갤로그로 이동합니다. 07:58 31 0
2905869 결국 jemalloc 래핑하는 걸로 타협봤어요 [2] 나르시갤로그로 이동합니다. 07:09 21 0
2905862 요즘에 AI가 나오니까 시니어 1명 주니어 다수 형태로 가는거같음 프갤러(58.76) 05:25 39 0
2905853 코로나때 국비고졸로 취업했었다면 어땟을까 ㅇㅇ(211.235) 04:49 40 0
2905845 어떤 주장을 할 때 느끼는거지만 [2] 루도그담당(58.233) 03:59 69 1
2905810 방귀 냄새를 맡는다고? 떵을 먹겟다는 소리냐? [7] 헬마스터(211.35) 02:08 92 7
2905795 개발자 연봉 왤케 내려갔냐 ㅇㅇ(117.111) 01:32 54 0
2905781 취업이 낳냐 창업이 낳냐 [3] ㅇㅇ갤로그로 이동합니다. 00:44 59 0
2905774 ai 대체드립 이거 굉장히 좋은듯 [7] 프갤러(110.8) 00:33 80 0
2905771 IT굽삐 광고가 이제 [1] 개멍청한유라갤로그로 이동합니다. 00:29 45 0
2905745 지금 신입 ㅈ된거 아니냐 [5] ㅇㅇ갤로그로 이동합니다. 11.30 119 0
2905740 파이썬 어케 실행하냐고 묻는 개발자 어케 생각함? [6] 프갤러(218.153) 11.30 103 1
2905739 IT 인력을 좀 줄일 필요는 있는 듯 [1] ㅇㅇ(114.30) 11.30 84 0
2905738 IT 배우려면 인도 기업 가라는 이유 [4] 프갤러(124.54) 11.30 96 0
2905736 12.3 계엄 그날의 시계는 돌아온다. [그날의 의미] [누군가의 길에서 넥도리아(220.74) 11.30 21 0
2905735 혹시 이제 코딩 c언어 몰라도 할수있는 정도임? [1] 흑인갤로그로 이동합니다. 11.30 79 0
2905734 큰 결심을 하려 한다. 넥도리아(220.74) 11.30 30 0
2905724 디시 클리너 돌리기 어려움?? [11] ㅇㅇ(175.214) 11.30 62 0
2905719 님들 혹시 다이어그램 같은 거 직접그림? [2] ㅇㅇ(115.140) 11.30 62 0
2905710 한달에 100km 정도 뛰는듯? [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 80 0
2905709 2000년대 머리스탈이 지금보다 낳지않냐? [4] 헬마스터갤로그로 이동합니다. 11.30 68 0
2905708 나님 슬슬 졸린.. [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 77 0
2905698 프갤 뛰뛰크루 냥덩런 명단과 일정 짜봄(초보자용) [4] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 61 0
2905696 [애니뉴스] 소설 공모전 ㅇㅇ(121.172) 11.30 24 0
2905694 나님 프갤 뛰뛰크루 만들깡? [3] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 85 0
2905692 확실히 뛰뛰하면 맘마 소화가 잘됨 [4] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 53 0
2905687 나님 이제 슬슬 소화되는듯? [4] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 64 0
2905685 렌고쿠 똥구멍봤다 [7] 개멍청한유라갤로그로 이동합니다. 11.30 77 0
2905684 러스트 sql 인젝션 실제 사례, 겁나 많네 [2] 나르시갤로그로 이동합니다. 11.30 51 0
2905683 러스트 sql 인젝션 실제 사례 나르시갤로그로 이동합니다. 11.30 32 2
2905679 취업이 목표면 대학교보다 폴리텍, 직업훈련소.. [10] 나르시갤로그로 이동합니다. 11.30 69 0
2905678 학력높아야하는 이유 ㅇㅇ [5] 프갤러(211.234) 11.30 76 0
2905676 수학과가 범용성 최고 [4] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 81 0
2905674 현대판 중일 전쟁 정말 나나요? 넥도리나(220.74) 11.30 20 0
2905673 코딩하는거니 유튜버 아는 사람 [1] 프갤러(14.39) 11.30 46 0
2905672 친구놈이 자기 코딩할줄안다고 자랑하는데 [8] 프갤러(121.150) 11.30 75 0
2905671 자바개발자랑 c#개발자 구분하는법 [2] 프갤러(211.234) 11.30 64 0
2905670 대장동 설계자 이재명 [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 57 1
2905667 학력높으면 좋은점 있음 ㅇㅇ(121.139) 11.30 33 0
2905665 재미나이 프로 대학생무료1년 이거 언제다시해주냐 ㅇㅇ갤로그로 이동합니다. 11.30 21 0
2905662 간첩들이 나라 망치는 중 [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 40 0
2905659 한동훈 책 샀음. [2] 넥도리아(220.74) 11.30 67 0
2905657 이번에 컴공 가는 고3인데 미리 공부해야할거 있음? [7] ㅇㅇ갤로그로 이동합니다. 11.30 74 0
2905651 밥먹는중인데 chironpractor갤로그로 이동합니다. 11.30 27 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2