디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.11.26 20:23:15
조회 107 추천 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 루틴 ON! 운동 찐템! 지금 할인 중 운영자 25/11/27 - -
2905208 경력기술서쓰는데 궁금한거 있음 [7] 프갤러(58.76) 11.28 118 0
2905207 미국 음반 시장 순위 조작을 위한 사재기 있나 발명도둑잡기(39.7) 11.28 156 0
2905203 <하우스 오브 다이너마이트> 인기래서 생각나는 예전 글 발명도둑잡기(39.7) 11.28 60 0
2905200 오늘의 소설, 영화 실마리: 초코파이 재판과 노조원 이야기 발명도둑잡기(39.7) 11.28 62 0
2905195 이익 배분 게임과 지능의 상관관계 [1] 발명도둑잡기(39.7) 11.28 100 0
2905193 넷마블 해킹 SQL 인젝션 추정 [1] ㅇㅇ(175.197) 11.28 111 0
2905191 넥스트 N.EX.T-Dear America 무삭제 발명도둑잡기(39.7) 11.28 63 0
2905190 아니 잼미니 미친년 지맘대로 배포 해버리네 ㅋㅋ 프갤러(218.236) 11.28 84 0
2905187 슈베르트-마왕 발명도둑잡기(39.7) 11.28 54 0
2905186 제리케이-마왕 발명도둑잡기(39.7) 11.28 50 0
2905185 요즘 어셈으로 짤 일이 많아서 그런가 [1] 루도그담당(58.233) 11.28 91 0
2905184 수이 블루비드 다녀옴 [1] 따당갤로그로 이동합니다. 11.28 95 0
2905181 나님 콧대가 그렇게 이뽀..? 따당갤로그로 이동합니다. 11.28 113 0
2905179 독도 간접 언급한 中, 포털사이트·AI도 “독도는 한국 땅” 발명도둑잡기(39.7) 11.28 61 0
2905178 페이커닮은 개발자 찾습니다 [2] 프갤러(106.101) 11.28 119 0
2905177 언리얼 메뉴얼 진짜 거지같네 [4] 프갤러(114.205) 11.28 100 0
2905175 개발하냐고 글 쓸 시간도 없고 ㅁㅌ겠네 ㅠㅠ [4] 나르시갤로그로 이동합니다. 11.27 77 0
2905174 세계최초의 최상위 수준 C API 래핑 설계 패턴인가? 나르시갤로그로 이동합니다. 11.27 95 0
2905173 N-Arity 제네릭 래퍼 + 중앙 집중식 예외 매퍼' 아키텍처 나르시갤로그로 이동합니다. 11.27 63 0
2905172 Clair 라이브러리: 예외 처리 C 바인딩 아키텍처 [1] 나르시갤로그로 이동합니다. 11.27 101 0
2905171 옛날에 nuri.net이 뭐였더라 발명도둑잡기(39.7) 11.27 62 0
2905170 중국 딥시크가 미국 AI 압살하는중 ㄷㄷ [4] ㅇㅇ갤로그로 이동합니다. 11.27 121 0
2905169 ‘성폭력 발언’ 이준석 불송치에…“막말 자유권은 없다” 반발 봇물 발명도둑잡기(39.7) 11.27 69 0
2905168 민주당, '2인선거구로 쪼개기'에 합세한다면 내란본당 국민의힘 부활 발명도둑잡기(39.7) 11.27 67 0
2905167 뭔가 소화가 잘 안된느낌 [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 97 0
2905166 [애니뉴스] YxD Labs - 유튜브 링크 공유 ㅇㅇ(121.172) 11.27 59 0
2905165 MS 엣지브라우저 msn에 중요 노출되는 극우 황색지들 발명도둑잡기(39.7) 11.27 58 0
2905164 이세돌이 바둑 은퇴한거 이제 실감난다 [1] 프갤러(110.70) 11.27 81 0
2905163 컴퓨터로 일하는데 싸구려컴 쓰는 이유가 뭐임? [5] 에이도비갤로그로 이동합니다. 11.27 107 0
2905161 안타까운 점은 대충 아는 애들이 확신에 차있다는거임 [14] 박민준갤로그로 이동합니다. 11.27 136 3
2905160 50위권 밖에 있는 언어들은 대체 왜 만든거냐? [2] 두정갑(221.149) 11.27 92 0
2905157 에구궁 피궁타 ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 77 0
2905156 Go 개발환경은 LiteIDE와 VS-Code 둘 중 어느 게 나음? [2] 두정갑(221.149) 11.27 87 0
2905150 몇 시간 전부터 내 방 두번째 공유기가 재부팅 해도 발명도둑잡기(39.7) 11.27 59 0
2905149 나씻주준⭐+ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 73 0
2905148 자바가 러스트보다 좋은 부분 나르시갤로그로 이동합니다. 11.27 74 1
2905144 ㅊㅗ큼만 더 ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 71 0
2905142 백엔드 퇴사하고 국비 클라우드 인프라 과정 어떤가요 [5] 프갤러(115.23) 11.27 141 0
2905141 하긴 지금이야 러이브러리 차원에서 많이들 크로스 os 지원하는거지 [1] 프갤러(110.8) 11.27 76 0
2905140 그러니까 이 자바 이식성도 개소린게 [5] 프갤러(110.8) 11.27 110 0
2905139 님들 기획서 쓸때 프로그램 머씀? 뉴진파갤로그로 이동합니다. 11.27 43 0
2905138 님들 기획서 쓸때 프로그램 머씀? [2] 뉴진파갤로그로 이동합니다. 11.27 69 0
2905137 틀렸다. 힙 메모리 64mb로 제한해도 여전히 280mib처먹는다. [2] 프갤러(110.8) 11.27 91 0
2905135 진정하자. jvm도 메모리 할당 옵션이 있겠지 [3] 프갤러(110.8) 11.27 84 0
2905134 처 돌았네 자프링 헬로월드만 띄워도 램 300mib 처먹는다. [2] 프갤러(110.8) 11.27 99 0
2905130 졸렬두 할건 하구 자우징좌우지징 ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 69 0
2905129 일단 러스트가 자바보다 뛰어난건 그냥 사실이고 [2] 프갤러(110.8) 11.27 108 0
2905127 슬슬 자바 조끔 해보고 있는데 [6] 프갤러(110.8) 11.27 105 0
2905126 #나님#왤케#뭔가뭔가임#특별 ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 60 0
2905123 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 60 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2