본문 바로가기
All Side/Runtime > BunJS

[Bun 시리즈] #2 Bun은 왜 빠를까? JSC vs V8

by developerBeluga 2023. 11. 4.
728x90
반응형

 

 

 

 

 

 

Bun은 뭔 짓을 했길래 빠를까? 🤔

Bun에 감동하자마자 든 생각이 👆였다.

그래서 이거저거 찾아보다가 Bun 공식 페이지에 AI로 물어보는게 있어서 사용해봤다.

 

https://bun.sh/

만두가 귀엽다.

 

Bun AI가 알려준이유는 2가지다.

1. JSC 엔진 사용

2. 내장된 파일 변환 파일러

 

두번째 내장된 파일 변환에 대해서는 1편 TypeScript에 대한 NodeJS와 BunJS 차이에서 다뤘다.

그래서 이번엔 첫번째 JSC 엔진 사용에 대해 알아보자.

 

 

 

 

JavaScript 엔진

JSC는 JavaScriptCore 엔진이다.

JavaScript 엔진 중 하나인데 우선 JavaScript 엔진이 무엇인지 알아보자.

 

한마디로 정리하면 JavaScript 언어로 짜인 코드를 해석하고 실행하는 *인터프리터다.

핵심 기능은 파싱, 컴파일레이션, 실행, 최적화가 있다.

* 인터프리터(=JavaScript, Python, Ruby)란?
컴파일러와는 반대로 프로그램 실행 시 한 번에 한 문장씩 번역한다. 그렇기에 한 번에 전체를 스캔하고 이를 모두 기계어로 번역하는 컴파일러(=C, C++, JAVA)보다 실행시간이 더 걸린다. 또한 인터프리터는 오류를 만나게 되면 한 번에 한 문장씩 번역하기 때문에 바로 프로그램을 중지한다. 그로인해 프로그램 실행해봐야 오류 발견이 가능하다. 
대신 메모리 효율이 좋다. 컴파일러처럼 목적 코드를 만들지 않고, 링킹 과정도 거치지 않기 때문이다. 

 

 

대중적으로 알려진건 구글의 V8 엔진인데 크롬에서 사용중이며 NodeJS에서도 쓰인다.

V8은 C++로 만들어졌으며 최적화를 위해 *JIT 컴파일러를 사용한다.

* JIT 컴파일러
Just In Time Compiler의 줄임말로, 중간언어이다. 컴파일러와 인터프리터의 장점을 합치고자 만들어졌다. 실행과 동시에 즉각적인 컴파일(=기계어로 만들기)을 가능하게 만들어졌다. 그렇기 때문에 컴파일 시간이 획기적으로 단축되었다. 인터프리터(=JavaScript)에 중간언어를 사용할 경우 확장성을 갖추게 해준다.

 

 

https://en.wikipedia.org/wiki/List_of_ECMAScript_engines

V8 말고도 상당히 많은 엔진들이 있다.

SpiderMonkey는 최초의 JavaScript 엔진으로 파이어폭스에 쓰인다고 한다.

Chakra는 마이크로소프트 엣지에서 싸용한다고 한다.

 

JSC는 애플의 Safari 웹 브라우저에서 사용되는 엔진이다.

V8와 마찬가지로 JIT 컴파일을 사용하는데 Nitro라는 최적화 컴파일러를 통해 성능을 향상시켰다.

Apple 생태계에 친화적이다.

 

 

V8 vs JSC

Node는 V8를 Bun은 JSC를 쓴다는 걸 알게 됐다.

좀 더 둘을 비교하도록 하자.

 

  V8 JSC
장점 1. JIT 컴파일과 최적화 기술에 중점을 두어 빠른 코드 실행을 제공한다.
2. *ECMAScript의 최신 기능을 빠르게 구현하며 실험적인 기능에 대한 지원도 적극적이다.
3. *WebAssembly을 지원하여 웹에서 고성능 애플리세연을 가능하게 한다.
4. 다양한 플러그인과 확장기능을 제공하여 사용자 정의 기능을 추가하기 쉽다.
1. 메모리 사용과 전력 소비에 있어 효율적으로 설계되어져 있다.
2. Apple 제품과의 밀접한 통합으로 Safari, iOS 애플리케이션에서 원활하게 작동한다.
단점 1. 특히 최적화 과정에서 다른 엔진에 비해 많은 메모리를 사용한다.
2. 최적화를 위한 JIT 컴파일 과정이 초기 구동 시간을 늘린다.
1. 역설적이게도 Apple 플랫폼에 최적화되어 있어, 다른 환경에서는 성능이 다소 떨어질 수 있다.
2. V8에 비해 ECMAScript의 최신 기능을 구현하는데 시간이 걸린다.
* ECMAScript
Ecma 인터내셔널에 의해 제정된 ECMA-262 기술 규격에 의해 정의된 범용 스크립트 언어다. 스크립팅 언어의 맞춤법과 같은 규칙이다. JavaScript는 ECMAScript 사양을 준수하는 범용 스크립팅 언어다. 일부 사람들은 JavaScript를 ECMAScript의 방언이라고 부른다.

* WebAssembly
웹 브라우저에서 실행하는 프로그래밍 언어이자 바이트코드다. 다양한 언어(=C, C++, Rust, Python 등)로 프로그램을 작성하고 컴파일한다. 2015년부터 JavaScript의 느린 속도를 보완 및 대처하기 위해 개발되었다.

 

 

정리하면서 느낀건데 역시 JavaScript는 웹을 위해 존재하다보니 엔진들도 웹에 특화된 것 같다.

위 내용만으로는 JSC가 V8을 속도면에서 왜 우수한지 알지 못했다.

더 찾아보도록 하자.

 

 

 

https://bytes.dev/archives/109

잘 정리되어져 있는 블로그를 찾았다.

가장 중요한 부분을 해석하면 아래와 같다.

 

1. JSC는 빠른 시작 시간을 우선시 하고 V8은 빠른 실행을 우선시 한다.

2. JSC에는 3개의 최적화 컴파일러(더 복잡하지만 더 빠름)가 있는데 V8에는 2개의 최적화 컴파일러(덜 복잡하고 사용하기 쉽지만 빠르는지는 않음)가 있다.

 

두번째가 흥미로워 더 찾아보니 JSC와 V8에서 사용하는 JIT 아키텍처가 다르다고 한다❗️

V8의 JIT 아키텍처는 Ignition, TurboFan이다.

JSC의 JIT 아키텍처는 LLInt, Baseline JIT, DFG JIT, FTL JIT이다.

 

 

https://webkit.org/blog/10308/speculation-in-javascriptcore/

애플 공식문서 webkit에도 잘 정리되어져 있다.

동작원리나 각 계층들이 무슨 역할을 하는지는 따로 정리할 생각이다.

(꽤나 흥미로운 문서)

(Bun 하다가 JavaScrit 엔진에 이어 JSC 공부하는 나 어떤데)

 

아무튼 둘이 JIT를 쓰지만 채택한 아키텍처가 다르기 때문에 속도에 차이가 난다는걸 알 수 있었다.

고로 Bun이 NodeJs도 빠를 수 있었던 이유 첫번째가 이해가 됐다.

굳 👍

 

 

 

 

 

 

 

 

 

 

 

fin.

 

728x90
반응형

댓글