# Javascript

js는 브라우저에서 다양한 인터렉션을 위해 탄생한 언어입니다.

단시간에 만들어진 언어라 설계에 몇몇 문제가 있지만, 그럼에도 불구하고 브라우저에서 동작하는 언어로서 특히 fe개발자에게 중요한 언어입니다.

Javascript 개발자들이 알아야할 기본적인 것들을 정리해놨습니다.

리스트에 없는 몇몇 브라우저의 API는 여기서 소개합니다

아래는 핵심적인 개념들을 설명합니다.

# 프로그래밍 패러다임

  1. 프로토타입기반의 상속모델과 객체지향 프로그래밍
  2. 함수형 프로그래밍
  3. 동적이고 유연하다

# 클래스 상속모델과 프로토타입 상속모델

핵심은 프로토타입 상속모델로 클래스상속모델을 구현하는것은 매우 간단한 일이고, (실제로 ES6엔 class 키워드가 있다.)

반대로 클래스 상속 모델로 프로토타입 상속모델을 구현하는것은 매우 힘든 일이다.

# 비동기란? 그리고 자바스크립트에서 이것이 중요한 이유

비동기 프로그래밍이란 엔진이 이벤트루프에서 실행된다는 의미이다.

동기적인 프로그래밍에서는 네트워크 요청이나 disk io 같은 시간이 오래걸리는

작업들이 실행되면 처리가 완료될때까지 블로킹된다.

싱글스레드를 채택하는 자바스크립트의 특징에서, 무거운 작업을 만나서 블로킹이 된다면,

다음작업을 실행할수없다. 브라우저상에서 네트워크 요청중에 아무작업도 할 수 없다면 얼마나 불편할까?

그래서 비동기가 등장하게 됐다.

노드에서도 기본적으로는 동시에 여러작업을 할 수는 없겠지만(워커를 사용하면 가능), 네트워크요청을 기다리고 처리하는동안 다른 리퀘스트를 받는 정도는 가능하다는 것이다. 비동기의 우수성은 이미 다른 언어나 환경에서도 채택할정도로 이미 입증됐다.

# Just In Time Compilation (JITC)

현재 메이저 브라우저의 js엔진은 인터프리터가 아닌 JITC입니다.

자바스크립트 코드를 파싱하여 bytecode 형태로 변환하고, 기본적으로는 인터프리터가 한줄씩 코드를 해석 실행하지만 자주 반복되는(Hot Spot)이라면 native code로 컴파일하여 실행합니다.

V8엔진의 Bytecode를 더 이해하고싶다면..

nodejs는 8.x버전대 이상을 사용한다면 바이트코드를 직접 프린트해볼수도있습니다.

node --print-bytecode --eval 1+1