Back_End/Node.js

[ 백엔드 공부하기 : Node.js ] NodeJS에 활용되는 JavaScript의 기본 동작 원리와 V8엔진.

안다미로 : Web3 & D.S 2024. 12. 5. 20:58

 

 

 

 

[ 백엔드 공부하기 : Node.js ] 

NodeJS에 활용되는 JavaScript의 기본 동작 원리와 V8엔진.

 


 

 

∇백엔드_NodeJS : JavaScript의 기본 동작 원리와 V8 엔진.

목   차

1. 자바스크립트 : 엔진이란.
2. V8엔진
3. JS엔진의 내부 실행 원리
4. JS는 개인사업자
5. 상호작용 시뮬레이션

 

 


 

∂ JS의 특성.

"JavaScript"의 태생 자체가 1주일도 안되는 시간에  웹 환경을 위해서 만들어진 언어입니다. [이래서 근본이 약하긴해요]
시대의 변화에 맞춰서 JS는 다양한 특성들을 장착해왔습니다.
명령형(imperative), 함수형(functional), 프로토타입기반(prototype-based), 객체지향 프로그래밍을 지원하는
'멀티 패러다임 프로그래밍 언어'이면서 '인터프리터 언어'입니다.

 

 

☆ 브라우저에서 HTML 바디 태그 내부 JS로 작성된 코드가 작동하기까지의 과정과 원리는 무엇인가??

      [ = 브라우저가 V8엔진과 함께 JS를 실행시키는 원리 ]

 

 

 

Ⅰ. 자바스크립트 : 엔진이란??


 

◆ 웹 브라우저는 하나의 커다란 해석기입니다.  웹-브라우저 자체의 구성 요소는 아래와 같습니다.

 

      

      ▼ "JS엔진" 은  우리가   .HTML 이라는  'static file'에 <script>로 감싼 JS코드를 실행하는 영역을 의미합니다.

 

      ▼ '렌더링 엔진'은 HTML 문서를 한 줄씩 순서대로 파싱하다가, 

            " JS 파일을 로드하는 Script태그를 만나게 되면   DOM 생성을 일시 중단합니다.

                   ->> script 태그의 src에 정의된 JS파일을 서버에 요청하여 응답받으면

                             JS코드를 파싱하기 위해 JS엔진에게 제어권을 넘깁니다.

 

 

 


Ⅱ. V8엔진.


     ▼ V8은 구글이 도입한 오픈소스 JS 엔진입니다.

             √  C++ 언어로 작성되었으며, 구글 크롬 / 크로미움 웹 브라우저 / NodeJS를 지원합니다.

         

             √  브라우저 환경 등과 상호작용하고 프로그램을 실행하기 위한 바이트코드를 생성하는 역할을 담당합니다.

 

             √  V8엔진과 다른 엔진의 가장 큰 차이점은 V8 엔진의 JIT(Just In Time) 컴파일러 입니다.

 

V8 엔진의 아키텍쳐.

 

 

 

                 위 아키텍쳐 구조에서 'Parser' 부분을 자세히 보면

Parser

 

   ◎ 파서(Parser)

 

         ○ (1) 렉시컬 분석(Lexical Analysis) -> (2) 신택스 분석 (Syntax Analysis) -> (3) AST 의 흐름으로

                        'Abstract Syntax Tree' 를 만들어냅니다.

 

         ○ AST를 이용해서 상위 수준의 코드 표현을 하위 수준의 표현으로 변환합니다.

 

 

   ◎ Ignition

         

          ● 분석된 AST를 입력함으로써 바이트 코드를 생성합니다.

                 이에 따라 'bytecode'를 실행함으로써 진짜 소스코드가 실행됩니다.

 

 

   ◎ TurboFan

         

          ● 자주 사용되는 코드는 TurboFan으로 보내집니다.

               TurboFan은 전달받은 코드를 'Optimized Machine Code'로 컴파일해서 사용합니다.

 

          ● V8 ≒ 8기통 엔진

                - Ignition은 엔진 시동시에 사용되는 '점화기'같은 역할이며,

                    TurboFan은 가열되는 부분(자주 사용되는 부분)을 식히는 Fan을 의미합니다.

 

 

 


Ⅲ. JS엔진의 내부 실행 원리.


   

브라우저에서 자바스크립트 런타임 환경실행 구성요소.

 

★  JS 엔진 내부만 보면  크게  [ Memory Heap & Cal stack   ] 2개의 파트가 있습니다.

 

 

     ◎ Memory Heap


             ● 데이터를 임시 저장하는 곳으로, 함수나 변수, 변수를 실행할 대 사용하는 값들을 저장합니다.

                  ≡    "heap 저장공간"

 

             ●해당 부분에서 더 이상 사용되지 않는 변수나 데이터 덩어리들을 비워주는 GC(Garbage Collection)가 있습니다.

 

 

 

     ◎ Call Stack

 

          ● 코드가 실행되면 순서를 기록해 놓고, 하나씩 순차적으로 꺼낸면서 실제로 실행 가능하도록 도와주는 공간입니다.

                 - stack 자료구조 형태이며,  LIFO(Last In, First Out) 의 원칙을 따릅니다.

 

function add(a, b) {
    return a + b;
}

function average(a, b) {
    return add(a, b) / 2;
}

console.log(average(10, 20));

 

          ● call stack에 순차적으로,

             console.log -> average -> add가 쌓이고, 다 쌓인 뒤에는 역순으로 add 결과 -> average 결과 -> console.log 결과

 

          ● 실제로 코드를 싱핼했을 때,  다음 순서로 실행되어야 할 코드들을 순서대로 기록하며

                      순차적으로 코드를 실행시킵니다.

 

          ● stack 이라는 자료구조에서 대표적으로 무한루프와 같이 저장공간이 가득차서 넘치는 현상

              "stack overflow"라고 합니다.

 


 

Ⅳ. JS는 개인사업자.


 

JS는 태생적으로 "싱글 스레드(작업하는 파트가 혼자)" 이기 때문

    call stack상에 작업 중 하나가 오래 걸리는 순간,전체 작업시간도 같이 느려지게 됩니다.

 

★ 그래서 필요한 것이 "Event Loop" 와 "Callback Queue" , 그리고 "browser web APIs" 입니다.

 

 

 

     ◎ Event Loop

 

            ● "이벤트 발생 시 호출"되는  콜백 함수들을 관리하여서 Callback Queue에 전달하고 ,

               Callback Queue에 담겨있는 콜백 함수들을 Call Stack에 넘겨줍니다.

 

            ● 이벤트 루프가  "Callback Queue" 에서 "Call Stack" 으로 콜백 함수를 넘겨주는 작업은 

                   " Call Stack"에 쌓여있는 함수가 없을 때만 수행됩니다.

                반복적으로 Call Stack이 비어있는지 확인하는 것을 " tick " 이라고 합니다.

 

 

 

     ◎ Callback Queue

 

            ●web api에서 비동기 작업들이 실행된 후 호출되는 콜백함수들이 기다리는 공간입니다.

 

            ●  "Event Loop" 가 정해준 순서대로 대기열에 서있으며,  "FIFO(First In First OUt) " 방식을 따릅니다.

                      -> Callback Queue는 실제로는 하나의 큐로 이루어진게 아니라

                             Microtask Queue, Animation Frames 과 같은 여러개의 큐로 이루어져 있습니다.

 

 

     ◎ (Browser) Web APIs

 

            ●  " Web api" 는 브라우저에서 자체 지원하는 api입니다.

 

            ● Web api는

                Dom 이벤트,  Ajax(XmlHttpRequest) & setTimeout 등의 비동기 작업들을 수행 가능하도록 api를 지원합니다.

                    -> 브라우저가 제공하는 web api는 " MDN 전체 Web API " 에서 확인 가능합니다.

 

 


 

 

 

Ⅴ. 상호작용 시뮬레이션.


 

    (1) 아래와 같은 코드를 실행한다고 가정해봅시다.

              html에는 button이 있고, 해당 버튼에 event를 바인딩하는 코드와 console.log를 실행하는 코드

                       그리고 비동기 함수인 setTimeout을 실행합니다.

 

 

 

    (2) 결과는 다음과 같습니다. 

             $.on 이벤트 바인딩 하는게 call stack에 들어오고 바로 web apis로 갑니다.

 

             그리고 console.log와 setTimeout이 차례로 들어옵니다. 그리고선 실행,

 

setTimeout(function timeout() {
    console.log("Click the button!");
}, 5000);

 

 

 

    (3) 위 코드, setTimeout 으로 인해 5초마다 실행되는 console.log가 계속 callstack을 들락 날락합니다.

              바인딩 된 버튼을 누르면

 

 

 

    (4) 좀 혼란스럽지만, "버튼을 누를때마다 Callback Queue에 쌓이고서

               쌓인게 다시 Event Loop에 의해서 call stack으로 가서 실행되는 것.

                     = > 2개의 다른 setTimeout이 어떻게 실행되고 있는지를 보면 됩니다.

 

    (4)결과적으로  Event loopCall Stack이 비어있는지를 "주기적으로 확인" 하고

            "Callback Queue"에서 "Callback function" 을 가져와서 Call Stack에서 

              JS 코드가 실행가능하도록 돕는 역할을 합니다.