디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.11.24 15:30:26
조회 68 추천 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/11/24 - -
이슈 [디시人터뷰] 충무로가 주목하는 신예, '세계의 주인' 서수빈 운영자 25/11/24 - -
AD 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
2904744 노인비하글 써서 프갤 하루 글 차단했냐 관리자새끼야 타이밍뒷.통수한방(1.213) 11.25 18 0
2904743 만화 드래곤볼 아직 못 봤는데 손오공 직업이 발명도둑잡기(118.216) 11.25 16 0
2904742 끙야참기 은근 쾌감?있는듯? ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.25 41 0
2904739 지귀연판사 말투 개웃기지않냐? [5] 헬마스터갤로그로 이동합니다. 11.25 45 0
2904735 한국에서 수준운운 의미없다. [6] 프갤러(110.8) 11.25 63 0
2904734 촉촉한 초코 케익처럼 달콤한 모모링❤ ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.25 18 0
2904733 앱히키는 창년임 ㅇㅇ(222.108) 11.25 40 0
2904731 [애니뉴스] Github Page 사이트 주소 1급시크릿공문(121.172) 11.25 27 0
2904730 요새 1인 개발이 유행임? ㅋㅋ [1] 프갤러(118.235) 11.25 83 3
2904729 국가부도사태 초읽기 대.재.명 [5] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.25 77 1
2904727 식당 들어갔는데 알바생이 젊고 예쁨 [3] ㅁㅁㅅ갤로그로 이동합니다. 11.25 57 0
2904725 실력자의 기준이 뭐냐? [7] 프갤러(211.240) 11.25 91 0
2904723 [대한민국 + 애니뉴스] 부정선거와 내부총질의 상관관계 1급시크릿공문(121.172) 11.25 21 1
2904720 전남친토스트맛 [3] 넥도리아(223.38) 11.25 31 0
2904718 달력받으러 신한은행 넥도리아(223.38) 11.25 25 0
2904717 인버스를 사지 않는 이유가 이해되지 않는군 [11] chironpractor갤로그로 이동합니다. 11.25 72 0
2904715 재업) Ada, C++, Rust에서 FFI 시 예외 전파 차이점 [3] 나르시갤로그로 이동합니다. 11.25 40 0
2904711 해킹 관련 질문 검열 안하는 인공지능 채팅 있나요 [1] 발명도둑잡기(118.235) 11.25 42 0
2904709 이거 검열 삭제 된다 발명도둑잡기(118.235) 11.25 60 0
2904706 파묘가 100억 손해? 영화 티켓값 내릴 수 있는 방법 알려드림 발명도둑잡기(118.235) 11.25 23 0
2904704 M-DIR 클론코딩 소스 발명도둑잡기(118.235) 11.25 35 0
2904703 인버스를 사는 이유가 이해되지 않는군 [4] ㅇㅇ갤로그로 이동합니다. 11.25 99 0
2904702 요즘 웹개발 취업시장 어때요 [1] 프갤러(211.234) 11.25 70 0
2904700 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.25 44 0
2904699 프갤에 인생 40년 갈아넣었습니다 [5] chironpractor갤로그로 이동합니다. 11.25 62 0
2904696 그래픽스 엔지니어 신입으로 들어가는 게 가능한가? [4] 프갤러(112.154) 11.25 61 0
2904695 일본 취업 유학 워홀 여행 관련모임 ㅇㅇ(106.146) 11.25 49 0
2904693 러스트 인생 40 년 갈아 넣었습니다. [2] 프갤러(59.16) 11.25 63 0
2904691 이벤트 루프 며칠 있으면 완성될 듯 ㅋㅋ 나르시갤로그로 이동합니다. 11.25 38 0
2904686 조별 프로젝트 조언부탁드려요 [1] ㅇㅇ(14.32) 11.25 47 0
2904680 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ [2] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.25 74 0
2904631 인지과학조져라 손발이시립디다갤로그로 이동합니다. 11.25 66 0
2904621 똥글 싸는 고닉들 다 뒤졌으면 좋겠다. [1] 프갤러(112.171) 11.25 42 1
2904619 살면서 순수 내의지로 무언가 열심히한게 [2] 공기역학갤로그로 이동합니다. 11.25 61 0
2904612 플밍갤말고 딴갤없냐 프갤러(59.14) 11.25 29 0
2904601 유튜브 광고에 피싱사이트 나오더라 헬마스터갤로그로 이동합니다. 11.25 30 0
2904588 꽃무늬 돌고래.. ㅇㅅㅇ [3] 헤르 미온느갤로그로 이동합니다. 11.25 49 0
2904586 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 11.25 32 0
2904584 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 11.25 61 0
2904523 사실 안뽑히는 이유는 아직 지원을 안했기 때문이지 [3] 프갤러(110.8) 11.24 84 0
2904522 짱깨먼지 좃같노 [1] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.24 98 0
2904521 남북한/일본은 중국에 미세먼지 공동대응해야함 [1] ㅇㅇ(211.216) 11.24 31 0
2904518 안뽑히는 이유 알았다. 나 러스트 존나 못한다. [5] 프갤러(110.8) 11.24 114 0
2904513 회사다니다 보면 바보되어가는 느낌 [4] CANON갤로그로 이동합니다. 11.24 98 0
2904510 가끔 알 수 없는 감정이 들때면 [2] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.24 62 0
2904506 린겨 ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.24 42 0
2904503 26학번 새내기들을 위한 입시 면접 합격 가이드(따뜻한 조언)!Y 프갤러(121.142) 11.24 105 2
2904501 와 개씨발 모기잇노 [1] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.24 93 0
2904500 대한민국 출산율 회생방안 ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.24 42 0
2904499 너, 재판 쌓여있잖아 ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.24 86 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2