먼저 단어 분할이 무엇인지 이야기해 보겠습니다. 단어 분할은 문자열을 프로그래밍 언어에 의미 있는 코드 블록으로 분해하는 것입니다. 이러한 코드 블록을 토큰이라고 합니다. 예를 들어, 코드 var a = 2
는 다음 어휘 단위로 분해됩니다. 구체적으로는 var,a,=,2입니다.
참고: 단어 분할은 실제로 위의 전체 코드를 세그먼트로 분할하는 것입니다.
파싱은 어휘 단위의 흐름을 수준별로 중첩된 요소로 구성된 트리로 변환하는 것이며, 이는 프로그램의 문법 구조를 나타냅니다. 이 트리를 추상 구문 트리라고 합니다. 여기서는 지나치게 긴 표준어를 고려하여 이를 보다 직관적인 형태로 직접 표시하지 않겠습니다. 세부사항은 다음과 같습니다:
분석: 추상 구문 트리에는 var라는 최상위 노드가 있고 그 뒤에는 변수 a가 있는 하위 노드와 할당 연산자 =가 있는 노드가 있습니다. 할당 기호 아래에 또 다른 하위 노드 2가 있습니다. 구체적으로 코드 var a = 2
에 해당합니다.
추상 구문 트리를 실행 가능한 코드로 변환하는 과정을 코드 생성이라고 합니다. 이 프로세스는 언어 및 대상 플랫폼과 밀접한 관련이 있습니다. 간단히 말해서, var a = 2
의 추상 구문 트리를 기계 명령어로 변환하는 방법이 있습니다. a라는 변수를 만들고 a에 값을 저장하는 데 사용됩니다.
주로 엔진을 사용하여 JavaScript 코드를 실행합니다. 엔진이 var a = 2를 실행하면 변수 a가 선언되었는지 검색하여 확인합니다. 검색 프로세스는 범위의 도움을 받습니다. 쿼리 프로세스 동안 엔진은 변수 a에 대해 LHS(왼쪽 쿼리)를 수행하고 값에 대해 오른쪽 쿼리를 수행합니다. 쉽게 말하면 할당 연산의 왼쪽에 변수가 나타나면 LHS 쿼리를 수행하고 오른쪽에 변수가 나타나면 RHS 쿼리를 수행합니다. 보다 정확하게 말하면 LHS 쿼리는 변수 자체의 컨테이너를 찾으려고 시도하고 RHS 쿼리는 소스 값을 얻으려고 시도합니다.
참고: 함수에는 LHS 및 RHS 쿼리가 모두 있습니다. 매개변수를 전달하는 과정에서 코드는 암시적 할당을 수행하기 때문입니다.
변수가 선언되지 않은 경우 LHS 쿼리와 RHS 쿼리의 동작이 다릅니다.
함수 foo(a){ console.log(a+b); b=a;}foo(2)
참고: b에 대한 첫 번째 오른쪽 쿼리는 변수를 찾을 수 없습니다. 즉, 관련 범위에서 찾을 수 없기 때문에 선언되지 않은 변수라는 의미입니다. RHS가 중첩된 범위에서 필요한 변수를 찾을 수 없는 경우 엔진은 예외를 발생시킵니다.
함수 foo(a){ var b=a; a+b를 반환합니다. } var c=foo(2)
문제: 모든 LHS 쿼리와 RHS 찾기
답: LHS(c=…,a=2,b=…) 및 RHS(foo(2…,=a,a…,…b))