# C99를 위한 Algebraic Data Types 도입

> Clean Markdown view of GeekNews topic #14742. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=14742](https://news.hada.io/topic?id=14742)
- GeekNews Markdown: [https://news.hada.io/topic/14742.md](https://news.hada.io/topic/14742.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-05-10T10:04:01+09:00
- Updated: 2024-05-10T10:04:01+09:00
- Original source: [github.com/Hirrolot](https://github.com/Hirrolot/datatype99)
- Points: 1
- Comments: 0

## Topic Body

### 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 등이 있음.

## Comments



_No public comments on this page._
