GeekNews에서 화제 · aardappel.github.io · 3일전
Goose - 힙 없이 메모리 안전성을 제공하는 시스템 프로그래밍 언어
OIYO 한국어 요약
원문을 바탕으로 요약했어요.
본문 번역
원문 일부를 옮겼어요. 전체 내용은 원문에서 확인해 주세요. · Grok Bot · 2026-10-26
Goose 공식 소개 페이지의 특징 목록과 메모리 모델 설명 앞부분을 읽고 옮겼어요. 뒤쪽 예제 코드 설명은 읽지 못했어요. 성능 수치는 이 저장소의 자체 벤치마크예요.
어떤 언어인가요
Goose는 힙 할당자, 가비지 컬렉터, 수명(lifetime) 표기가 없는 메모리 안전 시스템 언어예요. 문법은 C와 Rust 사용자에게 익숙하지만 힙이 없어요. 모든 동적 값은 컴파일러가 관리하는 데이터 스택에 인라인으로 놓이고, 커지면 포인터만 앞으로 가고, 스코프가 끝나면 해제돼요. 타입과 수명 규칙이 이 모델을 안전하게 만든대요.
내세우는 특징
- C++·safe Rust보다 빠르면서 메모리 안전: 벤치마크 16개에서 관용적 C++의 3.3배, 손으로 최적화한 C++의 1.16배, 최고 수준 safe Rust의 1.12배 속도이고, 메모리는 각각 1.9배, 1.3배, 1.2배 적게 써요. 데이터 배치와 메모리 모델 덕분이래요.
- 할당자, GC, 참조 카운팅, 소멸자 없음: 원소 100만 개짜리 구조를 해제하는 데 저장 한 번이면 돼요.
- 커져도 참조가 유지돼요: 늘어나는 배열을 가리키는 참조는 배열이 살아 있는 동안 유효해요. C++은
reserve, safe Rust는u32인덱스를 써야 하는 경우래요. - 표기 없이 메모리 안전: 수명 문법, 별칭·배타성 규칙,
unsafe가 없어요. 컴파일러가 참조의 뿌리를 추론해 주인보다 오래 살 수 있는 참조를 거부해요. - 중첩 데이터도 인라인: 문자열 배열이나 가변 필드 레코드 배열도 포인터 없는 연속 블록 하나예요. C++에서 160바이트·할당 1번인 예시 레코드가 Goose에서는 29바이트·할당 0번이래요.
- 가변 크기 enum: 가장 큰 variant가 아니라 각자 크기로 저장해, 해당 벤치마크에서 Rust enum보다 메모리 4배 적고 2배 빨라요.
- 포인터보다 좁은 링크: 1·2·4바이트 오프셋 상대 참조라 위치 독립적이고, 자료구조를 파일에 그대로 한 번에 쓰고 읽은 뒤 검증해요.
- 항상 제자리 생성:
items.push(parse(line))이 파싱한 레코드를 배열에 바로 써요. - 여러 프레임 위로 반환:
return err from load가 정적 검사를 거쳐 호출 스택 몇 단계 위로 바로 반환해요. 언와인더, Result 타입,?가 필요 없어요. - 공유 메모리 없는 스레드: 워커는 별도 메모리를 가진 프로그램으로 컴파일되고 타입 있는 큐로 값을 memcpy해요. 데이터 경쟁, 락, 원자 연산이 언어에 없어요.
- 오버헤드 없는 제네릭·고차 함수:
xs.filter() { it > 0 }이 손으로 쓴 루프처럼 컴파일돼요. - C로 컴파일되고 C를 호출: C 파일 하나로 컴파일되고, 내장 TinyCC 백엔드로 빌드 단계 없이 바로 실행할 수도 있어요.
메모리 모델
프로그램에는 네이티브 호출 스택, 정적 데이터, 그리고 컴파일러가 정한 N개의 데이터 스택이 있어요. 데이터 스택은 큰 주소 공간 예약 + 범프 포인터이고 다른 메모리는 없어요. 스택마다 크기가 바뀌는 값은 최대 하나만 살아 있고 항상 맨 위에 있어서, 커져도 아무것도 옮기지 않고 용량 검사도 없어요. 이건 모두 컴파일 시점에 증명되고, 런타임은 범프 포인터만 추적해요.
문서는 튜토리얼, 레퍼런스, 명세, 31개 예제 프로그램, 그리고 Goose가 지는 경우까지 포함한 벤치마크로 나뉘어 있어요.
OIYO는 원문을 그대로 옮기지 않아요. 요약과 본문 번역은 큐레이션 목적이며, 사실·인용은 원문 출처를 따라요.