
프로그래밍 언어를 고를 때 늘 따라다니는 고민이 있어요. "성능과 안전함을 챙기자니 Rust는 동시성 코드가 너무 빡세고, 동시성을 쉽게 가자니 Go는 GC(가비지 컬렉터) 때문에 가끔 멈칫거리고..." 이 둘 사이에서 하나를 포기해야 했는데, Gossamer라는 새 언어가 "둘 다 가질 수 있지 않을까?"라고 묻고 나왔어요.
두 언어의 장단점부터
먼저 배경을 짚어볼게요. Rust는 '소유권(ownership)'이라는 규칙으로 메모리를 관리해요. 누가 이 데이터의 주인인지를 컴파일 단계에서 엄격하게 따져서, GC 없이도 메모리 안전성을 보장하죠. 덕분에 빠르고 멈칫거림이 없어요. 대신 비동기 동시성 코드를 짜다 보면 async/await이며 라이프타임이며 신경 쓸 게 많아 손이 많이 가요. 흔히 말하는 '함수 색칠 문제(function colouring)'처럼 비동기 함수와 동기 함수가 갈라지는 불편함도 있고요.
반대로 Go에는 고루틴(goroutine)이라는 무기가 있어요. 이게 뭐냐면, 운영체제 스레드보다 훨씬 가벼운 '경량 스레드'예요. go 한 단어만 붙이면 함수가 동시에 실행되고, 수십만 개를 띄워도 부담이 적어요. 동시성 코드가 정말 쉽죠. 대신 메모리를 GC가 자동으로 청소하는데, 가끔 이 청소를 하느라 프로그램 전체가 잠깐 멈추는 'stop-the-world' 순간이 생겨요. 실시간성이 중요한 시스템에선 이 멈칫거림이 치명적일 수 있고요.
Gossamer가 노리는 지점
Gossamer는 이름 그대로 'Rust 풍미(Rust-flavoured)'의 문법을 가져가면서, Go의 진짜 고루틴과 '멈춤 없는(pause-free) 메모리'를 함께 제공하겠다는 목표예요. 정리하면 이런 그림이죠.
- Rust 같은 문법과 타입 시스템: 표현력 있고 안전한 코드를 짤 수 있게.
- 진짜 고루틴: Go처럼 수많은 경량 스레드를 띄우고 채널로 통신하는 방식. 런타임이 M:N 스케줄링(소수의 OS 스레드 위에 수많은 고루틴을 얹어 돌리는 방식)으로 효율적으로 굴려줘요.
- 멈춤 없는 메모리: GC를 쓰더라도 stop-the-world로 전체를 세우지 않도록 설계해서, 지연 시간이 튀는 일을 막겠다는 거예요.
업계 흐름 속 위치
이런 시도가 Gossamer만 있는 건 아니에요. 비슷한 고민을 다른 방향으로 푼 언어들이 꽤 있거든요. 한때 주목받은 Pony는 actor 모델과 정교한 타입으로 안전한 동시성을 추구했고, Vlang이나 Nim도 나름의 메모리 관리 전략을 제시했어요. 최근엔 Rust 진영도 async를 다듬는 중이고, Go도 GC 멈춤 시간을 밀리초 이하로 줄여왔죠. 그러니까 Gossamer는 "Rust의 안전함과 Go의 동시성을 한 언어에서"라는, 많은 개발자가 오래 바라온 빈칸을 정조준한 시도라고 볼 수 있어요.
한국 개발자에게
당장 실무 도입을 권하긴 일러요. 새 언어는 생태계(라이브러리, 도구, 채용)가 무르익기까지 시간이 걸리니까요. 다만 백엔드나 시스템 프로그래밍을 한다면 이런 언어들이 던지는 질문 자체가 좋은 공부거리예요. "왜 Go는 GC가 필요했고, 왜 Rust는 async가 어려운가"를 이해하면, 지금 쓰는 언어에서 동시성 코드를 짤 때 무엇을 조심해야 하는지 감이 잡히거든요. 실시간 거래 시스템이나 게임 서버처럼 지연 시간에 민감한 분야라면 특히 눈여겨볼 만하고요.
한줄 정리: Gossamer는 'Rust의 안전함'과 'Go의 가벼운 동시성'이라는, 오래 양립하기 어려웠던 두 가치를 한 언어에 담으려는 도전이다. 여러분이라면 안전함과 동시성 편의성 중 어느 쪽을 더 포기하기 싫으세요?
🔗 출처: Hacker News