Skip to content

javascript engines

Yongkwan Lim edited this page Jun 2, 2019 · 1 revision

자바스크립트 엔진들 - 개발자를 위한 지침서

원문 Javascript Engines

웹과 관련된 코드를 작성하는 것은 개발자가 일련의 문자를 작성하고, 그 문자들이 브라우저 내에서 이미지, 단어 및 동작으로 변한다는 점에서 때때로 마법처럼 느껴진다. 이 기술을 이해하면 개발자들이 프로그래머서의 기술을 더 잘 조정할 수 있다.

Javascript 엔진은 복잡한 기술이다. 가능한한 최단 시간에 최적화 된 코드를 작성하려는 개발자들에게 서로 다른 플랫폼이 서로 다른 엔진을 사용하는 이유를 아는 것이 필수적이다.

가상 머신

Javascript 엔진은 주어진 컴퓨터 시스템의 가상 머신 또는 소프트웨어 구동 에뮬레이션 유형으로 정의되는 경우가 많다. 가상 컴퓨터에는 다양한 유형이 있으며 실제 실제 컴퓨터를 에뮬레이션하거나 대체 할 수있는 방법에 따라 분류 된다.

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

반면에 프로세스 가상 머신은 덜 기능적이며 하나의 프로그램이나 프로세스만 실행할 수 있다. Wine은 Windows 응용 프로그램을 Linux 컴퓨터에서 실행할 수 있게 해주는 프로세스 가상 머신이지만 전체 Windows OS를 Linux에서 실행할 순 없다.

Javascript 엔진은 Javascript 코드를 해석하고 실행하도록 특별히 설계된 프로세스 가상 머신의 일종이다. 웹 페이지를 구성하여 브라우저의 성능을 향상시키는 레이아웃 엔진과 코드를 해석하고 실행하는* 낮은 수준의 Javascript 엔진*을 구별하는 것이 중요하다.

자바스크립트 엔진이란 무엇인가?

Javascript 엔진의 기본 작업은 개발자가 작성한 Javascript 코드를 빠르게 변환하고, 애플리케이션에 내장화 하거나 브라우저가 해석 가능하도록 최적화 하는 것이다.

보다 정확하게, 각 Javascript 엔진은 ECMAScript 버전을 구현한다.이 버전의 Javascript는 방언(?)이다. ECMAScript가 진화하면 Javascript 엔진도 발전한다. 각기 다른 웹 브라우저, 헤드리스 브라우저 또는 Node.js와 같은 런타임에서 작동하도록 설계되었으므로 매우 다양한 엔진이 있다. 헤드리스 브라우저는 그래픽 사용자 인터페이스가없는 웹 브라우저로, 웹 제품에 대한 자동 테스트를 실행하는 데 유용하다. 좋은 예가 PhantomJS이다. Node.js는 Javascript를 서버 측에서 사용할 수있는 비동기식 이벤트 기반 프레임워크이다. 이것들은 Javascript로 구동되는 도구이기 때문에 Javascript 엔진에 의해 구동된다.

다양한 Javascript 엔진을 사용하여 클라이언트 측 코드를 해석, 구문 분석 및 실행할 수 있다. 브라우저 버전이 새로이 출시되면 Javascript 엔진이 최첨단 Javascript 코드 실행을 따라갈 수 있도록 변경되거나 최적화 될 수 있다.

Javascript 엔진은 어떻게 동작할까?

가상 머신의 정의를 감안할 때 Javascript 엔진을 프로세스 가상 머신이라고 부르는 것은 Javascript 코드를 읽고 컴파일하는 것이 목적이기 때문에 의미가 있다. 이것은 Javascript 엔진이 단순한 것을 의미하지 않습니다. 예를 들어, JavaScriptCore에는 Javascript 코드를 분석, 해석, 최적화 및 가비지 수집(garbage collect)등 6 개의 빌딩 블록이 있다.

그러면 어떻게 동작할까? 물론 엔진에 따라 동작한다. WebKit의 JavascriptCore와 Google의 V8 엔진이 주요 엔진이다. NativeScript가 이것들을 활용하기 때문이다. 이 두 엔진은 코드 처리를 다르게 처리한다.

JavaScriptCore는 스크립트를 해석하고 최적화하는 일련의 단계를 수행한다. 어휘 분석을 수행하여 소스를 일련의 토큰 또는 식별 된 의미의 문자열로 나눕니다. 그런 다음 구문 분석기에서 토큰을 분석하고 구문 트리로 작성한다. 4 개의 JIT (just-in-time) 프로세스가 파서에 의해 생성 된 바이트 코드를 분석, 실행한다. 간단히 말해서, JavaScriptCore는 소스 코드를 가져 와서 문자열로 분해한다. (별명은 렉스).이 문자열은 컴파일러가 이해할 수있는 바이트 코드로 변환 한 다음 실행한다.

C ++로 작성된 Google의 V8 엔진은 또한 Javascript 소스 코드를 컴파일 및 실행하고, 메모리 할당을 처리하며, 가비지 수집시 남은 부분을 수집한다. 그 설계는 소스 코드를 기계어 코드로 직접 조립하는 두 개의 컴파일러로 구성된다.

구성되는 두가지 컴파일러는 최적화되지 않은 코드를 생성하는 고속 컴파일러 인 Full-codegen과 빠르고 최적화 된 코드를 생성하는 느린 컴파일러 인 Crankshaf이다.

Crankshaft가 Full-codegen에 의해 생성 된 최적화되지 않은 코드가 최적화가 필요한 것으로 판단하면,이를 'crankshafting'이라고하는 프로세스로 대체한다.

컴파일 과정에서 기계 코드가 생성되면 엔진은 NativeScript처럼 ECMA 표준에 지정된 모든 데이터 유형, 연산자, 객체 및 함수를 사용해야하는 브라우저 또는 런타임에 노출한다.

이것은 개발자들에게 무엇을 의미하나?

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

결론은 이러한 엔진의 진화는 웹과 모바일 영역을 진화시켜 가능한 한 잘 작동하도록 하려는 탐구와 병행된다. 이 진화를 추적하기 위해 arewefastyet.com과 같은 사이트에서 생성된 벤치마킹 그래프는 다양한 엔진의 상호 비교 성능을 보여준다.

모든 웹 개발자는 생성, 디버그 및 유지 관리되는 코드를 표시하는 브라우저의 고유한 차이점을 인식해야한다. 더 구체적으로 말하자면 특정 스크립트가 한 브라우저에서 다른 스크립트보다 더 빨리 작동하는 이유를 이해하는 것이 중요하다.

마찬가지로 모바일 개발자, 특히 웹 브라우저를 사용하여 하이브리드 모바일 응용 프로그램을 작성하여 NativeScript와 같은 런타임을 사용하는 개발자는 Javascript 코드를 해석하는 엔진을 알고 싶어한다. 모바일 웹 개발자는 작은 장치에서 다양한 브라우저가 제공하는 고유 한 한계와 가능성을 이해해야한다. Javascript엔진의 변화를 따라 잡는 것은 웹, 모바일 또는 애플리케이션 개발자로서 진화하려는 사람들에게 정말 효과적이다.

변역을 하며 느낀점

  • 원론적인 설명이라서 도움이 되는지는 잘 모르겠다.
Clone this wiki locally