디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.11.24 15:30:26
조회 131 추천 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 AI 가전 디지털 모음전 운영자 25/11/27 - -
2905324 프로그래머, 내가 하다 하다 3D 공부한다. [3] 프갤러(59.16) 11.28 119 1
2905316 나 좀 찾지 말아달라고 했음 ㅇㅇ(211.234) 11.28 89 0
2905313 나 아까 실수했네 발명도둑잡기(118.216) 11.28 71 0
2905298 어제부터 저녁에 배가 안 고픔;; [6] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 115 0
2905297 클래스 101 결제해본 사람있나 ㅇㅇ(140.248) 11.28 90 0
2905296 국비 말고 혼자 자격증 따서 취직하는것도 가능함? [1] ㅇㅇ갤로그로 이동합니다. 11.28 140 0
2905294 후 시발 이런건 15분만에 최라락 써서 뚝딱 해야하는건데 프갤러(14.52) 11.28 86 0
2905293 회원가입 겨우 완성했다. 프갤러(14.52) 11.28 85 0
2905292 <서울 자가에 대기업 다니는 김부장 이야기>관련 생각나는 글 발명도둑잡기(118.216) 11.28 151 0
2905291 맨땅에 헤딩하기에는 c가 가장 적절한듯 ㅇㅇ(118.235) 11.28 68 0
2905289 AI 로 뚝딱해서 돈 벌었다는 사람 통장 까봐. [1] 프갤러(59.16) 11.28 81 2
2905288 미디어에서 AI 로 1 분만에 뚝딱 개발했다니까 정말 그런줄 알아. 프갤러(59.16) 11.28 96 1
2905287 프로그래머가 되려면 꿈과 희망을 버려라. [3] 프갤러(59.16) 11.28 114 0
2905283 <우주메리미>가 인기래서 생각나는 예전 글 발명도둑잡기(118.216) 11.28 73 0
2905282 면접문제를 만들어봤다. 프갤러(49.165) 11.28 93 0
2905281 "찬송가 부르고 주식 사"‥ 이불말이는 주가 올리는 '제물' 발명도둑잡기(118.216) 11.28 57 0
2905280 시대의 어르신들이 하나 둘 돌아가시는게 참 먹먹하구낭.. [3] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 88 0
2905279 바지가 내려가 넥도리아(223.38) 11.28 79 0
2905278 ■si회사갈거면 포트폴리오 프론트엔드 뭘로하는게 좋냐? [9] ㅇㅇ갤로그로 이동합니다. 11.28 133 0
2905277 Ada 인생 40 년 갈아 넣었습니다. 프갤러(59.16) 11.28 68 0
2905276 착한 중국인 환영⭐+ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 79 0
2905275 Ada 언어는 공부하면 할수록 너무 신기하다.. ㅎㅎ 나르시갤로그로 이동합니다. 11.28 74 0
2905274 나님 왤케 소중하실깡..?⭐+ [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 79 0
2905272 SK네트웍스 FAMILY AI 캠프 24기 프갤러(118.235) 11.28 98 0
2905271 미국정치 갤러리 이미지, 동영상 첨부 차단 중 [1] 발명도둑잡기(118.216) 11.28 83 0
2905270 열심히 살아라 RyuDOG갤로그로 이동합니다. 11.28 75 0
2905269 오늘 기분좋네 RyuDOG갤로그로 이동합니다. 11.28 72 0
2905268 의사도 유튜버도 아니다…중고생이 꼽은 장래희망 1위 [1] 발명도둑잡기(118.216) 11.28 117 0
2905266 한화시스템 BEYOND SW 캠프 24기 프갤러(118.235) 11.28 109 0
2905263 이제 LLM딸깍으로 과제 풀기 쉬워졌으니 취업난보다 인력난이 더 대두될거 ㅇㅇ(110.10) 11.28 115 0
2905262 진짜 공대처럼 수학 물리를 빡세게 하는 것도 아니고 ㅇㅇ(110.10) 11.28 86 0
2905261 오늘의 작사 실마리: 한국에서 제일 높은 산? 발명도둑잡기(39.7) 11.28 74 0
2905260 헉교수업만 멍청하게 꼬박꼬받듣다가 취업 못 한다고 징징징 ㅇㅇ(110.10) 11.28 81 0
2905259 네트워크 프로그래밍에 네트워크 이론 ㅈ도 필요없는데 ㅇㅇ(110.10) 11.28 95 0
2905258 실시간 변화하는 컴공이라 도메인지식/신지식 경계를 잘 다뤄야하는데 ㅇㅇ(110.10) 11.28 71 0
2905257 1학년 신입질한다고 1년 날려먹고 [2] ㅇㅇ(110.10) 11.28 106 0
2905256 학교 커리만 따르는 애들 걍 순수 지능장애 같음 [1] ㅇㅇ(110.10) 11.28 102 0
2905255 모든 한국인 전자주민증, 전자운전면허증은 NSA가 훔칠 수 발명도둑잡기(118.216) 11.28 66 0
2905254 Ada: 외계인이 설계한 Storage_Pool 소개 나르시갤로그로 이동합니다. 11.28 81 1
2905253 가상화폐, 금융기관, 핀테크 해킹은 서버 씨피유 백도어 때문일지도 [1] 발명도둑잡기(118.216) 11.28 166 0
2905252 나르시시스트 특징 10가지 ㄷㄷㄷㄷ 슈퍼너드_리보갤로그로 이동합니다. 11.28 84 0
2905250 좆소 git 기가 막히네 [4] ㅇㅇ(106.101) 11.28 157 0
2905248 러스트를 접한건 우연이지만 빠는건 필연이다. [1] 프갤러(110.8) 11.28 98 0
2905246 내가 만나고 싶은 여자 이상형 적어봄.txt [1] ㅁㅁㅅ갤로그로 이동합니다. 11.28 99 0
2905242 러스트 인생 40 년 갈아 넣었습니다. 프갤러(59.16) 11.28 82 0
2905240 러스트 러스트 러스트 러스트 러스트 러스트 프갤러(221.149) 11.28 77 0
2905239 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 78 0
2905238 내 컴터 상태가 이럴듯..ㅇㅅㅇ [2] 헤르 미온느갤로그로 이동합니다. 11.28 105 0
2905236 다들 이정도 정신문제는 가지지 않나 ㅇㅇ(39.7) 11.28 99 0
2905234 작년 이맘때 폭설 ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 11.28 83 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2