TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 27 READS

C++·Zig·C3의 컴파일타임 리플렉션, 무엇이 다른가

C++·Zig·C3의 컴파일타임 리플렉션, 무엇이 다른가
SOURCE IMAGE · HACKER NEWS

리플렉션(reflection)은 프로그램이 자기 자신의 구조—타입, 열거형, 구조체 멤버 등—를 들여다보고 조작하는 기능이다. 흔히 런타임에 이뤄지는 기능으로 알려져 있지만, 시스템 프로그래밍 영역에서는 이 작업을 컴파일 시점에 끝내는 쪽이 선호된다. 실행 중 비용을 전혀 발생시키지 않으면서도 타입 정보를 활용할 수 있기 때문이다. 최근 한 개발자가 C++, Zig, 그리고 상대적으로 덜 알려진 C3 세 언어의 컴파일타임 리플렉션 방식을 비교한 글은, 같은 목표를 세 언어가 각기 다른 문법 철학으로 풀어내는 모습을 잘 보여준다.

세 언어의 접근 방식

세 언어 모두 컴파일 시점 리플렉션을 지원하지만 구현 수단이 다르다. C++은 곧 도입될 리플렉션 기능을 템플릿 기반의 정교한 메타프로그래밍과 스플라이스(splice) 문법으로 제공한다. 강력하지만 문법이 장황하다는 점은 오래된 지적이다. Zig는 매크로 자체가 없다. 대신 comptime 함수와 블록, inline for 루프, 그리고 타입을 들여다보는 내장 함수(type-introspection builtins)를 조합해 같은 일을 해낸다. 매크로에 의존하지 않는 현대적이고 비교적 읽기 쉬운 방식이라는 평가를 받는다.

C3는 이 지점에서 독특한 선택을 했다. 컴파일 시점에 실행되는 변수와 제어 흐름 구문 앞에 모두 $ 기호를 붙이도록 강제한 것이다. 이는 코드를 읽는 사람이 어느 부분이 컴파일 타임에 확장되고 어느 부분이 런타임에 실행되는지를 문법만 보고 즉시 구분하도록 의도한 설계다. 컴파일타임 평가와 리플렉션은 매크로를 통해 수행한다. C3는 GC나 예외, RAII 같은 무거운 런타임 요소를 배제하고 C ABI 호환성을 기본 제공하는, C/C++ 개발자에게 친숙함을 노린 신생 언어다.

열거형과 구조체 메타데이터의 실제 차이

비교에서 드러나는 실질적 차이는 열거형 처리에서 두드러진다. C3의 열거형은 특별한 속성을 갖는다. 예컨대 열거값을 출력하면 소스에 정의된 그대로 사람이 읽을 수 있는 형태가 나온다. Color.RED를 출력하면 0이 아니라 RED가 찍히는 식이다. 내부 정수값이 필요하면 .ordinal에 접근하거나 기반 타입으로 캐스팅하면 된다. 또한 각 열거자에 임의 타입의 값을 연결할 수도 있다. 반면 글쓴이는 Zig에서 열거형을 문자열로 바꾸려면 각 열거형마다 메서드를 붙이는 수밖에 떠오르지 않는다고 밝히며, 이것이 범용적 해법은 아니라고 스스로 단서를 달았다. 자신이 Zig 전문가가 아니라는 전제를 명시한 대목이라, 이 부분은 하나의 주장으로 받아들이는 편이 낫다.

구조체 멤버에 컴파일 시점 데이터를 붙이는 문제에서도 차이가 난다. 글쓴이는 Zig에는 '어트리뷰트'나 이를 대체할 수단이 없어 구조체 멤버에 컴파일타임 메타데이터를 부착하기 어렵다고 지적한다. C3는 두 가지 경로를 제시한다. 하나는 모든 검증을 컴파일 시점에 끝내는 방식으로, 매크로에 @const 어트리뷰트를 붙여 이를 쉽게 확인할 수 있다. 다른 하나는 컴파일타임 어트리뷰트와 런타임 검증을 섞는 방식이다. 여기서 $ifif의 문법적 구분이 어느 코드가 확장되고 어느 코드가 실행되는지를 이해하는 데 도움을 준다. 아울러 C3는 '컨트랙트(contract)'라 불리는 선택적 사전 조건을 지원해 입력 검증을 돕는데, 가능하면 컴파일 시점에, 불가능하면 런타임에 실행된다.

실무자에게 주는 시사점

세 언어 모두 진짜 컴파일타임 리플렉션이 가능하다는 점은 실무적으로 의미가 크다. 직렬화기(serializer), 디버그 출력기, 그리고 범용 헬퍼 같은 도구를 런타임 오버헤드 없이 만들 수 있기 때문이다. 결국 선택의 기준은 능력의 유무가 아니라 편의성과 가독성으로 옮겨간다. C++은 강력함을 장황한 템플릿 기계장치의 대가로 얻고, C3는 매크로 시스템과 $ 문법 덕에 같은 개념을 더 읽기 쉽고 표현력 있게 드러낸다. Zig는 매크로 없이도 현대적이고 대체로 명료한 결과를 낸다. 코드가 어디서 실행되는지를 문법 차원에서 강제로 드러내는 C3의 설계는, 메타프로그래밍이 복잡해질수록 유지보수 관점에서 분명한 장점이 될 수 있다.

다만 이 비교가 특정 언어를 옹호하는 개인 블로그에서 나왔다는 점은 감안할 필요가 있다. 글쓴이는 C3가 Zig나 Odin과 충분히 경쟁할 수 있는 유망한 언어인데도 마케팅이 부족해 저평가됐다고 본다. 버전 안정성에 대한 주장도 곁들인다. C3는 이미 0.8.x대에 진입해 1.0이 가깝지만, Zig는 10년 넘게 개발되고도 0.1x대에 머물러 있다는 것이다. 이런 서술은 명백히 저자의 관점이므로, 실무 도입을 검토한다면 각 언어의 실제 로드맵과 생태계 성숙도, 라이브러리와 툴체인 지원을 직접 확인하는 편이 안전하다. 리플렉션 기능 하나만 놓고 보면 세 언어의 격차보다는 각자의 문법 철학 차이가 더 흥미로운 관전 포인트다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://nyr24.github.io/blog/reflection-comparison/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...