메모리 안전성과 성능을 모두 잡은 구스 언어 공개
원제 The Goose Programming Language
192 포인트댓글 145
Key Point
힙 할당·가비지 컬렉션·라이프타임 문법을 모두 제거하면서도 안전성을 보장해 C++과 Rust보다 빠르고 메모리 효율적인 새로운 시스템 언어 설계가 실제로 동작하는 방식을 보여줍니다.
핵심 요약
- Goose는 힙 할당자, 가비지 컬렉터, 라이프타임 애너테이션이 없는 메모리 안전 시스템 언어로, C와 Rust 문법을 따릅니다.
- 벤치마크 16개 기준 구스는 일반적인 C++보다 3.3배, 손으로 최적화한 C++보다 1.16배, 안전한 Rust보다 1.12배 빠르면서 메모리는 1.9배, 1.3배, 1.2배 적게 씁니다.
- 컴파일러가 정적으로 할당하는 데이터 스택 위에 모든 동적 값이 인라인으로 살며, 스코프 끝에서 한 번의 저장 명령으로 메모리가 해제됩니다.
- 배열이 성장해도 참조가 유효하게 유지되므로 C++의 인덱싱이나 Rust의 u32 인덱스가 필요 없으며, 라이프타임 문법 없이도 컴파일러가 참조의 근원을 추론하고 잘못된 참조를 거부합니다.
- 문자열, 배열, 레코드 등 모든 중첩 데이터는 포인터 없는 단일 연속 블록으로 저장되므로, C++에서 160바이트와 1번의 할당이 필요한 주문이 Goose에서는 29바이트와 할당 0번입니다.
- 변수 길이 원소를 가진 배열은 순차 접근만 가능하지만, 상대 참조(1·2·4바이트 오프셋)로 포인터보다 좁은 링크를 만들 수 있으며, 이 데이터 구조는 그대로 파일 형식이 되어 저장은 쓰기, 로드는 읽기에 검증만 더합니다.
- 값은 어떤 깊이의 호출을 거쳐도 최종 목적지에서 바로 구성되므로, 배열에 파싱된 레코드를 push할 때 임시 복사 없이 배열 안에 직접 기록되고, 성장하는 배열을 값으로 반환해도 비용이 들지 않습니다.
- 함수는 중간 Result 타입 없이 여러 프레임을 거쳐 에러를 반환할 수 있으며, 정적으로 검사되므로 모든 호출이 제어 흐름을 통과하고 런타임에 미처리 예외가 없습니다.
- 제네릭 파라미터는 타입 인수로 추론되고, 함수 값은 컴파일 타임 실체이므로 클로저 객체나 함수 포인터 없이 고차 함수는 정확히 보이는 루프로 컴파일됩니다.
- 스레드는 메모리를 공유하지 않으며, 각 thread_fn은 자체 프로그램으로 컴파일되어 타입 있는 큐를 통해 flat한 값만 교환하므로 데이터 경쟁, 락, 원자 연산이 없습니다.
- extern fn으로 C 라이브러리를 직접 호출하고, 컴파일러가 한 개의 C 파일을 생성하므로 C 컴파일러가 있는 모든 곳에서 실행되며, 내장 TinyCC 백엔드는 빌드 단계 없이 프로세스 내에서 컴파일·실행합니다.
- VS Code 확장, 언어 서버, 그래픽·오디오·물리 패키지가 함께 제공되고, Windows·macOS·Linux 바이너리는 공식 릴리스 페이지에서 다운로드할 수 있습니다.