DeepDive node js - 1. 노드란 정확히 무엇인가?

임쿠쿠·2021년 12월 13일
1

Advanced_Node.js

목록 보기
1/1
post-thumbnail

1. What Exactly Is Node?

1) processor에서 JS코드를 실행하기 위해 Machine Code 변환이 필요하고 node에서는 interperter역할을 v8엔진이 담당한다.

2) JS 코드는 nodeJS위에서 실행되며, nodeJS는 V8과 Libuv 두개의 컴포넌트에서 실행된다. 결국 NodeJs는 JS코드와 V8엔진의 브릿지 역할을 한다.

  • V8은 c++구성되며, JS가 V8의 c++과 상호작용하기 위해 node는 그 위에서 managing을 한다.
  • 단, http/fs/crypto 모듈은 node에서 처리하며, V8의 역할은 JS를 machine code로 전환시키는 것이다.
  • Libuv는 이벤트 루프와 concurrency task를 담당한다.

3) V8엔진은 대체불가능한가?

  • 위 사진 처럼 다양한 engine 존재하며 브라우저 별로 각기 다른 engine 사용하기도 한다.

4) Node는 어떻게 C++로 구성된 V8엔진과 JS의 브릿지 역할을 하는가?

  • fs모듈의 readFileSync로 한번 따라가보자

참고 - Node 공식 github - readFileSync 폴더 주소

readFileSync함수에는 tryReadSync가 함수가 있고,

tryReadSync함수에 readSync함수가 있습니다.

readSync안에 binding.read가 있는데 이부분이 javascript와 c++의 브릿지 역할을 합니다.

  • javascript는 I/O에는 좋지만 calculate에는 성능이 떨어지므로, computing이 필요한 작업은 machine code와 가까운 c++에서 작업합니다.

c++로 된 Read를 보면,
참고 - NodeJS binding.read c++ 폴더 주소

readFileSync 실행 시 위 c++ 코드가 실행되며, 파란색으로된 부분이 readFile 실행, 빨간색인 부분이 readFileSync가 실행됩니다.

결론적으로 nodeJS가 JS와 c++를 어떻게 bridge하는지 보여주는 예로, process.binding은 JS와 c++ 바인딩 역할을 합니다.

5) 예외

일반적으로 JS => Node => v8 순서로 코드가 실행되지만, 때로는 위 사진처럼 JS는 바로 v8엔진에 요청하고 nodeJS가 이를 해석하기도 합니다.

참고

profile
Pay it forward

0개의 댓글