JS동작
JS는 컴파일언어? 인터프리터언어?
인터프리터언어이다. 그러나 실행중 컴파일이 필요한 경우에만 엔진 내부에서 컴파일 과정을 거친다
컴파일이란 작성된 코드를 기계어로 변환하는 것을 말한다.
인터프리터는 번역과 동시에 실행이 이루어짐
동작과정은 js파일 파싱 => AST 생성, 인터프리터가 코드를 실행, 바이트코드 생성, 바이트코드는 인터프리터 모드일 때 바이트코드를 실행하고, JIT모드일때 컴파일러에게 보내고 이를 기반으로 기계어를 생성.
바이트코드 : 실행프로그램의 이진표현법
JIT컴파일 (just-in-time) 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일기법.
1. JS 특징
JS는 단일 쓰레드기반언어인 이유는 JS엔진이 단일 호출스택을 사용한다는 관점에서만 OK
JS가 구동되는 환경(브라우저, nodejs)에서는 주로 여러개의 스레드가 사용, JS엔진과 상호 연동을 위한 장치가 이벤트루프인 것
- 한번에 하나씩 작업을 처리
- 그러나 웹을 보면 동시에 처리되는 것 처럼 보인다.
- Node.js기반 서버는 동시에 다수의 HTTP요청을 처리하기도 함
- 어떻게 JS는 쓰레드가 하나인데 동시성을 지원할까?
- 이벤트루프를 통해 비동기방식으로 동시성을 지원
- 블록킹 I / O
- 파일을 읽기위해 시스템콜을 OS에게 보냄
- 커널은 I / O처리를 하고 어플리케이션은 다 읽을 때까지 기다리는데 이를 Blocked되었다고 함
- 단일 쓰레드가 아닌 멀티쓰레드
- 멀티스레드 : 여러 쓰레드가 동시에 실행되어 요청을 처리
- 쓰레드기반 동작발생에 대한 문제는 2가지가 있음
- 블록킹 I / O 자체 문제 : I / O 요청하고 응답올때 까지 아무것도 하지 않고 시간을 낭비
- 문맥교환 비용 : 쓰레드가 많아질수록 문맥교환에 따른 성능저하 발생
- 이러한 문제를 싱글 쓰레드, 이벤트기반 비동기 I/O처리로 해결가능
- 싱글 쓰레드 노드는 I/O작업이 시작되면 응답을 기다리지 않고 바로 다음 작업을 실행함
- I/O작업이 종료되면 이벤트 발생하고 해당 프로세스의 이벤트큐에 등록함
2. 동시성을 지원하는 이벤트루프
이벤트루프는 자바스크립트 엔진(V8)이 아닌 브라우저, nodejs에서 지원한다,