디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.11.26 20:23:15
조회 79 추천 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/11/24 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48794 65
2905619 아 서비스회사 오니까 주말에도 자꾸 찾네 ㅅㅂ ㅇㅇ(1.244) 15:11 4 0
2905617 냥덩 발명 없는 새로운 프갤 뉴프로로 와라 헬마스터갤로그로 이동합니다. 14:49 17 1
2905613 물론 러스트로 작성해도 sql인젝션 못막는거 맞아 [3] 프갤러(42.18) 14:31 27 0
2905612 ㅉㅉ 러스트로 개발했으면 짱개가 못털어갔을것을 프갤러(223.63) 14:27 16 1
2905600 인지과학조져라 손발이시립디다갤로그로 이동합니다. 13:36 18 0
2905599 중국인이 아니라 오픈소스 때문에 털린거겠지 [1] ㅇㅇ(114.30) 13:36 52 1
2905598 요즘드는 의문 [2] 슈퍼막코더(126.253) 13:18 48 0
2905597 아레나 할당기 설계 구현 gg침 [2] 나르시갤로그로 이동합니다. 13:18 22 0
2905596 프갤은 관리자가 없냐 냥덩이랑 발도잡 관리필요 [1] 사람낚는어부갤로그로 이동합니다. 13:04 27 0
2905595 [애니뉴스] 깃허브 애니뉴스 모바일버전 지원 ㅇㅇ(121.172) 12:33 16 0
2905594 [애니뉴스] pienovel.web.app 코드 수정 ㅇㅇ(121.172) 12:31 14 0
2905592 ㅈ소에서 이 경험해본적 있나 [2] ㅇㅇ(118.235) 12:24 48 0
2905583 나는 사실 무당이야 [6] 사람낚는어부갤로그로 이동합니다. 11:32 78 0
2905581 국비신입 받아본적 있냐 [20] 프갤러(222.96) 11:26 94 0
2905579 무능극좌 폭동배급견 4050 범죄자세대 ♥멘헤라냥덩♥갤로그로 이동합니다. 09:09 32 1
2905578 vscode에서 파이썬 인터프레터가 안 뜨는데 왜 그런거야? [2] 프갤러(203.249) 08:46 41 0
2905576 쿠팡 개인정보 유출은 중국인 전직원의 소행 [8] chironpractor갤로그로 이동합니다. 08:41 85 1
2905575 낙상홍 ㅇㅅㅇ [4] 헤르 미온느갤로그로 이동합니다. 08:21 39 0
2905574 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:19 23 0
2905573 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:18 35 0
2905572 Ada: 사용자 정의 메모리 관리 (Storage Pools) 나르시갤로그로 이동합니다. 06:27 27 0
2905570 내가 퇴물이 되어감을 느낄때 [1] 프갤러(45.150) 05:07 47 0
2905558 SNS 강타 1,200억 누리호vs한강버스 1,500억 발명도둑잡기(118.216) 03:24 31 0
2905554 프갤 XSS 아직도 되나 [2] ㅇㅇ(119.197) 02:05 53 0
2905553 이거 왜 스크립트 실행이 안되냐 [2] ㅇㅇ(119.197) 01:59 72 0
2905552 바카라 사이트 디시 먹튀 없는곳 ㅇㅇ(122.26) 01:53 21 0
2905547 일본 취업 유학 워홀 여행 관련모임 ㅇㅇ(106.146) 11.29 74 0
2905546 30초중반 직딩인데 여기서 뭘 더 따야 승승장구 가능? 관세사는 안될듯. ㅇㅇ(203.232) 11.29 100 0
2905545 음기 충전 발명도둑잡기(118.216) 11.29 69 0
2905544 전작권, '미국 허락' 기다리다 100년 간다 "통보하고 가져와야 발명도둑잡기(118.216) 11.29 23 0
2905543 탑 명문대 정시 입결!J 프갤러(121.142) 11.29 73 2
2905542 440억짜리 미군 무인기, 왜 서해에서 떨어졌나 발명도둑잡기(118.216) 11.29 24 0
2905541 [칼럼] 다카이치에게서 윤석열과 젤렌스키가 보인다 [2] 발명도둑잡기(118.216) 11.29 44 0
2905539 “주한·주일미군 철수로 예산 절감해야”…제프리 삭스 교수 주장 발명도둑잡기(118.216) 11.29 23 0
2905537 나님은 미래를 걷는당⭐ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.29 89 0
2905535 졸리당.. ♥멘헤라냥덩♥갤로그로 이동합니다. 11.29 66 0
2905534 발정난 멍퀴벌레 회생방안 [3] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.29 62 0
2905532 위키드 : 누가 마녀가 되는가 - 정상성, 혐오, 그리고 연대의 정치 발명도둑잡기(118.216) 11.29 22 0
2905531 왜 나님께 이런일이.. [5] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.29 55 0
2905530 [기자수첩] ‘체제 전쟁’이라는 허구와 민주공화국의 위기 발명도둑잡기(118.216) 11.29 24 0
2905529 [이슈] "당장 내려와!" 몸싸움 벌어진 국힘 장외 투쟁 발명도둑잡기(118.216) 11.29 34 0
2905528 [사설] 야4당 정치개혁 요구, 이제 민주당이 결자해지해야 한다 발명도둑잡기(118.216) 11.29 26 0
2905527 오늘의 만화 실마리: 하나님이 주신 크리스마스 선물 전광훈 발명도둑잡기(118.216) 11.29 22 0
2905524 “교사·공무원에 정치기본권 주면 정치판 된다? 공포 조장일 뿐, 문제 안 발명도둑잡기(118.216) 11.29 22 0
2905521 쿠팡 "개인정보 노출계정 3천370만개"…사실상 다 털렸다 발명도둑잡기(118.216) 11.29 26 0
2905518 술 마셨는데 일찍 자야지 발명도둑잡기(118.216) 11.29 22 0
2905517 지금껏 다녀본 업소들 유형별 특징.txt ㅇㅇ(118.235) 11.29 53 0
2905505 요즘 내가 너무 발전이 없어.. [3] cvs.갤로그로 이동합니다. 11.29 61 0
2905503 "전 고객 털렸다"‥쿠팡 개인정보 3천370만 건 무단 유출 [1] 발명도둑잡기(211.234) 11.29 954 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2