WasmGC 및 Wasm 테일 콜 최적화가 이제 기준으로 새로 제공됨

게시일: 2025년 1월 29일

WebAssembly 가비지 컬렉션 (WasmGC)

프로그래밍 언어에는 가비지 컬렉션 프로그래밍 언어와 수동 메모리 관리가 필요한 프로그래밍 언어의 두 가지 유형이 있습니다. 그중 대표적인 예로는 Kotlin, PHP, Java가 있습니다. 후자의 예로는 C, C++, Rust가 있습니다. 일반적으로 상위 수준 프로그래밍 언어에는 가비지 컬렉션이 표준 기능으로 포함될 가능성이 더 높습니다.

간단히 말해 가비지 컬렉션은 프로그램에서 할당했지만 더 이상 참조되지 않는 메모리를 회수하려는 시도입니다. 이러한 메모리를 가비지라고 합니다. 가비지 컬렉션을 구현하는 방법에는 여러 가지가 있습니다. 가장 쉽게 이해할 수 있는 방법 중 하나는 참조 계산으로, 메모리에 있는 객체에 대한 참조 수를 계산하는 것이 목표입니다.

시작 단계처럼 보일 수 있지만 프로그래밍 언어는 다른 프로그래밍 언어로 구현됩니다. 예를 들어 PHP 런타임은 주로 C로 구현됩니다. 개발자가 PHP와 같은 언어를 Wasm으로 컴파일하려면 일반적으로 언어의 파서, 라이브러리 지원, 가비지 컬렉션, 기타 중요한 구성요소와 같은 모든 부분을 컴파일해야 합니다.

Wasm은 호스트 언어 JavaScript의 컨텍스트에서 브라우저에서 실행됩니다. Chrome에서 JavaScript와 Wasm은 Google의 오픈소스 JavaScript 엔진인 V8에서 실행됩니다. V8에는 이미 가비지 컬렉터가 있습니다. 즉, 예를 들어 Wasm으로 컴파일된 PHP를 사용하는 개발자는 이미 가비지 컬렉터가 있는 브라우저에 포팅된 언어 (PHP)의 가비지 컬렉터 구현을 제공하게 되며, 이는 생각만큼이나 낭비가 심합니다. 이때 WasmGC가 사용됩니다.

WasmGC에 관해 자세히 알아보려면 이제 Chrome에서 WebAssembly 가비지 컬렉션 (WasmGC)이 기본적으로 사용 설정됨을 참고하세요. 자세한 내용을 알아보려면 V8 블로그 게시물 가비지 컬렉션 프로그래밍 언어를 WebAssembly에 효율적으로 가져오는 새로운 방법을 확인하세요.

Wasm 테일 콜 최적화

호출이 현재 함수에서 반환되기 전에 실행된 마지막 명령어인 경우 꼬리 위치에 있다고 합니다. 컴파일러는 호출자 프레임을 삭제하고 호출을 점프로 대체하여 이러한 호출을 최적화할 수 있습니다. 이는 재귀 함수에 특히 유용합니다. 예를 들어 연결된 목록의 요소를 합산하는 다음 C 함수를 살펴보겠습니다.

int sum(List* list, int acc) {
  if (list == nullptr) return acc;
  return sum(list->next, acc + list->val);
}

일반 호출을 사용하면 O(n) 스택 공간이 사용됩니다. 목록의 각 요소는 호출 스택에 새 프레임을 추가합니다. 목록이 충분히 길면 스택이 매우 빠르게 오버플로할 수 있습니다. 호출을 점프로 대체하면 테일 콜 최적화는 이 재귀 함수를 O(1) 스택 공간을 사용하는 루프로 효과적으로 변환합니다.

int sum(List* list, int acc) {
  while (list != nullptr) {
    acc = acc + list->val;
    list = list->next;
  }
  return acc;
}

이 최적화는 함수형 언어에 특히 중요합니다. 재귀 함수를 많이 사용하며 Haskell과 같은 순수 함수는 루프 제어 구조를 제공하지도 않습니다. 모든 종류의 맞춤 반복은 일반적으로 어떤 방식으로든 재귀를 사용합니다. 꼬리 호출 최적화가 없으면 간단하지 않은 프로그램의 경우 매우 빠르게 스택 오버플로가 발생하여 스택 공간이 빠르게 고갈됩니다.

처음에는 WebAssembly에서 이러한 꼬리 호출 최적화를 허용하지 않았지만 꼬리 호출 확장 프로포절이 적용되면서 상황이 달라졌습니다. 자세한 내용은 V8 블로그의 WebAssembly 테일 콜 도움말을 참고하세요.

결론

이제 WasmGC 및 꼬리 호출 최적화가 새로운 기준으로 제공되므로 더 많은 앱에서 이러한 기능을 사용하여 성능을 개선할 수 있습니다. 예를 들어 Google Sheets는 Google Sheets 계산 작업자를 WasmGC로 포팅하여 이를 실행했습니다.