TECH 으로 돌아가기
TECH HACKER NEWS 2026.11.02 15:44 7분 읽기 26 READS

Copper: C만큼 가볍게, 객체지향과 제네릭만 얹은 미니멀 저수준 언어

또 하나의 더 나은 C

Copper라는 작은 프로그래밍 언어가 소개됐어요. 스스로를 ‘객체지향(OOP)과 제네릭을 갖춘 미니멀한 저수준 언어’라고 설명하는데요. 이 한 줄에 요즘 시스템 프로그래밍 언어 설계에서 가장 뜨거운 고민이 담겨 있어요. C처럼 단순하고 빠르게 가면서, C에 없는 편의 기능을 어디까지 넣을 거냐는 고민이죠.

용어부터 짚고 갈게요. 저수준 언어는 하드웨어에 가까운 언어를 말해요. 메모리를 어디에 얼마나 쓸지 개발자가 직접 관리하고, 코드가 어떤 기계어로 바뀔지도 대략 예측할 수 있어요. 대표 선수가 C예요. C는 50년 넘게 운영체제와 임베디드 분야의 표준이었는데, 큰 프로그램을 짜다 보면 아쉬운 점이 많아요. 비슷한 코드를 타입마다 복사해야 하고, 객체지향 스타일로 짜려면 함수 포인터를 손으로 엮어야 하거든요. Copper 같은 언어는 이 빈자리를 최소한으로만 채워 보려는 시도예요.

저수준에서 OOP와 제네릭은 어떻게 동작할까

Copper의 정확한 문법과 구현 방식은 공식 문서와 예제로 확인하는 게 좋아요. 다만 저수준 언어가 이 두 기능을 넣을 때 보통 어떤 선택을 하는지 알아 두면, 이런 언어를 훨씬 잘 읽을 수 있어요.

OOP의 핵심은 vtable이에요. 도형마다 넓이를 구하는 방법이 다르다는 걸 코드로 표현하고 싶다고 해 볼게요. 그러면 객체마다 ‘내 넓이 함수는 여기 있어’라고 적힌 표를 들고 다니게 하면 돼요. 이 표를 가상 함수 테이블, 줄여서 vtable이라고 불러요. C로 직접 쓰면 이런 모양이에요.

struct Shape;
struct ShapeVTable {
double (area)(struct Shape self);
};
struct Shape {
const struct ShapeVTable *vt;
};
// 호출할 때: s->vt->area(s)

C++의 가상 함수도 내부에서는 이렇게 동작해요. OOP를 지원하는 저수준 언어는 이 반복 작업을 컴파일러가 대신 해 주는 거예요. 대신 함수를 한 번 더 찾아가는 비용이 생겨요. 그래서 성능을 중시하는 언어일수록 이 비용을 코드에서 얼마나 눈에 보이게 할지 신중하게 정해요.

제네릭은 크게 두 가지 방식이 있어요. 하나는 단형화(monomorphization)예요. 이게 뭐냐면, max<int>와 max<double>을 쓰면 컴파일러가 타입별로 함수를 따로 찍어내는 방식이에요. C++ 템플릿과 러스트가 이렇게 해요. 실행은 빠르지만, 바이너리 크기와 컴파일 시간이 늘어나요. 다른 하나는 타입 정보를 지우고 코드 하나로 처리하는 방식이에요. C의 void*나 자바 제네릭이 여기에 가까워요. 코드는 작아지지만 실행 비용이 생기거나 타입 안전성이 약해질 수 있어요.

결국 미니멀하다는 건 이런 선택지 중에 꼭 필요한 것만 고른다는 뜻이에요. 그래서 언어 전체를 한 사람이 머릿속에 담을 수 있을 만큼 작게 유지하는 거죠. C++이 ‘C with Classes’로 시작했다가 지금은 누구도 전부 안다고 말하기 어려운 언어가 된 걸 떠올려 보면, 이렇게 절제하는 게 얼마나 어려운지 알 수 있어요.

비슷한 언어들과 비교해 보면

더 나은 C를 꿈꾸는 언어는 정말 많아요. Zig는 상속 같은 OOP 기능을 넣지 않았어요. 제네릭은 컴파일 타임에 코드를 실행하는 comptime으로 해결하고요. Odin은 제네릭은 지원하지만 메서드는 일부러 넣지 않았어요. C3는 C 문법을 최대한 유지하면서 메서드와 제네릭 모듈을 더했고요. Hare는 아예 제네릭을 빼고 극단적인 단순함을 택했어요. Go가 제네릭을 넣기까지 10년 넘게 논쟁한 것도 같은 맥락이에요. 그만큼 뭘 넣지 않을지가 언어의 성격을 결정해요. 이 스펙트럼에서 Copper는 OOP와 제네릭을 둘 다 품으면서 작게 유지하려는 쪽에 서 있어요. 그 균형을 어떻게 잡았는지가 관전 포인트예요.

한국 개발자에게 주는 시사점

솔직히 Copper를 당장 실무에 도입할 일은 거의 없을 거예요. 이런 작은 언어는 생태계, 라이브러리, 장기 유지보수 면에서 한계가 분명하거든요. 그래도 배울 거리로는 정말 좋은 재료예요.

미니멀 언어는 전체 구조가 작아요. 그래서 컴파일러가 OOP와 제네릭을 기계어 수준으로 어떻게 풀어내는지 따라가 보기 좋아요. 자바나 C++, 러스트를 쓰다가 ‘가상 함수 호출이 왜 느리다는 거지?’, ‘러스트 빌드는 왜 이렇게 오래 걸리지?’ 하고 궁금했던 적 있다면, 그 답이 바로 위에서 본 vtable과 단형화에 있어요. 직접 언어를 만들어 보고 싶다면 『Crafting Interpreters』 같은 책을 보면서, 이런 작은 언어의 문서와 소스도 같이 읽어 보세요.

마무리

Copper는 C의 단순함에 최소한의 추상화만 더한다는 오래된 숙제에 내놓은 또 하나의 답안이에요.

C에 기능을 딱 하나만 추가할 수 있다면 뭘 고르시겠어요? 저수준 언어에 OOP는 꼭 필요하다고 보시나요, 아니면 Zig나 Odin처럼 빼는 게 맞다고 보시나요?


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://tibleiz.net/copper/
SHARE
NEXT · CHOOSE

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

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

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