JavaScript Engine은 프로그램이나 자바 스크립트 코드를 실행하는 프로그램 또는 인터프리터.
5.9버전 이전까지는 V8 엔진은 바이트코드로 변환하지 않고 조금 더 최적화된 기계 친화적 언어로 번역했고, 다른 언어들은 컴파일러를 통해 바이트 코드로 변역을 거치고 인터프리터를 거쳐서 머신코드로 만들어집니다.
이후 파이프라인 개념이 도입되어 최근에는 안에 있는 인터프리터와 최적화 컴파일러로 자바스크립트 코드를 번역하고 통역합니다.
엔진 실행과정을 보면 JIT 컴파일 형식이라 스크립트언어 또는 인터프리터언어 하나로 단정짓기는 무리가 있다고 합니다.
링크텍스트
자바스크립트 컴파일러 내부 매커니즘 AST
소스 코드 구조를 표시하는 계층적 프로그램 표현
코드의 프로그램을 나타내는 노드 트리
function addFive(num) {
return num + 5;
}
위 예제코드에서 컴파일러가 다음의 AST를 추출
{
type: "Program",
start: 0,
end: 44,
body: [{
type: "FunctionDeclaration",
start: 1,
end: 44,
id: {
type: "Identifier",
start: 10,
end: 17,
name: "addFive"
},
expression: false,
generator: false,
async: false,
params: [{
...
}],
body: {
...
}
}],
sourceType: "module"
}
이벤트 루프는 현재 콜스택이 비어있을 때마다, 태스크큐에서 콜백함수를 가져와 실행시킨다.
이벤트 루프는 ECMAScript 스펙에 없다. 자바스크립트 엔진이 아니라 이 엔진을 돌리는 환경(브라우저 or Node.js)에서 실행시키는 것 이기 때문이다.
이벤트루프나 태스크큐 등 동시성에 관한 처리(비동기)는 자바스크립트엔진을 구동하는 환경인 브라우저 혹은 Node.js에서 한다. 이 환경들은 다중스레드를 활용해 자바스크립트 콜백들을 태스크큐에 던지고, 이벤트 루프를 통해 V8엔진의 콜스택에서 실행될 수 있게 한다.