핵심 요약
- 오픈소스 게임 엔진 Ebiten 개발자가 Go 언어로 작성된 프로그램을 닌텐도 스위치용 네이티브 바이너리로 컴파일해 실행하는 데 성공했습니다.
- 기존 웹어셈블리-C++ 변환 방식의 성능 저하와 GC 멈춤 현상을 해결하기 위해 런타임 시스템 콜을 C 함수로 대체하는 독창적인 방식을 적용했습니다.
- 자체 툴인 'Hitsumabushi'를 개발하고 Go 빌드 옵션을 활용해 미지원 콘솔 기기에서의 구동 장벽을 뚫어냈습니다.
요약 오픈소스 2D 게임 엔진 '이비텐(Ebiten)'의 개발자 호시 하지메(Hajime Hoshi)가 Go 언어로 작성된 게임을 닌텐도 스위치용 네이티브 바이너리로 직접 컴파일해 구동하는 데 성공했다고 밝혔습니다.
기존에는 Go 프로그램을 닌텐도 스위치에서 구동하기 위해 코드를 먼저 웹어셈블리(Wasm)로 컴파일한 뒤 이를 다시 C++ 파일로 변환하는 우회 방식을 사용했습니다. 이 방식을 통해 2021년 '곰의 레스토랑(Bear's Restaurant)' 스위치 버전을 성공적으로 출시하기도 했으나, 성능 저하와 긴 컴파일 시간, 그리고 싱글 스레드 환경에서 가비지 컬렉터(GC)가 실행될 때 게임이 일시 정지되는 심각한 단점이 있었습니다.
Go 언어는 공식적으로 닌텐도 스위치를 지원하지 않고 스위치의 소스 코드나 바이너리 포맷 역시 비공개이기 때문에 네이티브 컴파일은 불확실성이 매우 큰 작업이었습니다. 개발자는 약 1년간 간헐적인 실험 끝에 Go 런타임과 표준 라이브러리의 시스템 콜(Syscall)을 C 표준 함수 및 pthread 함수 호출로 대체하는 전략을 채택했습니다.
빌드 과정에서는 Go 컴파일러의 `-overlay` 옵션을 활용해 런타임 파일을 직접 교체했으며, 환경마다 다른 Go 설치 경로나 버전 업데이트에 대응하기 위해 오버레이용 JSON 설정을 생성해 주는 '히츠마부시(Hitsumabushi)'라는 자체 패키지까지 개발했습니다. 최종적으로 `GOOS=linux`, `GOARCH=arm64` 설정과 `-buildmode=c-archive` 옵션으로 아카이브(.a)를 생성한 뒤 스위치 컴파일러로 링크해 게임을 구동하는 데 성공했다고 설명했습니다. 공식 지원이 없는 콘솔 플랫폼의 장벽을 독창적인 엔지니어링 방식으로 돌파했다는 점에서 개발자 커뮤니티의 큰 관심을 모았습니다.
Sponsored · 광고