디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.11.24 15:30:26
조회 121 추천 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/08 - -
AD 루틴 ON! 운동 찐템! 지금 할인 중 운영자 25/11/27 - -
2906741 지금껏 다녀본 업소들 유형별 특징.txt [1] ㅇㅇ(118.235) 12.06 64 0
2906740 [대한민국] 우파에서 자기당에 칼 꽂는 자들 거듭 나오는 충격 이유! [1] ㅇㅇ(121.172) 12.06 40 0
2906739 평화로운 주말 [6] 개멍청한유라갤로그로 이동합니다. 12.06 86 2
2906738 냥덩이 큰집 이력 발명도둑잡기(175.223) 12.06 61 0
2906737 IQ 테스트 정답공개 사람낚는어부갤로그로 이동합니다. 12.06 102 0
2906736 [애니뉴스][투표] 웹에서 비주얼노벨 구현 라이브러리 ㅇㅇ(121.172) 12.06 33 0
2906735 안마방 체험 썰.jpg ㅇㅇ(118.235) 12.06 44 0
2906734 프갤이랑 뉴프로랑 글리젠 비슷한거 같은데 [7] 헬마스터갤로그로 이동합니다. 12.06 73 0
2906733 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥발라당냥덩♥갤로그로 이동합니다. 12.06 66 0
2906732 자바 뉴비 질문이요 [3] ㅇㅇ갤로그로 이동합니다. 12.06 75 0
2906729 [대한민국] 온두라스 부정선거 - 트럼프 대통령 ㅇㅇ(121.172) 12.06 43 1
2906728 IQ 테스트 문제 하나 [9] 사람낚는어부갤로그로 이동합니다. 12.06 100 0
2906727 [애니뉴스][과학 컬럼] 사람들은 왜 광속을 불변이라고 할까? ㅇㅇ(121.172) 12.06 44 0
2906723 나님 ㅇ왤케 똑똑행? [5] ♥발라당냥덩♥갤로그로 이동합니다. 12.06 127 1
2906722 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ [4] ♥발라당냥덩♥갤로그로 이동합니다. 12.06 101 0
2906721 사이드 플젝하니까 성취감이 생기네 [2] 프갤러(58.76) 12.06 88 1
2906720 조국혁신당이 미래다 이기이기 타이밍뒷.통수한방(1.213) 12.06 36 0
2906716 if else 를 뭐라 부르냐? ㅇㅇ갤로그로 이동합니다. 12.06 119 0
2906715 김남국 부정청탁 이재명의 김현지 꼬리자르기 시도 ♥발라당냥덩♥갤로그로 이동합니다. 12.06 94 0
2906714 짤줍 [1] ㅇㅇ갤로그로 이동합니다. 12.06 82 0
2906713 AI랑 데이터 분석 아니면 파이썬 거의 안쓰나? [5] 프갤러(175.197) 12.06 75 0
2906712 무협 좋아하는 사람? 최강의 무협 게임 기대 신작 7선! 발명도둑잡기(118.216) 12.06 24 0
2906711 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥발라당냥덩♥갤로그로 이동합니다. 12.06 59 0
2906710 인지과학조져라 손발이시립디다갤로그로 이동합니다. 12.06 70 0
2906709 정치가 정상화 되니 이제 연예계도 정상화 되어가네 [1] 야옹아저씨갤로그로 이동합니다. 12.06 65 0
2906708 하루에 오조오경줄 감사의 코딩 공기역학갤로그로 이동합니다. 12.06 78 0
2906707 한은 “국내 AI 전문인력 임금 프리미엄, 미국의 1/5 수준” 발명도둑잡기(118.216) 12.06 41 0
2906703 ‘고교 시절 중범죄’ 논란에…조진웅 소속사 “잘못했던 행동 있었다…성폭력 발명도둑잡기(118.216) 12.06 39 0
2906702 서울 한복판에 쏟아진 5만원권... 돈다발 쥔 시민들, 경찰에게 갔다 발명도둑잡기(118.216) 12.06 54 0
2906698 네부카드네자르 이름의 뜻과 비트코인 책사풍후zen갤로그로 이동합니다. 12.06 50 0
2906692 넥도리아 인생 프갤러(121.139) 12.06 96 0
2906685 otp 4년만에 복구 완료 넥도리아(220.74) 12.06 83 0
2906684 넥도리아 이분 무섭네요 [6] ㅇㅇ(118.235) 12.06 104 0
2906683 국민의힘도 타당하면 동의해줄 것이다. 윤카 제외하고, 넥도리아(220.74) 12.06 62 0
2906682 나의 물귀신 작전은 국민의힘 이 반대의 입장에서 말하는거라서, 넥도리아(220.74) 12.06 54 0
2906681 아이큐 테스트 문제 풀어줄사람 [2] RAIN갤로그로 이동합니다. 12.06 60 0
2906680 I nan, Administrator 감시자 넥도리아(220.74) 12.06 40 0
2906679 윈도우 계정 이름 Administrator 관리자 넥도리아(220.74) 12.06 43 0
2906678 달동네? ㅇㅅㅇ [2] 헤르 미온느갤로그로 이동합니다. 12.06 58 0
2906677 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 12.06 39 0
2906676 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 12.06 76 0
2906671 이거 왜 오류나요?ㅠ [3] ㅇㅇ(118.235) 12.06 69 0
2906667 121.139 중국인이 대한민국 국민 사살해도, 아무 말 못할 사람이다T [7] 넥도리아(220.74) 12.06 83 0
2906666 121.139 국제 정세 못 읽는 사람이다. 관심주지 마라. 관심법 넥도리아(220.74) 12.06 40 0
2906665 인신매매 정부 니들 매매랑 판매랑 뜻 아냐 중국정부? 마이크 사갖테스트 넥도리아(220.74) 12.06 50 0
2906663 일본과 중국 지지 안하지만, 솔직히 먼저 선전포고한놈이 잘못 한거 아닌가 [6] 넥도리아(220.74) 12.06 73 0
2906662 넥도리아 중일 전쟁 타이완 해협이 어딘지 알았습니다. [7] 넥도리아(220.74) 12.06 60 0
2906661 it 업계 남자와 여자의 차이 프갤러(121.139) 12.06 90 1
2906655 히야.. 이뇬 이거.. [4] ♥발라당냥덩♥갤로그로 이동합니다. 12.05 152 0
2906654 슬롯머신 사이트 추천 디시 ㅇㅇ(59.2) 12.05 50 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2