본문으로 건너뛰기

WebAssembly에 쓰레기 수집형 프로그래밍 언어를 효율적으로 도입하는 새로운 방법

· 약 22분
Alon Zakai

WebAssembly Garbage Collection (WasmGC)에 대한 최근의 글은 쓰레기 수집(GC) 제안이 GC 언어를 Wasm에서 더 잘 지원하도록 어떻게 목표를 설정하는지 고수준에서 설명하고 있습니다. GC 언어들의 인기를 고려할 때 이는 매우 중요합니다. 이번 글에서는 Java, Kotlin, Dart, Python, C# 같은 GC 언어를 Wasm으로 포팅하는 기술적 세부 사항에 대해 살펴볼 것입니다. 실제로 두 가지 주요 접근 방식이 있습니다:

V8에서의 제어 흐름 무결성

· 약 7분
Stephen Röttger

제어 흐름 무결성(CFI)은 제어 흐름 하이재킹을 방지하려는 보안 기능입니다. 이 아이디어는 공격자가 프로세스의 메모리를 손상시키더라도 추가적인 무결성 검사를 통해 임의의 코드를 실행하지 못하도록 하는 것입니다. 이 블로그 포스트에서는 V8에서 CFI를 활성화하기 위해 수행한 작업에 대해 논의하고자 합니다.

V8 힙 스냅샷 가속화

· 약 9분
Jose Dapena Paz

이 블로그 게시물은 José Dapena Paz (Igalia)가 작성했으며, Jason Williams (Bloomberg), Ashley Claymore (Bloomberg), Rob Palmer (Bloomberg), Joyee Cheung (Igalia), Shu-yu Guo (Google)의 기여로 작성되었습니다.

이 게시물에서는 V8 힙 스냅샷과 관련된 Bloomberg 엔지니어들이 발견한 몇 가지 성능 문제와 이를 해결하여 JavaScript 메모리 분석을 그 어느 때보다 빠르게 만든 방법에 대해 설명합니다.

문제

Bloomberg 엔지니어들은 JavaScript 애플리케이션에서 메모리 누수를 진단하려 하고 있었습니다. 이 애플리케이션은 메모리 부족(Out-Of-Memory) 오류로 실패하고 있었습니다. 테스트된 애플리케이션의 경우, V8 힙 한도가 약 1400 MB로 설정되어 있었습니다. 일반적으로 V8의 가비지 컬렉터는 힙 사용량을 이 한도 이하로 유지할 수 있어야 하므로 이러한 실패는 누수가 있을 가능성을 나타냅니다.

WebAssembly 꼬리 호출

· 약 7분
Thibaud Michaud, Thomas Lively

우리는 WebAssembly 꼬리 호출을 V8 v11.2에 출시합니다! 이 게시물에서는 이 제안에 대한 간략한 개요를 제공하고, Emscripten을 사용한 C++ 코루틴의 흥미로운 사용 사례를 보여주며, V8이 꼬리 호출을 내부적으로 처리하는 방법을 보여줍니다.

꼬리 호출 최적화란?

호출이 현재 함수에서 반환하기 전에 실행되는 마지막 명령일 때 꼬리 위치에 있다고 말합니다. 컴파일러는 호출자 프레임을 버리고 호출을 점프로 대체하여 이러한 호출을 최적화할 수 있습니다.

이것은 특히 재귀 함수에 유용합니다. 예를 들어, 연결 리스트 요소의 합을 계산하는 다음과 같은 C 함수를 보세요:

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

정상적인 호출로는 이 작업은 𝒪(n) 스택 공간을 소비합니다: 리스트의 각 요소는 호출 스택에 새로운 프레임을 추가합니다. 리스트가 충분히 길면 스택이 매우 빠르게 넘칠 수 있습니다. 호출을 점프로 대체함으로써 꼬리 호출 최적화는 이 재귀 함수를 루프로 변환하여 𝒪(1) 스택 공간을 사용하게 만듭니다:

Oilpan에서의 포인터 압축

· 약 12분
Anton Bikineev와 Michael Lippautz ([@mlippautz](https://twitter.com/mlippautz)), walking disassemblers

프로그램이 4GB 미만의 RAM을 사용하는 경우 64비트 포인터를 사용하는 것은 절대적으로 터무니없습니다. 그러한 포인터 값이 구조체 안에 나타난다면, 이는 메모리를 절반 이상 낭비할 뿐만 아니라 캐시의 절반을 효과적으로 버리는 셈입니다.

Donald Knuth (2008)

릴리스 블로그 게시물 중단

· 약 2분
Shu-yu Guo ([@shu_](https://twitter.com/_shu))

역사적으로 V8의 각 새 릴리스 브랜치에 대한 블로그 게시물이 있었습니다. v9.9 이후로 릴리스 블로그 게시물이 없음을 알아차렸을지도 모릅니다. v10.0부터 각 새로운 브랜치에 대한 릴리스 블로그 게시물을 중단합니다. 하지만 걱정하지 마세요, 릴리스 블로그 게시물을 통해 얻을 수 있던 모든 정보는 여전히 제공됩니다! 앞으로 해당 정보를 어디에서 찾을 수 있는지 계속 읽어 보세요.

C++에 시간적 메모리 안전성 레트로피팅

· 약 9분
안톤 비키네브, 마이클 립파우츠 ([@mlippautz](https://twitter.com/mlippautz)), 한네스 페이어 ([@PayerHannes](https://twitter.com/PayerHannes))
노트

참고: 이 게시물은 원래 Google Security Blog에 게시되었습니다.

Chrome의 메모리 안전성은 사용자를 보호하기 위해 끊임없이 노력 중입니다. 우리는 악의적 행위자를 앞서기 위해 다양한 기술을 끊임없이 실험하고 있습니다. 이러한 정신으로, 이번 게시물은 C++의 메모리 안전성을 향상시키기 위해 힙 스캐닝 기술을 사용하는 우리의 여정에 관한 것입니다.

새로운 클래스 기능으로 인스턴스 초기화 속도 향상

· 약 10분
[Joyee Cheung](https://twitter.com/JoyeeCheung), 인스턴스 초기화자

클래스 필드는 V8 v7.2부터 제공되었으며, 비공개 클래스 메서드는 V8 v8.4부터 제공되었습니다. 제안이 2021년에 단계 4에 도달한 후, V8에서 새로운 클래스 기능 지원을 향상시키기 위한 작업이 시작되었습니다. 그때까지 채택에 영향을 미치는 두 가지 주요 문제가 있었습니다:

V8 release v9.9

· 약 3분
Ingvar Stepanyan ([@RReverser](https://twitter.com/RReverser)), at his 99%

매 4주마다, 우리는 릴리스 프로세스의 일환으로 V8의 새 브랜치를 만듭니다. 각 버전은 Chrome 베타 단계 이전에 V8의 Git 메인 브랜치에서 생성됩니다. 오늘 우리는 가장 최신 브랜치인 V8 버전 9.9를 발표하게 되어 기쁩니다. V8 v9.9는 몇 주 후 Chrome 99 Stable 릴리스와 함께 발표될 예정이며 현재 베타 버전을 제공합니다. V8 v9.9는 개발자 친화적인 다양한 신규 기능으로 가득합니다. 이 포스트에서는 릴리스를 앞두고 하이라이트를 미리 보여드립니다.

Oilpan 라이브러리

· 약 6분
Anton Bikineev, Omer Katz ([@omerktz](https://twitter.com/omerktz)), Michael Lippautz ([@mlippautz](https://twitter.com/mlippautz)) - 효율적이고 효과적인 파일 이동자

이 글의 제목이 오일팬 관련 책 모음을 깊이 탐구하자는 의미로 보일 수 있으나(오일팬을 위한 구조적 기준을 생각하면 놀라울 정도로 많은 문헌이 이에 대해 다룹니다), 우리는 V8 v9.4부터 라이브러리로 호스팅되고 있는 C++ 가비지 컬렉터인 Oilpan에 대해 좀 더 자세히 살펴보려고 합니다.