디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.11.26 20:23:15
조회 118 추천 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/08 - -
AD 루틴 ON! 운동 찐템! 지금 할인 중 운영자 25/11/27 - -
2905913 호떡의 계절..❤+ [3] 따당갤로그로 이동합니다. 12.01 117 0
2905912 나 더이상 못버티겠어 퇴사해야할듯해.. [3] ㅇㅇ(211.235) 12.01 154 0
2905911 형들 이거 뭐임? [4] 프갤러(118.235) 12.01 126 0
2905910 군대는 언제감? [6] ㅇㅇ갤로그로 이동합니다. 12.01 103 0
2905909 요새 여기 저기 개인정보 털리네 [2] 류류(121.140) 12.01 83 0
2905908 안녕하세요. ㅇㅇ(118.221) 12.01 60 0
2905907 한국 프로그래머 커뮤니티 추천좀 [3] Fhiwjsjsjeje갤로그로 이동합니다. 12.01 147 0
2905904 리눅스 유료로 변환되누 ㅋㅋㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 12.01 108 0
2905902 미국회사 쿠팡은 한국고객 개인정보보호나 한국 노동자 인권에 관심이 없다 발명도둑잡기(39.7) 12.01 60 0
2905901 주한미군의 ‘뒤집힌 지도’와 전략적 유연성 발명도둑잡기(39.7) 12.01 67 0
2905900 남자는 애인이나 아내가 없으면 포악해진다 발명도둑잡기(118.235) 12.01 62 0
2905899 쿠팡 개인정보 유출은 중국인 개발자 소행 [4] chironpractor갤로그로 이동합니다. 12.01 131 2
2905898 개발일하면서 주식투자 공부해왔는데 [2] ㅇㅇ(116.43) 12.01 108 0
2905896 [단독] “북한 오물풍선전, 사실상 국군이 먼저 도발…아군에도 비밀이었다 발명도둑잡기(118.235) 12.01 57 0
2905895 빅테크 기업은 C++ 로 개발하냐? [2] 프갤러(59.16) 12.01 107 0
2905889 방구가 진짜 미칠듯이 나옴 [8] 개멍청한유라갤로그로 이동합니다. 12.01 112 0
2905888 혹시 DLL 인젝션 고수있음? [11] 프갤러(1.213) 12.01 172 0
2905887 아~~~~~~~~~~~ [9] 개멍청한유라갤로그로 이동합니다. 12.01 102 0
2905886 Lua script하는 친구들 많아? [10] 프갤러(1.213) 12.01 137 1
2905883 나님… 멧챠 카와이.. ❤+ [2] 따당갤로그로 이동합니다. 12.01 138 0
2905881 나의 인버스 동지들 맘고생이 많소 [4] chironpractor갤로그로 이동합니다. 12.01 103 0
2905879 컴컴.. ㅇㅅㅇ [3] 헤르 미온느갤로그로 이동합니다. 12.01 93 0
2905877 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 12.01 51 0
2905876 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 12.01 88 0
2905871 인지과학조져라 손발이시립디다갤로그로 이동합니다. 12.01 92 0
2905869 결국 jemalloc 래핑하는 걸로 타협봤어요 [1] 나르시갤로그로 이동합니다. 12.01 80 0
2905862 요즘에 AI가 나오니까 시니어 1명 주니어 다수 형태로 가는거같음 프갤러(58.76) 12.01 100 0
2905853 코로나때 국비고졸로 취업했었다면 어땟을까 ㅇㅇ(211.235) 12.01 126 0
2905845 어떤 주장을 할 때 느끼는거지만 [5] 루도그담당(58.233) 12.01 134 1
2905810 방귀 냄새를 맡는다고? 떵을 먹겟다는 소리냐? [8] 헬마스터(211.35) 12.01 340 8
2905795 개발자 연봉 왤케 내려갔냐 ㅇㅇ(117.111) 12.01 141 0
2905781 취업이 낳냐 창업이 낳냐 [3] ㅇㅇ갤로그로 이동합니다. 12.01 127 0
2905774 ai 대체드립 이거 굉장히 좋은듯 [7] 프갤러(110.8) 12.01 160 0
2905771 IT굽삐 광고가 이제 [2] 개멍청한유라갤로그로 이동합니다. 12.01 121 0
2905745 지금 신입 ㅈ된거 아니냐 [5] ㅇㅇ갤로그로 이동합니다. 11.30 212 0
2905740 파이썬 어케 실행하냐고 묻는 개발자 어케 생각함? [6] 프갤러(218.153) 11.30 167 1
2905739 IT 인력을 좀 줄일 필요는 있는 듯 [1] ㅇㅇ(114.30) 11.30 155 0
2905738 IT 배우려면 인도 기업 가라는 이유 [4] 프갤러(124.54) 11.30 178 1
2905736 12.3 계엄 그날의 시계는 돌아온다. [그날의 의미] [누군가의 길에서 넥도리아(220.74) 11.30 59 0
2905735 혹시 이제 코딩 c언어 몰라도 할수있는 정도임? [1] 흑인갤로그로 이동합니다. 11.30 152 0
2905734 큰 결심을 하려 한다. 넥도리아(220.74) 11.30 86 0
2905724 디시 클리너 돌리기 어려움?? [11] ㅇㅇ(175.214) 11.30 117 0
2905719 님들 혹시 다이어그램 같은 거 직접그림? [2] ㅇㅇ(115.140) 11.30 111 0
2905710 한달에 100km 정도 뛰는듯? [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 141 0
2905709 2000년대 머리스탈이 지금보다 낳지않냐? [4] 헬마스터갤로그로 이동합니다. 11.30 112 0
2905708 나님 슬슬 졸린.. [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 138 0
2905698 프갤 뛰뛰크루 냥덩런 명단과 일정 짜봄(초보자용) [7] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 133 0
2905696 [애니뉴스] 소설 공모전 ㅇㅇ(121.172) 11.30 65 0
2905694 나님 프갤 뛰뛰크루 만들깡? [3] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 132 0
2905692 확실히 뛰뛰하면 맘마 소화가 잘됨 [4] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 90 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2