Go 제네릭의 GC shape 스텐실링: 타입 소거와 전체 모노모피제이션 사이의 절충
GC shape stenciling in Go generics

Go 컴파일러는 제네릭을 구현할 때 전체 모노모피제이션(Rust, C++)과 타입 소거(Java) 사이의 중간 지점인 GC shape 스텐실링을 사용합니다. 이 방식은 타입을 GC shape(크기, 정렬, 포인터 위치)에 따라 그룹화하여, 동일한 shape를 가진 타입들은 하나의 컴파일된 함수 본문을 공유합니다. 예를 들어, 모든 포인터 타입은 하나의 shape로 취급되어 *User와 *Order가 같은 코드를 공유합니다. 이로 인해 컴파일 시간과 바이너리 크기를 줄이지만, 정확한 타입이 필요한 연산(메서드 호출, 인터페이스 변환 등)은 런타임에 딕셔너리라는 숨은 인자를 통해 타입 정보를 조회해야 합니다. 이 글은 Rust와 Java의 예시를 대조하며 Go의 접근 방식이 어떻게 동작하는지, 그리고 그 비용과 이점을 설명합니다.
GC shape 스텐실링은 타입을 GC shape로만 모노모피제이션하여, 동일한 shape를 가진 타입들이 하나의 컴파일된 본문을 공유합니다.