node.js동작원리에 대해서 자세히 알아보자
Node.js는 자바스크립트를 스크립트 언어 이상으로 프로그래밍 언어 역할을 할 수 있도록 지원하는 플랫폼이다. node.js를 이용해서 자바스크립트로 백엔드를 구현할 수 있으며, 대부분의 자바스크립트를 실행할 수 있게 해주는 엔진이다.
공식 홈페이지에서는 "V8 JavaScript엔진으로 빌드된 JavaScript 런타임"이라고 나와있다.
c++로 개발된 Google의 JavaScript 및 WebAssembly 기반 오픈소스 엔진이다.
v8은 JIT compilation를 사용하여 js코드를 실행한다.
대표적으로 Chrome과 node.js가 있다.
인터프리터와 컴파일
인터프리터(interpret) 컴파일(compile) 번역 방법 한줄 씩 번역 후 실행 전체를 번역 후 한번에 실행 장점 한줄씩 바로 실행되니까 컴바일보다 빠르다. 코드의 전체를 보기에 효율적인 실행코드가 생성된다. 단점 인터프리터 없이 실행할 수 없다. 기계어에 종속적인 실행코드가 생성되므로 기기가 달라지면 새로 컴파일 해야한다. 대표 Node.js, python c, c++, JAVA
조금 더 자세히 설명하면 v8엔진은 인터프리터 방식을 사용해 빠른 실행을 하면서, 성능 최적화를 위해 JIT 컴파일러(Tubo Fan)을 통해 자주 사용되는 코드를 감지하고 기계어로 변화해주어 실행 속도를 높인 하이브리드 엔진이라고 할 수 있다.
한 개의 스레드에서 모든 작업을 처리한다. => 요리사가 한명
javascript가 기본적으로 단일 스레드이기에 Node.js도 단일(싱글) 스레드 환경에서 동작한다.
이는 많은 이점을 가져온다.
I/O 작업이 완료될 때까지 기다리지 않고 다른 작업을 처리함 => 한명이 일하는데, 노련해서 라면 1개 물 올려놓고, 볶음밥 함
논 블로킹 방식은 javascript가 기본적으로 단일 스레드로 동작하기 때문에 채택되었으며,이로인해 싱글 스레드의 한계인 기존의 작업이 처리되기 전까지 다른 작업이 차단되는걸 막아줌
비동기적으로 작업을 처리함 => 주문이 들어와야만 일함
Node.js에서 발생하는 비동기 작업(콜백함수 등)을 관리하는 주체이다.
여러 단계로 구성되어, 각 단계마다 특정 종류의 작업들을 처리함
Node.js가 시작되면 이벤트 루프를 초기화하고 제공된 입력 스크립트를 처리하거나 비동기 API를 호출, 일정 타이머 또는 호출을 수행한 다음 이벤트 루프 처리를 시작한다.
libuv?
Node.js 내부에 포함된 C 기반 라이브러리인 libuv는, 네트워크 I/O, 파일 I/O 등의 비동기 작업을 수행한다. 또한 시스템 커널의 비동기 API와 인터페이스 역할을 하며, 자체 쓰레드를 이용하여 블로킹 작업들을 처리한다.