디시인사이드 갤러리

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

갤러리 본문 영역

C API를 위한 고성능 예외-에러코드(errcode) 매핑 전략

나르시갤로그로 이동합니다. 2025.11.26 20:23:15
조회 92 추천 0 댓글 0

두둥



제목: C API를 위한 고성능 예외-에러코드(errcode) 매핑 전략 (feat. Zero Allocation)

안녕하세요. 현재 Ada 언어로 고성능 비동기 I/O 라이브러리 Clair를 개발하고 있습니다.

오늘은 Ada로 작성된 라이브러리를 C 언어 API로 제공(Export)할 때 가장 골치 아픈 문제인 예외(Exception) 처리와 에러 코드 변환을 어떻게 효율적으로 설계했는지 공유하고자 합니다.

1. 문제 상황: 언어의 장벽

Ada는 예외(Exception)를 통해 에러를 전파하지만, C는 전통적으로 정수형 에러 코드(int errcode)를 반환합니다. 따라서 C API를 제공하려면 모든 Export 함수마다 예외를 잡아서 변환해야 합니다.

❌ 나쁜 예 (유지보수 지옥)
function c_api_do_something return Interfaces.C.int is
begin
   Internal_Package.Do_Something;
   return 0; -- 성공
exception
   -- [문제점] 모든 함수마다 이 짓을 반복해야 함...
   when Internal_Package.Not_Found => return 2; -- ENOENT
   when Internal_Package.Permission_Denied => return 13; -- EACCES
   -- ... 예외(에러)가 50개라면? when(if)문 50줄 ...
   when others => return -1;
end c_api_do_something;

이 방식은 코드가 지저분해지고, 새로운 에러가 추가될 때마다 모든 API 함수를 수정해야 하는 악몽을 선사합니다.


2. 해결 전략: 매핑 로직의 중앙화

우선 각 API 함수의 본문은 깔끔하게 유지하고, 변환 로직을 중앙 핸들러(map_to_c_errcode)로 위임합니다.

✅ 개선된 API 구조
function c_api_do_something return Interfaces.C.int is
begin
   -- 본문은 비즈니스 로직에만 집중!
   Internal_Package.Do_Something;
   return 0; 
exception
   -- 모든 API가 이 한 줄로 통일됨
   when E : others => return Clair.Error.map_to_c_errcode(e); 
end c_api_do_something;

3. 최적화: Map vs Sorted Array

이제 핵심은 map_to_c_errcode를 어떻게 구현하느냐입니다. 수십~수백 개의 에러를 매핑해야 하는데, 성능과 메모리를 모두 잡아야 합니다.

? 시도 1: 해시 맵 (Hashed Map)

가장 먼저 떠오르는 방법입니다.

  • 장점: O(1)에 가까운 검색 속도.
  • 단점: 힙 메모리 할당(new Node) 발생, 초기화 시 오버헤드, 메모리 파편화 가능성. 시스템 라이브러리로는 조금 무겁습니다.
💡 시도 2: 정렬된 배열 (Sorted Array) + 이진 탐색 (Binary Search) - [최종 선택]

생각해보면 에러 종류는 런타임에 변하지 않는 정적 데이터(Static Data)입니다. 굳이 동적인 맵을 쓸 필요가 없습니다.

우리는 룩업 테이블(Lookup Table) 방식을 채택했습니다.

  1. 구조: (Exception_Id, Error_Code) 쌍을 담은 배열을 만듭니다.
  2. 정렬: 프로그램 시작 시(Elaboration) 예외 ID(주소값) 기준으로 딱 한 번 정렬합니다.
  3. 검색: 런타임에는 이진 탐색(O(log N))으로 찾습니다.
   -- [구현 아이디어]
   type Error_Pair is record
      Id   : Integer_Address;   -- Ada 예외 ID의 주소값
      Code : Interfaces.C.int;  -- C errcode
   end record;

   -- 힙 할당 없음! 정적 데이터 영역(Data Segment)에 상주
   Table : array (1 .. N) of Error_Pair := (...);

   function map_to_c_errcode (Occ : Exception_Occurrence) return int is
      -- 이진 탐색 수행
   begin
      -- ... Binary Search Logic ...
      return Found_Code;
   end map_to_c_errcode;

🚀 성과 분석

이 아키텍처를 적용함으로써 얻은 이점은 명확합니다.

  1. Zero Allocation: 에러 매핑을 위해 malloc/new를 단 한 번도 호출하지 않습니다.
  2. Cache Friendly: 데이터가 배열에 연속적으로 붙어있어, 노드 기반의 Map보다 CPU 캐시 적중률이 훨씬 높습니다.
  3. 유지보수성: 새로운 에러가 생기면 테이블에 한 줄만 추가하면 끝입니다.
  4. 가독성: C API 함수 본문이 아주 깨끗해졌습니다.

시스템 프로그래밍에서 변하지 않는 데이터라면 맵(Map)보다 정렬된 배열(Sorted Array)이 깡패라는 격언을 다시 한번 확인할 수 있었습니다.

Ada나 시스템 프로그래밍, API 설계에 관심 있는 분들께 도움이 되길 바랍니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 이제는 의미 없어진 것 같은 시상식은? 운영자 25/12/01 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48801 65
2906054 'ㅎㅂ' 탱글 다희 드디어 다 벗음ㅋㅋ 프갤러(125.143) 02:38 1 0
2906052 20대때 3개월 개발하고 지금까지 노는중 프갤러(222.107) 02:06 17 0
2906050 물가 올라서 만들오봄 [1] 오잉(118.235) 01:56 14 0
2906045 전세계 간첩들 제일살기좋고 바쁜시대여 ㅋㅋㅋㅋ [1] 타이밍뒷.통수한방(1.213) 01:12 21 0
2906043 해커톤상금좀털러가볼까 따당갤로그로 이동합니다. 00:59 27 0
2906041 한국 개발자 평균 수준이 이미 중국 밑입니다. 프갤러(110.8) 00:49 29 0
2906039 판교에 출장을 다녀왔다 프갤러(140.248) 00:44 20 0
2906031 얘들아 고마웠다 ㅇㅇ(118.235) 00:19 19 0
2906032 재활용 분리수거 질문드려요. 넥도리아(220.74) 00:18 14 0
2906028 나노바나나 ㅇㅇ갤로그로 이동합니다. 00:15 19 0
2906011 인정욕구의 개념을 잘못 알던 헬마스터 병신새끼는 프갤러(211.36) 12.01 36 0
2905997 음기 충전 발명도둑잡기(39.7) 12.01 30 0
2905992 중국인이 몸값 ㅈㄴ싼데 일은 잘해 ㅇㅇ(221.168) 12.01 44 0
2905989 나르시야 github갤에 가라 거기 웹쟁이좀 패라 [1] 프갤러(61.75) 12.01 29 0
2905988 쿠팡 해킹범 짱깨라며 어째 해킹범 욕하는 기관이 하나도 없냐 ㅋㅋ [5] ㅇㅇ(124.48) 12.01 64 1
2905987 홍콩 무협과 힙합 발명도둑잡기(39.7) 12.01 17 0
2905986 중국인 쿠팡 해킹 사태 정리 [1] ♥발라당냥덩♥갤로그로 이동합니다. 12.01 47 2
2905983 오로지 연봉 때문에 이직하는경우 있음? [20] ㅇㅇ(221.168) 12.01 78 0
2905982 해가 짧아지니 잠이 길어진당 ♥발라당냥덩♥갤로그로 이동합니다. 12.01 24 0
2905979 날아다니는 스파게티 괴물 발명도둑잡기(39.7) 12.01 14 0
2905976 해킹 피해자가 아니라 가해자였던 결혼정보업체 발명도둑잡기(39.7) 12.01 18 0
2905974 소액 알바 하다가 스파이가 된 이야기 발명도둑잡기(39.7) 12.01 13 0
2905968 경찰 “쿠팡 개인정보 유출, 기업 보안사고 넘어 국민 발명도둑잡기(39.7) 12.01 17 0
2905962 지금껏 다녀본 업소들 유형별 특징.txt ㅇㅇ(39.7) 12.01 43 0
2905961 [애니뉴스] YxD Ads 개발중 ㅇㅇ(121.172) 12.01 19 0
2905959 llm이 자꾸 인증방식을 jwt로 몰아가네 프갤러(221.149) 12.01 45 0
2905958 재명이 때문에 물가폭등,주거비폭등,환율폭등 [1] ♥발라당냥덩♥갤로그로 이동합니다. 12.01 39 2
2905957 [애니뉴스] YxD Labs 검색 버튼 추가 ㅇㅇ(121.172) 12.01 14 0
2905949 박민호 d-_-b_mh@daum.net 더 많은 계정정보 보기 99+ 프갤러(118.33) 12.01 18 0
2905946 디지털 소유권 환상론으로 유튜브, 스테이블코인도 증발할 수 있다 발명도둑잡기(39.7) 12.01 27 0
2905942 현실에 나타난 아카자.jpg ㅁㅁㅅ갤로그로 이동합니다. 12.01 47 0
2905941 점심 간식 저녁 발명도둑잡기(39.7) 12.01 16 0
2905939 박민호 d-_-b_mh@daum.net 더 많은 계정정보 보기 99+ 프갤러(118.33) 12.01 20 0
2905938 우왓, 연회중에 피분수가..ㅡㅡ;; [1] 박정희대통령갤로그로 이동합니다. 12.01 40 1
2905937 "'트럼프시대 美활동' 중국계 연구자, 문화대혁명 같은 혼란 중" 발명도둑잡기(39.7) 12.01 21 0
2905936 박민호 d-_-b_mh@daum.net 더 많은 계정정보 보기 99+ 프갤러(222.116) 12.01 12 0
2905935 [단독] 정부, 쿠팡에 최대 1조3300억 과징금 … 국민 정보 통째 유 발명도둑잡기(39.7) 12.01 29 0
2905934 난 정치에 관심은 없지만 [2] 사람낚는어부갤로그로 이동합니다. 12.01 67 1
2905933 열혈 백업 중..ㅇㅅㅇ [7] 헤르 미온느갤로그로 이동합니다. 12.01 40 0
2905932 WPF 쓰면 쓸수록 역하네 이거 [5] 거북이속이거북갤로그로 이동합니다. 12.01 72 0
2905929 친중도 나쁘지 않은 듯 ㅇㅇ(114.30) 12.01 38 0
2905928 내일 그만둔다고 해야지 [2] ㅇㅇ(118.235) 12.01 55 0
2905927 책읽기 귀찮다 [1] 사람낚는어부갤로그로 이동합니다. 12.01 59 0
2905926 [대한민국] 윤석열 대통령 - 연성 메시지 계엄 강조 ㅇㅇ(121.172) 12.01 21 1
2905925 네카라쿠베 쿠팡 가려면 중국인 되야 한다네 [1] 발명도둑잡기(39.7) 12.01 38 0
2905924 진보정당 역사의 6가지 교훈과 재구성의 길 발명도둑잡기(39.7) 12.01 20 0
2905922 안녕하세요. 프갤러(125.177) 12.01 20 0
2905921 바람은 찬데 저녁노을은 따스하구낭❤+ [2] ♥발라당냥덩♥갤로그로 이동합니다. 12.01 42 0
2905920 팀프로젝트 말고 1인 프로젝트만 교육시켜주는 프로그램은 없음? [1] 프갤러(221.166) 12.01 23 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2