프로그래밍의 기본 패러다임
-> 변수에 값을 저장하고 저장된 값을 가져다 쓰고 수정
프로그램에 변수라는 개념이 추가되면서 생겨난 질문
-> 이 질문을 통해 특정 변수를 저장하고 나중에 그 변수를 찾는데는 잘 정의된 규칙이 필요하다라는 점을 알 수 있다.
자바스크립트는 일반적으로 '동적' 또는 '인터프리터' 언어로 분류하나 사실은 '컴파일러 언어'이다.
자바스크립트 엔진은 전통적인 컴파일러 언어에서 컴파일러가 하는 일의 상당 부분을 우리가 아는 세련된 방식으로 처리함
컴파일레이션(Compilation) : 전통적인 컴파일러 언어의 처리 과정에서는 프로그램을 이루는 소스 코드가 실행되기 전에 보통 3 단계를 거침
문자열을 나누어 '토큰'이라 불리는 의미 있는 조각으로 만드는 과정
예 )
var a = 2;
라는 코드에서
토큰 배열을 프로그램의 문법 구조를 반영하여 중첩 원소를 갖는 트리 형태로 바꾸는 과정
파싱의 결과로 만들어진 트리를 AST(추상 구문 트리) 라 부름
1.2.1 출연진
프로그램 var a = 2;
1.2.2 앞과 뒤
프로그램 var a = 2; 를 보면 하나의 구문으로 보임
하지만 사실 엔진은 두 개의 서로 다른 구문으로 봄
하나는 컴파일러가 컴파일레이션 과정에서 처리할 구문이고, 다른 하나는 실행 과정에서 엔진이 처리할 구문
그 후 토큰을 파싱해 트리구조로 만듬. 그러나 코드 생성 과정에 들어가면 컴파일러는 몇몇 독자의 추측과 다르게
프로그램을 처리함
컴파일러가 다음 의사코드(Pseudo-Code)로 요약될 수 있는 코드를 생성한다고 생각할 수 있음
변수를 위해 메모리를 할당하고 할당된 메모리를 a라 명명한 후 그 변수에 값 2를 넣음
하지만, 이것은 그렇게 정학한 설명이 아님
1) 컴파일러가 'var a'를 만나면 스코프에게 변수 a가 특정한 스코프 컬렉션 안에 있는지 물음.
변수 a가 이미 있다면 컴파일러는 선언을 무시하고 지나가고,
그렇지 않으면 컴파일러는 새로운 변수 a를 스코프 컬렉션 내에 선언하라고 요청
2) 그 후 컴파일러는 'a = 2' 대입문을 처리하기 위해 나중에 엔진이 실행할 수 있는 코드를 생성.
엔진이 실행하는 코드는 먼저 스코프에게 a라 부르는 변수가 현재 스코프 컬렉션 내에서 접근할 수 있는지 확인
가능하다면 엔진은 변수 a를 사용하고, 아니라면 엔진은 다른 곳을 살핌.
엔진이 마침내 변수를 찾으면 값 2를 넣고, 못 찾는다면 엔진은 손을 들고 에러가 발생했다고 소리칠 것이다.
요약하자면, 별개의 두 가지 동작을 취하여 변수 대입문을 처리함
1) 컴파일러가 변수를 선언함
2) 엔진이 스코프에서 변수를 찾고 변수가 있다면 값을 대입