1P by neo 7달전 | favorite | 댓글과 토론

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 버전 사용 권장.

유닛 타입

  • UnitT99unit_v99로 제공됨.

GN⁺의 의견

  • Datatype99를 사용하면 C에서도 대수적 데이터 타입을 안전하고 간편하게 사용할 수 있어 큰 장점이 있어 보임. 기존 C 코드베이스에 통합하기도 쉬울 것 같음.
  • 다만 C++에서 사용한다면 템플릿이나 constexpr 등 언어 자체 기능과 중복되는 부분이 있을 듯함. C에 비해 이점이 줄어들 수 있음.
  • 컴파일 타임에 안전성을 보장하는 것이 큰 장점이지만, 동적으로 데이터 타입이 바뀌는 경우에는 활용하기 어려울 것 같음. 정적 타이핑의 한계.
  • 소규모 프로젝트라면 직접 구현해도 되겠지만, 코드 베이스가 커지면 Datatype99 같은 라이브러리를 활용하는게 생산성과 안정성 측면에서 도움될 듯함.
  • 유사한 기능을 제공하는 라이브러리로는 LibADT, Kitsune, P99 등이 있음.