2.1.3 정적 분석
처음 두 단계는 거의 모든 구현체가 비슷하다. 언어의 개성이 뚜렷하게 드러나기 시작하는 것은 지금부터다. 코드의 (어느 표현식이 어디에 중첩되는지 등의) 구문 구조(syntactic structure)는 알아냈지만, 이 이상 아는 것은 없다.
예를 들면, a + b 같은 표현식에서 a와 b를 더한다는 건 알지만 이 이름으로 뭘 참조하는지는 모른다. 로컬 변수? 아니면 글로벌 변수? 이 두 변수는 어디에 정의되어 있을까?
대부분의 언어가 수행하는 첫 번째 분석 작업을 바인딩(binding) 또는 레졸루션(resolution)이라고 한다. 식별자(identifier)마다 이름이 정의된 곳을 찾아 이 둘을 연결 짓는 행위다. 여기서 스코프(scope, 범위)가 중요한 역할을 한다. 스코프는 어떤 이름으로 어떤 선언을 참조할 수 있는 소스 코드의 영역이다.
정적 타입 언어(statically typed language)는 바로 이 단계에서 타입 체크를 실시한다. a와 b가 어디에 선언되어 있는지 알고 있으니 타입도 바로 알아낼 수 있다. 그런데 만약 해당 타입이 덧셈 연산이 지원되지 않는 타입이면 타입 에러(type error)가 발생한다.
앞으로 이 책에서 만들 록스는 동적 타입 언어(dynamically typed language)이므로 타입 체크는 나중에 런타임에 한다.