반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

오늘부터 공부한다

3. [Nodejs] v8엔진이란? 본문

NodeJs

3. [Nodejs] v8엔진이란?

1000hg 2021. 8. 10. 09:43
반응형

Javascript 개발자라면 한 번쯤은 v8엔진이라는 단어를 들어보셨을 겁니다.

 

Nodejs에 관한 내용이 아니지만, 마땅히 적을 카테고리가 없어서 이곳에 작성합니다.

 

사실 저희가 자바스크립트를 사용할 떄, 로우 레벨(Low Level) 단계까지 신경 쓰지는 않습니다. 그러나 정말 자바스크립트로 뽑아낼 수 있는 최적의 성능을 사용하고 싶다면 내 코드가 어떤 식으로 실행되는 지에 대한 이해가 어느 정도 필요합니다.

 

때문에 본 포스팅에는 v8이 우리의 자바스크립트 코드를 어떻게 해석하고 실항하는지에 대한 설명을 하겠습니다.

 

 

v8엔진을 간단하게 소개하자면

 

  • Google이 개발한 오픈소스
  • C++로 구성, 개발
  • Nodejs 런타임, Chrome Browser에서 사용됩니다.

대략적인 설명은 위와 같은데, JavaScript가 v8엔진을 채용하는 것에 이유가 있다면, 그것은 속도개선입니다.

 

기존 자바스크립트 엔진은 웹 특성상 유저와 상호작용을 위해서 즉시성 있는 (동적)인터프리터 방식을 많이 사용하는데, 코드가 많아질 수록 속도가 느려져서 특정 기능을 구현하기 어려웠습니다.

 

v8엔진은 속도를 높이기 위해 인터프리터 대신 JIT(Just-In-Time) 컴파일러를 적용하여 JavaScript 코드를 더 효율적으로

기계어 코드로 번역하는데, 이는 스파이더몽키나 리노와 같은 현재적인 다른 자바스크립트 엔진에서도 마찬가지입니다.

 

(주된 차이는 v8은 바이트코드와 중간 코드를 생성하지 않는 다는 점.)

 

JIT 컴파일러가 무엇인가에 대해서 설명하려면,

(동적)인터프리터 방식과 (정적)컴파일 방식을 사전에 알아두셔야 합니다.

 

컴퓨터 프로그램을 만드는데는 크게 두 가지 방법이 있는데, 앞서 말한 인터프리터와 컴파일 방식입니다.

인터프리터 방식은 소스코드의 각 행을 연속적으로 분석하며 실행하는 방식이고

컴파일은 전체 소스코드를 보고 명령어를 수집하여 재구성하는 방식입니다.

 

v8엔진에서의 JIT 컴파일러는 인터프리터와 컴파일, 두 가지 방식을 혼합한 방식입니다.

 

코드를 실행한 시점에서 인터프리터 방식으로 차례차례 불러와 기계어를 생성하면서, 그 코드를 캐싱하여 같은 함수가 여러 번 불릴 때 매번 같은 기계어 코드를 생성하는 것을 방지합니다.

 

JIT는 실행할 때 컴파일을 한다는 점이 중요합니다.

 

기존 컴파일된 프로그램은 실행하려는 플랫폼(운영체제OS)에 강한 종속성을 받습니다.

 

만약, 윈도우에서 컴파일을 했다면 이 프로그램을 리눅스에서 쓸 수 없습니다. 프로그램이 리눅스에서 필요하다면 리눅스에서 컴파일을 해야합니다. (대부분의 경우 시스템 콜이 다르기 때문에 코드를 다시짜야합니다.)

 

간단한 콘솔 프로그램이라면 큰 변화가 필요없겠지만, UI가 들어가고 시스템에 관련되는 활동이 생기는 경우에는 큰 문제가 생길 것 같습니다.

 

JIT는 기존의 컴파일 방식의 문제점을 중간에서 플랫폼에 맞게 변경해주는 방식으로 해결했습니다.

 

OS 플랫폼 구애받지 않고 어디에서든 사용할 수 있다. 어디서 들어본 내용이 아닌가요?

자바의 가장 큰 특징인 JVM입니다.

 

JIT와 JVM의 관계, 만약 자바를 조금 다뤄보셨다는 사람은 쉽게 알 수 있을 겁니다.

 

자바의 내부 동작 원리, 컴파일 실행 순서 등 더 자세한 내용을 쓰고 싶지만,

본 포스팅의 주제와는 거리가 멀기에 생략하겠습니다. ㅜㅜ

 

본론으로 돌아와서 JIT는 컴파일이라는 이름답게 기존 방식으로 컴파일 된 프로그램들과 속도적인 면에서 크게 차이나지 않습니다. 그러나 이것에 인터프리터를 추가할 경우, 인터프리터가 가진 유연한 플랫폼 특성과 컴파일 방식 특유의 빠른 속도를 모두 가질 수 있습니다.

 

JIT, os에 구애받지 않고 컴파일러에 인터프리터가 들어가 속도가 빠르다.

사실 지금까지의 내용은 이 한줄입니다.

 

하지만 이 JIT도 만능은 아닙니다. 어느 방식을 사용하든 단점이 있기 마련입니다. 

JIT의 장점들을 다르게 생각해보면 컴파일을 할 때 필요한 자원을 실행시간에 공유하게 된다는 의미인데, 

심각하리만큼 큰 단점은 아니지만, 프로그램의 작업 환경에 따라 중요한 문제로 다가올 수 있습니다.

(저사향 컴퓨터, 임베디드 시스템)

 

JIT에 관한 TMI가 많았던것 같습니다.

 

 

아직 본론으로 들어온 것도 아닌데, 내용이 너무 많아서 여기서 한 번 끊고 다음 포스팅에 작성하겠습니다.

^^7

반응형