본문 바로가기
JAVASCRIPT

[JS][스코프] 스코프란?

by KBS 2022. 2. 15.
728x90

스코프란 무엇인가

프그래밍 언어의 기본 패러다임중 하나는 변수에 값을 저장하고 값을 가져다 쓰고 수정하는 것이다. 이 기능은 프로그램에서 상태를 나타낼 수 있게 해준다. 이와 같은 개념이 없다면 프로그램은 상당히 제한적이고 지극히 심심한 작업만 할 수 있을 것이다. 그러나 변수를 프로그램에 추가하면 다음과 같은 재미있는 질문이 생긴다.

  • 변수는 어디에 살아있는가? 다른 말로 하면 변수는 어디에 저장되는가?
  • 필요할 때 프로그램은 어떻게 변수를 찾는가?

이 질문을 통해 알 수 있는 것은 특정 장소에 변수를 저장하고 나중에 그변수를 찾는 데는 잘 정의된 규칙이 필요하다는 점이다. 바로 이런 규칙을 '스코프'라고 한다.

그렇다면 스코프 규칙은 어디서 어떻게 정의될까?

컴파일러 이론

여러 언어를 다루어 봤다면 자명할 수도 있겠고 아니라면 놀라울 수도 있겠지만, 자바스크립트는 일반적으로 '동적'또는 '인터프리터'언어로 분류하나 사실은 '컴파일러 언어'다. 물론 자바스크립트가 전통적인 많은 컴파일러 언어처럼 코드를 미리 컴파일 하거나 컴파일한 결과를 분산 시스템에서 이용할 수 있는 것은 아니다. 하지만 자바스크립트 엔진은 전통적인 컴파일러 언어에서 컴파일러가 하는 일의 상당 부분을 우리가 아는 것보다 세련된 방식으로 처리한다.

전통적인 컴파일러 언어의 처리 과정에서는 프로그램의 이루는 소스 코드가 실행되기 전에 보통 3단계를 거치는데 이를 '컴파일레이션'이라고 한다.

토크나이징/렉싱

문자열을 나누어 '토큰'이라 불리는 의미 있는 조각으로 만드는 과정이다. 예를들어 "var a = 2;"라는 프로그램을 보자. 이 프로그램은 다음의 토큰으로 나눌 수 있다.

  • var
  • a
  • =
  • 2
  • ;

빈칸은 하나의 토큰으로 남을 수도있고 아닐 수도있다.

토크나이징과 렉싱은 미묘하고 학술적인 차이가 있는데, 토큰을 인식할 대 무상태 방식으로 하는지 상태유지 방식으로 하는지에 따라 구분한다. 쉽게 말해 '토크나이저'가 상태 유지 파싱 규칙을 적용해 a가 별개의 토큰인지 다른 토큰의 일부인지를 파악한다면 렉싱이다.

파싱

토큰 배열을 프로그램의 문법 구조를 반영하여 중첩원소를 갖는 트리 형태로 바꾸는 과정이다.

"var a = 2;"의 트리는 먼저 변수 선언이라 부르는 최상위 노드에서 시작하고, 최상위 노드는 'a'의 값을 가지는 확인자와 대입 수식이라 부르는 자식 노드를 가진다. 대입 수식 노드는 '2'라는 값을 가지는 숫자 리터럴을 자식 노드로 가진다.

코드생성

AST(파싱의 결과로 만들어진 트리)를 컴퓨터에서 실행 코드로 바꾸는 과정이다. 이 부분은 언어에 따라 또는 목표하는 플랫폼에따라 크게 달라진다. 코드 생성에 대한 세부 사항을 보며 끙끙대기 보다는 일단 앞서 말한 "var a = 2;"를 나타내는 AST를 기계어 집합으로 바꾸어 실제로 a라는 변수를 생성하고 값을 저장할 방법이 있다고 치자.

엔진이 시스템 리소스를 실제 어떻게 관리하는지에 관한세부 사항은 살펴볼 범위를 넘어선다. 엔진이 필요한 변수를 생성하고 저장할 것이라고 가정하자.

자바스크립트 엔진은 이 세가지 단계 뿐 아니라. 많은 부분에서 다른 프로그래밍 언어의 컴파일러보다 훨씬 복잡하다. 예컨대, 자바스크렙트 엔진은 파싱과 코드 생성 과정에서 불필요한 요소를 삭제하는 과정을 거쳐 실행 시 성능을 최적화 한다.

자바스크립트 엔진이 기존 컴파일러와 다른 점은 자바스크립트 컴파일레이션을 미리 수행하지 않아서 최적화할 시간이 적다는 것이다.

자바스크립트 컴파일레이션은 보통 코드가 실행되기 겨우 수백만 분의 일초 전에 수행한다. 자바스크립트 엔진은 가능한 한 가장 빠른 성능을 내기 위해 여러 종류의 트릭을 사용한다.

간단히 말하자면, 어떤 자바스크립트 조각이라도 실행되려면 먼저 커파일되어야 한다는 것이다. 즉, 자바스크립트 컴파ㅣㄹ러는 프로그램 "var a = 2;"를 받아 컴파일하여 바로 실행될 수 있게 한다.

 


참고

  • You Don't Know JS - 타입과 문법, 스코프와 클로저( 한빛 미디어 )
728x90

댓글