[번역] JavaScript Engines

A guide for developers.

원문 : 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 소스 코드를 컴파일 및 실행하고 메모리 할당 및 가비지 컬렉션을 수행합니다. 이 설계는 소스 코드를 머신 코드로 직접 어셈블하는 두 개의 컴파일러로 구성됩니다.

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

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

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

What Does this Mean for Developers?

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

결론적으로, 이런 엔진의 발전은 웹과 모바일 분야를 발전 시켜 성능을 향상시키려는 노력과 유사합니다. 이러한 발전을 추적하기 위해 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

Last updated