# \[번역] JavaScript Engines

> 원문 : <http://www.softwaremag.com/javascript-engines/>

By Jen Looper

웹용 코드를 짜는 것은 개발자가 일련의 문자를 쓰고 문자가 브라우저 내에서  구체적인 단어, 이미지 및 동작으로 바뀐다는 점에서 약간 마술처럼 느껴집니다. 그래서 기술을 이해한다면 개발자가 프로그래머로서 기술을 더 잘 사용할 수 있습니다.

JavaScript 엔진은 복잡한 기술이기 때문에, 타 플랫폼에서 다른 엔진을 사용하는 이유를 아는 것이 가장 짧은 시간에 최적화된 코드를 생성하려는 개발자에게 필수입니다.

### 가상 머신 (Virtual Machines)

JavaScript 엔진은 가끔 특정 컴퓨터 시스템의 소프트웨어 기반 에뮬레이션 또는 가상 머신 유형으로 정의됩니다. 가상 머신에는 여러 유형이 있으며 실제 머신을 얼마나 정확하게 하거나 대체할 수 있는지에 따라 분류됩니다.

예를 들어, 시스템 가상 머신은 운영체제를 실행할 수 있는 플랫폼의 완전한 에뮬레이션을 제공합니다. Mac 사용자는 Windows를 Mac에서 실행할 수 있는 시스템 가상 머신인 `Parallels`에 익숙합니다.

반면 프로세스 가상 머신은 기능이 거의 없으며, 하나의 프로그램 또는 프로세스만 실행할 수 있습니다. `Wine`은 Windows 응용 프로그램을 Linux에서 실행하는 기능을 제공하지만,  Linux box에 Windows 전체 운영체제를 제공하지 않는 프로세스 가상 머신입니다.

JavaScript 엔진은 JavaScript 코드를 해석하고 실행하도록 특별히 설계된 일종의 프로세스 가상 머신입니다. 웹 페이지를 구성하여 브라우저를 구동하는 레이아웃 엔진과 코드를 해석하고 실행하는 하위 JavaScript 엔진을 구별할 수 있어야 합니다.

### What is JavaScript Engine?

JavaScript 엔진의 기본 작업은 개발자가 작성한 JavaScript 코드를 가져와서 브라우저에서 해석하거나, 응용 프로그램에 내장할 수 있는 빠르고 최적화 된 코드로 변환하는 것입니다

좀 더 정확하게 말하면, 각 JavaScript 엔진은 ECMAScript 버전을 구현하며 이 중 JavaScript는 방언입니다. ECMAScript가 발전하면서 JavaScript 엔진도 따라서 발전합니다. 각 엔진은 각기 다른 웹 브라우저, headless 브라우저 또는 `Node.js` 같은 런타임에 작동하도록 설계되었기 때문에 매우 다양합니다. Headless 브라우저는 자동화 테스트를 실행하는데 유용하지만 웹 제품과는 달리 GUI가 없는 웹 브라우저 입니다. `PhantomJS`가 좋은 예입니다. `Node.js`는 서버 사이드에서 JavaScript를 사용할 수 있는 비동기 이벤트 중심 프레임워크입니다. 이러한 도구들은 JavaScript 기반 도구이므로 JavaScript 엔진으로 구동됩니다.

클라이언트 사이드 코드를 분석, 파싱 및 실행하기 위해 다양한 JavaScript 엔진을 사용할 수 있습니다. 모든 브라우저 릴리즈 버전에 따라 최신 JavaScript 코드 실행을 위해 JavaScript 엔진은 바뀌거나 최적화 될 수 있습니다.

### How Does a JavaScript Engine Work?

가상 머신 정의는 JavaScript 코드를 읽고 컴파일하는 것이 유일한 목적이기 때문에 JavaScript 엔진을 프로세스 가상 머신이라고 합니다. 이건 단순한 엔진이라는 의미가 아닙니다. 예를 들어, `JavaScriptCore`는 JavaScript 코드를 분석, 해석, 최적화 및 가비지 컬렉션을 하는 6 개의 building 블록이 있습니다.

그럼 대체 어떻게 작동할까요? 물론 엔진에 따라 다릅니다. NativeScript에 의해 활용되는 두 가지 주요 엔진인 Webkit의 `JavaScriptCore`와 Google의 `V8` 엔진을 살펴보겠습니다. 두 엔진은 코드를 다르게 처리합니다.

`JavaScriptCore`는 스크립트를 해석하고 최적하기 위한 단계를 수행합니다. 어휘 분석을 수행하여 소스를 식별된 토큰 또는 문자열로 분류합니다. 그 다음 구문 분석기가 토큰을 분석하여 구문 트리에 빌드합니다. 4 개의 JIT(Just-In-Time) 프로세스가 파서에서 생성된 바이트 코드를 분석하고 실행합니다. 간단히 말해서 JavaScript 엔진은 소스 코드를 가져와서 문자열로 나눕니다. 그 문자열을 컴파일러가 이해할 수 있는 바이트 코드로 변환한 다음 실행합니다.

C++ 로 작성된 Google의 `V8` 엔진은 JavaScript 소스 코드를 컴파일 및 실행하고 메모리 할당 및 가비지 컬렉션을 수행합니다. 이 설계는 소스 코드를 머신 코드로 직접 어셈블하는 두 개의 컴파일러로 구성됩니다.&#x20;

최적화 되지 않은 코드를 생성하는 빠른 컴파일러인  `Full-codegen`과 빠르고 최적화 된 코드를 생성하는 느린 컴파일러인 `CrankShaf`입니다.

`CrankShaf`는 `Full-codegen`이 생성한 최적화 되지 않은 코드가 최적화가 필요하다고 판단하면, 이를 `crankshafting` 프로세스로 대체합니다.

컴파일러 프로세스가 머신 코드를 생성하면 엔진은 ECMA 표준에 지정된 모든 데이터 유형, 연산자, 객체 및 기능을 브라우저 또는 NativeScript와 같이 이를 사용하는 모든 런타임에 제공합니다.

### What Does this Mean for Developers?

JavaScript 엔진의 코드 구문 분석 및 실행 프로세스는 가장 짧은 시간에 가장 최적화 된 코드를 생성하는 것이 목표입니다.&#x20;

결론적으로, 이런 엔진의 발전은 웹과 모바일 분야를 발전 시켜 성능을 향상시키려는 노력과 유사합니다. 이러한 발전을 추적하기 위해 `arewefastyet.com`에서 제공하는 벤치마킹 그래프는 다양한 엔진을 비교하여 수행하는 방식을 보여줍니다.

모든 웹 개발자는 생성, 디버깅 및 유지 관리되는 코드를 보여주는 브라우저들의 고유한 차이를 알고 있어야 합니다. 구체적으로 특정 스크립트가 특정 브라우저에서 더 빠르게 동작하는 이유를 이해하는 것이 중요합니다.

웹뷰를 사용하여 콘텐츠를 보여주거나 NativeScript와 같이 런타임을 사용하는 하이브리드 모바일 애플리케이션을 개발하는 모바일 개발자는 JavaScript 코드를 해석하는 엔진을 알아야 합니다. 모바일 웹 개발자는 작은 장치에서 다양한 브라우저가 제공하는 고유의 한계와 가능성을 이해해야 합니다. JavaScript 엔진의 변경사항을 따라 가면, 웹 모바일 또는 응용 프로그램 개발자로 발전하려는 사람들에게 큰 도움이 됩니다. SW

> Jen Looper is Progress Software’s developer advocate for the Telerik Platform. Looper is also a Web and mobile developer and founder of Ladeez First Media, which is an indie mobile development studio. In her spare time, she is a dancer, teacher, and multiculturalist who is always learning.

Dec2015, *Software Magazine*
