Javascript는 컴파일러 언어이다.
컴파일러 언어의 처리 과정에서 소스코드 실행 전 3단계를 거친다.
컴파일레이션
1. 토크나이징 / 렉싱
문자열을 나누어 토큰이라는 조각으로 만드는 과정
(빈칸은 의미가 있냐 없냐에 따라 토큰으로 남을 수 있다)
2. 파싱
토큰 배열을 프로그램의 문법 구조를 반영해 중첩원소를 갖는 원소를
갖는 트리 형태로 바꾸는 과정이다.
(파실 결과로 만들어지는 것이 AST 추상 구문 트리 이다)
3️⃣. 코드 생성
AST를 컴퓨터에서 실행 코드로 바꾸는 과정이다.
JS엔진은 파싱과 코드 생성 과정에서
불필요한 요소를 삭제하는 과정을 거쳐 실행시성능을 최적화한다.
JS엔진이 기존 컴파일러와 다른 점은
JS컴파일레이션을 미리 수행하지 않아서 최적화할 시간이 많지는 않다.
어떤 JS 조각이라도 실행되려면 먼저 컴파일 되어야 한다.
즉, JS 컴파일러 라는 프로그램을 받아 컴파일 하며 바로 실행될 수 있게한다.
엔진 : 컴파일레이션을 주도해 프로그램을 실행
컴파일러 : 파싱과 코드 생성을 한다.
스코프 : 변수 검색 목록을 작성하고 유지한다.
또한, 엄격한 규칙을 강제하여 현제 실행 코드에서 변수의 적용방식을 정한다.
컴파일러가 프로그램을 만나면 하는일 ( var a = 2; 라는 프로그램을 만난경우 )
1️⃣. 존재 확인
var a 를 컴파일러가 만나면, a가 특정 컴파일러 안에 있는지 확인한다.
이미 있다면 선언을 무시하고 지나가고,
없다면 스코프 컬랙션내에 새로운 변수 a를 선어하라 요청한다.
2️⃣. 접근 가능 확인
a = 2 라는 대입문을 처리하기 위해 엔진이 실행할 수 있는 코드를 생성한다.
실행하는 코드는 스코프에 a 변수가 현재 스코프 컬랙션 내에서 접근 가능한지 확인한다.
접근 가능하면 변수a를 사용하고 아니면 엔진이 다른 스코프를 탐색한다.
LHS와 RHS
LHS 검색 : 값을 대입할 변수 컨테이너를 찾는 것. 변수가 대입 연산자의 왼쪽에 있을 때 수행.
RHS 검색 : 변수의 값을 찾는 것. 변수가 대입 연사자의 오른쪽에 있을 때 수행(LHS가 아닌 쪽에 가깝다)
대입연산자 : =, +=, -=, 와 같은 연사자들
개념적으로는 대입할 대상(LHS)와 대입한 값(RHS)로 생각하는 것이 좋다.
중첩 스코프
스코프는 확인자 이름으로 변수를 찾기위한 규직의 집합니다.
스코프도 다른 스코프 안에 중첩(Nested)될 수 있다.
대상 변수를 해당 스코프에서 발견 하지 못한다면
엔진은 다음 바깥의 스코프로 넘어가 변수를 찾는다.
(한단계씩 올라가며 글로벌 스코프에 도달하게 되면 검색을 멈춘다)
LHS와 RHS의 오류 대처
LHS의 오류 대처 : Strict Mode 가 아니라면 찾는 변수명으로 글로벌 스코프에 변수 선언 후 엔진에 넘겨준다.
RHS의 오류 대처 : 검색이 중첩 스코프 안에 존재하지 않는다면, 엔진이 RefferenceError를 발생시킨다.
Strict Mode는 자동/암시적으로 변수 선언이 불가하기에 LHS도 Refference Error가 발생한다.
'JavaScript > You Don't know JS' 카테고리의 다른 글
I don't know JS YET) 함수 vs 블록 스코프 - 1 (1) | 2022.12.21 |
---|---|
I don't know JS YET) 렉시컬 스코프 (0) | 2022.12.16 |
JS 복습 1주차 / 4. 강제 변환 Coercion (0) | 2022.11.07 |
JS 복습 1주차 / 3. 네이티브 (0) | 2022.11.07 |
JS 복습 1주차 / 2. 값 (0) | 2022.11.05 |