GN⁺: C99를 위한 Algebraic Data Types 도입
(github.com/Hirrolot)Datatype99
안전하고 직관적인 대수적 데이터 타입을 제공하는 라이브러리로, 소진적 패턴 매칭과 컴파일 타임 내성 기능을 제공함. 순수 C99로 구현되어 있어 외부 도구가 필요 없음.
주요 특징
- 타입 안전성: 부적절한 타입의 변형, 불완전한 패턴 매칭, 유효하지 않은 필드 접근 등이 컴파일 타임에 검출됨.
- 이식성: 표준을 준수하는 C99 컴파일러만 있으면 됨. 표준 라이브러리나 컴파일러/플랫폼 특정 기능, VLA 등이 필요하지 않음.
- 예측 가능성: 공식적인 코드 생성 의미론이 정의되어 있어, 생성된 데이터 레이아웃이 항상 동일함을 보장함.
- 이해하기 쉬운 오류: 잘못된 코드에 대해 강건함.
- 실전에서 검증됨: OpenIPC에서 IP 카메라용 실시간 스트리밍 소프트웨어 개발에 사용되고 있음. RTSP 1.0 구현과 약 5만줄의 비공개 코드 등이 포함됨.
설치
- Datatype99는 하나의 헤더 파일
datatype99.h
와 하나의 의존성 Metalang99로 구성됨. - CMake를 사용한다면
FetchContent
를 통해 가져오는 것이 권장됨. - 필요하다면 프리컴파일 헤더를 사용할 수 있음. 컴파일 시간을 줄일 수 있음.
사용법
- Datatype99는 태그된 공용체에 대한 단순한 문법 설탕임. 더 안전하고 간결함.
- 이진 트리 예시:
- C로 직접 구현하려면 구조체와 공용체, 열거형 등을 사용해야 함
- Datatype99로는 간단히
datatype
매크로 호출로 정의 가능 - 패턴 매칭을 사용해 트리의 합을 구하는 것도 간단함
- 컴파일 타임 안전성: 잘못된 변형의 바인딩에 접근하면 컴파일 오류 발생
- 유연성: 바인딩은 포인터 타입이라 변경 가능하고, 역참조해서 값을 얻을 수 있음
- 변형 생성자 함수가 자동 생성됨
- 패턴 매칭에 대한 간단한 설명:
- 기본 케이스 매칭은
otherwise
- 바인딩 무시는
_
사용 -
of
,ifLet
에서는 최상위break
/continue
사용 금지.goto
레이블 사용.
- 기본 케이스 매칭은
문법과 의미론
- EBNF 문법 정의와 의미론 설명이 제공됨.
- 라이브러리 헤더에서는 매크로의 postfix 버전 사용 권장.
유닛 타입
-
UnitT99
와unit_v99
로 제공됨.
GN⁺의 의견
- Datatype99를 사용하면 C에서도 대수적 데이터 타입을 안전하고 간편하게 사용할 수 있어 큰 장점이 있어 보임. 기존 C 코드베이스에 통합하기도 쉬울 것 같음.
- 다만 C++에서 사용한다면 템플릿이나 constexpr 등 언어 자체 기능과 중복되는 부분이 있을 듯함. C에 비해 이점이 줄어들 수 있음.
- 컴파일 타임에 안전성을 보장하는 것이 큰 장점이지만, 동적으로 데이터 타입이 바뀌는 경우에는 활용하기 어려울 것 같음. 정적 타이핑의 한계.
- 소규모 프로젝트라면 직접 구현해도 되겠지만, 코드 베이스가 커지면 Datatype99 같은 라이브러리를 활용하는게 생산성과 안정성 측면에서 도움될 듯함.
- 유사한 기능을 제공하는 라이브러리로는 LibADT, Kitsune, P99 등이 있음.