GN⁺: Nova - Rust로 작성된 JavaScript & WebAssembly 엔진
(github.com/trynova)- Nova는 데이터 지향적 설계를 특징으로 하는 JavaScript 엔진으로, 성능과 캐시 효율성을 극대화하기 위해 고안된 구조를 채택하고 있음
- 메모리 취약점 방지와 성능 최적화를 동시에 추구
- 주요 특징:
- JavaScript 힙에 할당된 모든 데이터는 유형별 벡터에 저장됨 (숫자는 숫자 벡터, 문자열은 문자열 벡터 등).
- 힙 참조는 유형에 따라 구분된 인덱스로 처리되며, 이는 메모리 안전성과 크기 효율성을 제공함.
- 객체는 유형별로 나누어 벡터에 저장됨 (일반 객체, 배열, DataView 등).
- 비일반 객체는 필요한 경우에만 일반 객체 데이터를 참조하도록 설계됨.
- 객체는 사용하지 않는 데이터 읽기를 피하기 위해 공격적으로 분리되어 저장됨.
- 아직 개발중임. 엔진은 기능이 매우 제한적이어서 test262 테스트 모음의 약 47% 만 통과
Hacker News 의견
- 아키텍처적 선택에 대한 논의는 흥미롭지만, 대부분의 사람들은 비교할 수 있는 맥락이 부족함. V8의 아키텍처와 비교했을 때 어떤 이점이 있는지 이해하기 어려움
- Lisp 인터프리터와 같은 프로젝트에 대해 생각해본 적이 있으며, 몇 가지 주요 이점을 식별했음
- 균일한 할당은 정렬 간격이 없음을 의미함
- 가비지 컬렉션에서 선형 접근의 이점
- 포인터보다 작은 인덱스
- 타입에 따라 구분된 인덱스는 크기를 절약할 수 있음
- V8과의 비교는 즉시 하지 않아도 됨. V8은 수십억 달러 규모의 프로젝트임
- Fabrice Bellard의 JS 엔진을 참고하면 좋을 것 같음
- V8의 데이터 할당 방식
- 모든 데이터는 여러 힙 부분 중 하나에 할당됨
- 힙 참조는 실제 포인터이거나 포인터 압축을 사용할 경우 힙 베이스에서의 오프셋임
- V8의 객체는 필요한 모든 데이터를 포함하며, 대부분 단일 할당에 저장됨
- 데이터 지향 설계는 데이터 접근 방식을 아는 것에 의해 주도됨. 일반적인 데이터 접근이 동일한 타입의 객체에 대한 선형 접근이라고 가정하는 이유가 궁금함
- "숫자는 숫자 벡터로 들어간다"는 일반적이지 않음. JS 엔진은 보통 NaN-boxing이나 인라인 작은 정수를 사용함
- NaN-boxing 사용을 고려해봤는지 궁금함. 타입별 벡터는 GC에 의해 압축되는지, 아니면 자유 목록을 유지하는지 궁금함
- "Don’t Stop the BIBOP: Flexible and Efficient Storage Management for Dynamically Typed Languages"를 읽어볼 것을 추천함
- 이 JS 엔진이 실험적인 것인지, ECMAscript 사양 전체를 구현하려는 것인지 궁금함
- Rust Boa 프로젝트를 팔로우하고 있지만, 아직 프로덕션 준비가 되지 않았다고 생각함
- 데이터 지향 접근 방식과 타입별 벡터는 V8과 같은 전통적인 아키텍처와 상당히 다름
- 실제 시나리오에서의 성능: 복잡하고 비선형적인 데이터 접근 패턴을 포함한 시나리오에서 Nova를 V8이나 SpiderMonkey와 비교한 벤치마크가 있는지 궁금함
- 가비지 컬렉션에서의 트레이드오프: 벡터 성장과 압축이 메모리 단편화나 성능 병목 현상을 초래할 수 있는지 궁금함
- 특정 응용 프로그램 프로파일을 염두에 두고 있는지 궁금함
- 게임에 스크립팅 엔진을 내장하는 데 유용할 수 있음
- "kind-specific vectors"에서 "kind"라는 단어의 의미가 궁금함
-
function X(a) { this.a = a; }
와function Y(b) { this.b = b; }
가 다른 종류의 객체로 간주되는지 궁금함 - 리터럴로 객체를 생성할 때
{a: 1}
과{b: 2}
가 다른 종류의 객체로 간주되는지 궁금함
-