Goose 언어, GC 없이 메모리를 관리하는 대가는?
Goose는 GC도, 객체마다 하는 해제도 없이 메모리를 관리하겠다는 새 언어다. 그 대신 재귀나 배열, 클로저를 쓸 때 무엇을 포기해야 할까?

- Goose는 데이터 스택과 컴파일 시점 수명 추론으로 GC와 개별 객체 해제를 피하도록 설계됐다.
- 대신 재귀 중 유지할 데이터, 크기가 다른 배열 원소의 인덱싱, 범위를 벗어나는 클로저에 제약이 있다.
- 도입 여부는 자신의 자료구조가 이 제약에 맞는지로 판단해야 한다. 자체 성능 시험에도 빠른 항목과 느린 항목이 함께 있다.
객체마다 해제하는 대신 범위가 끝날 때 회수한다
Goose가 제시하는 핵심은 새 문법보다 데이터 배치다. C·Rust에 익숙한 형태의 문법을 사용하면서, 동적 값을 컴파일러가 관리하는 데이터 스택에 둔다. 프로젝트 소개는 언어 설계를 Wouter van Oortmerssen이 맡았으며 아직 새로운 언어라고 밝힌다.
공식 튜토리얼의 문자열 배열 예시에서는 문자열들이 길이 정보와 함께 연속된 바이트 영역에 놓인다. 데이터가 늘면 스택 포인터가 앞으로 가고, 소유 변수의 유효 범위를 벗어나면 포인터를 되돌린다. 문자열 하나씩 해제하는 과정이 필요 없는 구조다.
이런 배치는 중첩된 작은 값이 많은 자료구조에서 의미가 있다. 문자열과 레코드를 어디에 두고 어떻게 회수할지 언어가 정하므로, 개발자가 별도의 할당·해제 호출을 짜는 작업을 줄인다.
수명 문법을 없애도 수명 검사는 남는다
Goose 사양의 참조 규칙은 각 참조와 슬라이스에 수명을 제한하는 출발점인 root를 둔다. 컴파일러는 호출 관계를 따라 그 출발점을 알아내고, 참조 대상이 참조를 저장한 곳보다 먼저 사라지는 코드를 거부한다.
예를 들어 내부 블록에서 만든 데이터의 참조를 블록 밖에 남기는 것은 허용되지 않는다. 개발자가 수명 매개변수를 직접 적지 않는다는 뜻이지, 소유자를 정하거나 데이터의 생존 기간을 고려할 필요가 없다는 뜻은 아니다.
재귀와 컨테이너 선택에는 구체적인 제약이 있다
튜토리얼은 설계의 제약을 별도로 제시한다. 기존 코드의 문법만 바꾸면 그대로 옮길 수 있는지 판단할 때 먼저 볼 부분이다.
| 코드 형태 | Goose의 조건 |
|---|---|
| 재귀 호출 | 재귀 호출을 넘어 살아 있는 가변 크기 데이터를 재귀 함수의 지역값으로 유지할 수 없다. 더 오래 유지할 데이터는 외부에서 전달한다. |
| 크기가 다른 원소의 배열 | 순회는 가능하지만 직접 인덱싱은 할 수 없다. 필요하면 참조 인덱스를 따로 둔다. |
| 클로저·함수 포인터 | 범위를 벗어나 살아남는 클로저와 함수 포인터를 제공하지 않는다. |
따라서 도입을 검토할 때는 자신의 자료구조가 순차 순회에 맞는지, 재귀 처리에서 누가 데이터를 소유할지부터 살펴볼 필요가 있다. 이는 위 제약을 코드에 적용할 때의 판단 기준이다.
Rust 대비 1.19배는 특정 비교의 기하평균이다
프로젝트가 공개한 10월 16일 벤치마크 결과에서 clang으로 빌드한 Goose는 16개 대형 입력 항목의 기하평균으로 각 항목의 가장 빠른 안전한 Rust 구현보다 1.19배 빠르게 나왔다. 환경은 Ryzen 9 9950X3D와 Windows 11이며, Goose의 C 출력에는 clang-cl 22.1.3, Rust에는 rustc 1.98.0을 사용했다.
같은 표의 calc 항목은 0.89배다. 이 항목에서는 Goose가 Rust보다 느리다. 측정은 워밍업 두 번을 제외한 세 번 중 가장 짧은 전체 프로세스 시간을 사용했으며, 입력 생성과 자료구조 해제도 포함한다.
벤치마크 설계 문서는 일반적인 C++ 구현과 메모리 배치를 수작업으로 최적화한 구현을 구분한다. 연속 배치와 작은 참조 표현이 주는 이득을 보려는 시험이므로, 특정 언어 이름만 남긴 속도 배수보다 어떤 자료구조끼리 비교했는지가 중요하다. 단순한 스칼라 배열에서는 설계상 큰 이점을 기대하지 않는다고도 설명한다.
자주 묻는 질문
수명 표기가 없으면 참조 오류도 검사하지 않는가?
컴파일러가 root와 저장 위치의 수명을 비교한다. 표기를 생략하는 것과 검사를 없애는 것은 다르다.
어떤 프로그램이든 Rust보다 빠른가?
자체 시험에서도 느린 항목이 있다. 1.19배는 특정 환경과 16개 항목의 기하평균이다.
Goose를 평가할 첫 질문은 ‘몇 배 빠른가’보다 자신의 데이터 수명과 접근 방식이 이 언어의 제약에 맞는가다.