더북(TheBook)

2.2.1 싱글 패스 컴파일러

파싱, 분석, 코드 생성을 인터리브10해서 구문 트리나 IR을 할당하지 않고 파서에서 출력 코드(output code)를 직접 생성하는 단순한 컴파일러가 있다. 이러한 싱글 패스 컴파일러(single-pass compiler)는 언어 디자인상 제약이 따른다. 프로그램에 관한 글로벌 정보를 보관할 중간 자료 구조가 없고 이전에 파싱한 코드를 다시 방문하지도 않는다. 즉, 어떤 표현식을 보자마자 올바르게 컴파일할 수 있을 정도만 알면 된다.

구문 지향 번역(Syntax-directed translation)11은 이러한 동시 다발적 컴파일러(all-at-once compiler)를 만드는 구조화된 기법이다. 보통 출력 코드를 생성하는 액션(action)을 문법의 각 부분과 연결한다. 그런 다음, 파서가 해당 구문 청크와 매치될 때마다 해당 액션을 실행하면서 한 번에 한 규칙씩 타깃 코드를 쌓아 올린다.

파스칼과 C는 이 한계를 고려하여 디자인된 언어다. 당시 메모리는 아주 귀해서 컴파일러는 전체 프로그램은 고사하고 소스 파일 전체를 메모리에 담기도 빠듯했다. 파스칼 문법상 타입 선언이 블록 제일 앞부분에 나와야 하는 것도 이 때문이다. C 언어에서 컴파일러가 이후 등장하는 함수의 호출 코드를 생성하기 위해 알아야 할 정보를 앞에서 명시적으로 선언하지 않으면 어떤 함수도 그것을 정의한 코드 앞에서 호출할 수 없는 것도 같은 맥락이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.