|
먼저 이 Ch1에서 당장 읽지 않아도 될 부분을 빨갛게 표시했다. 상식을 넓히려면 읽어도 되지만 핵심인 컴파일러의 원리를 아는 데는 당장은 필요 없다. 여기선 Ch1의 내용을 압축해서 설명할 것이다. 책을 읽는 요령은 그림을 먼저 보고 글을 나중에 읽는 것이다. 그리고 가장 중요한 것부터 이해하고 나머지는 나중에 이해하는 것이다. 설명을 위해서 전문용어 대신 일상적인 용어로 비유를 하니까 오해 없길 바란다. <그림 : Ch1 목차>

<그림 : 컴퓨터 언어 처리 절차와 컴파일러 내부 처리 단계>
 좌측 그림은 고급언어를 배웠다면, 특히 C를 배웠다면 잘 아는 절차이다. 그 중에 컴파일러 부분을 확대한 그림이 우측으로 전체 절차를 잘 설명해 주고 있다. 처음 작성한 프로그램들은 여러 Text File(문자로 된 문서 파일)로 나뉘어 있다. 이것을 하나로 묶는 것이 처음 절차다. 묶은 것을 번역하면 그것으로 끝나지 않고 업체에서 제공하는 라이브러리(도서관 자료라는 뜻으로 자기 프로그램에 붙여 넣을 것들을 말함)나 자기가 직접 전에 만들어 번역한 다른 프로그램과 연결(Link)시키는 작업이 남아 있다. 이렇게 연결이 된다고 해서 끝나는 것이 아니다. 기계에서 실행이 될 때는 메모리에 올라가야 하는데 이 작업을 O/S가 해준다. 그 중에 컴파일러만 따로 보면 우측 그림 부분이다. 이 단계들을 중간 언어가 만들어지기 전(Front-End)과 후(Back-End)로 나누기도 한다. 먼저 단어를 뽑아 단어집을 만들고, 그 다음 단어들이 이룬 문법 구조를 파악하고, 그 다음에 의미를 따져보고 중간언어로 번역해 둔다. 이 중간언어를 각 기계에 맞는 각자의 기계어로 번역하는 것이다. 기계란 IBM PC나 다른 업체 컴퓨터 같은 것을 말한다.
★ Compiler(편집자) : Interpreter(통역자) : Translator(번역자) ※ 왜 번역자라는 말 대신에 편집자라는 말을 사용했을까? 인터프리터는 문장 하나씩 번역해서 실행한다는 의미다. 컴파일러는 한 번에 번역하고 나서 실행을 하는 것이다.
<그림 : 단어와 문법 해석의 예>

그러면 단어해석은 뭐고 문법 해석은 뭔가? 모든 언어의 기본이라 할 수 있는 수식으로 나타낸 예가 바로 위의 그림이다. ★ Linear Analysis(선형해석) = Lexical Analysis(단어해석) = Scanning(훑기) ※ 괄호 같이 전후가 호응하여 짝이 되는 구조(구)는 해석할 수 없다. 선형이란 말은 일직선으로 한 방향으로 계속 훑는다는 것에서 나온 말이다.
★ Hierarchical Analysis(계층해석) = Syntax Analysis(문법해석) = Parsing(문법설명) ※ 괄호 같이 전후가 호응하여 짝이 되는 구조(구)를 해석할 수 있다. 계층이란 말은 괄호가 양파껍질처럼 층을 이룬다는 것과, 나무 모양의 그림에서 가지가 층을 이루어 뻗는 것에서 나온 말이다.
★ Semantic Analysis(의미해석) ※ Type(형:품사) 해석, 컴퓨터에게 의미란 실행을 말한다. 실행은 주로 계산을 말한다. 계산을 하려고 하는데 뭔가 불가능한 계산을 시키면 문제가 된다. 이런 것을 의미 해석이라 한다.
글자 하나씩을 읽어서 단어를 찾아 내서 단어장에 정리하는 것이 단어 해석이다. 용어는 설명을 쉽게 하기 위해 유치한 표현을 이용하니 너무 신경 쓰지 마라. 이렇게 단어장에 단어를 정리하고 문법을 분석한다. 문법을 분석할 때는 보통 우리가 영어를 배워서 알겠지만 단어의 품사와 어순을 따진다. 마찬가지로 단어의 품사, 즉, 컴퓨터 언어에선 Type(형)이라는 것을 찾고 이것들이 적당하게 배치되었는지 보는 것이다. 또한 나무 모양의 그림이 나타내는 것이 바로 괄호로 싸이는 구조다. 즉, 뭐가 먼저 조립(계산)이 되고 뭐가 그 다음에 조립(계산)이 되는지 나타낸다. 먼저 조립(계산) 되는 것들은 괄호로 묶인 것과 같다. 앞의 그림에서 곱하기가 더하기보다 먼저 실행된다는 의미와 같다. 이렇게 양파껍질처럼 둘러싸면서 문장이 조립되는 과정을 나무 모양의 그림이 보여준다. 이런 구조를 분석하는 것을 문법 분석이라 한다. 이 나무 그림은 사람이 그리기는 쉽지만 컴퓨터는 그리기 어렵다.(^^)
★ Token(상징:[종류+번호]를 사용한 것, 예)사람1, 사람2) ★ Identifier(상징:이름) : Symbol(상징:기호) ★ Keyword(핵심단어:+,-,*,/,=, if, then, else 등 고정적 Identifier) ★ Lexeme(이름:문자들로 이루어진 이름 그 자체, 예)홍길동, 김선달) ※ 모두 상징이라는 뜻이 있다. 그런데 책에선 상세하게는 달리 사용된다. Identifier에서 Keyword와 Token과 Lexeme을 분리한다!?(^^) 미세한 차이가 있다. 뭔지 모르겠으나 단어라면 ID가 된다. 이 단어가 컴파일러에서 고정적으로 사용하는 미리 약속된 단어라면 Keyword가 된다. 그 외의 것은 품사를 구분해야 한다. ID를 Token이라는 <품사+숫자>로 대체하고 그 옆에 이름인 Lexeme을 함께 표시한다. 결국 그 놈이 그놈이지만 다르게 용어를 사용하니 알아두자.
<그림 : 문장과 수식 정의 예>

★ Expression(수식) : Statement(문장) ※ 컴퓨터 언어를 배우면 이 둘을 구분한다는 것을 알 것이다. Ch1에선 간단한 수식을 예로 들어서 문장과 수식을 구분하는 법을 나타냈다. 수식은 계산을 의미한다. 그 이외의 것은 모두 문장이라고 보면 된다. 그래서 수식 아니면 문장 이렇게 2가지 밖에 없다.(^^) 그리고 문장 안에 수식이 들어간다. 수식은 문장 안에서만 사용된다는 말이다. 수식이란 문장의 일부다. 계산 결과를 어떻게 하는 것이 문장이다. 계산만 하는 부분은 수식이다.
<그림 : 좀 더 구체적인 처리과정>

백문이 불여일견이라고 했다. 간단한 수식을 구체적으로 어떻게 처리하는지 보인 것이다. 이미 어셈블리어나 고급언어를 배운 사람은 이 그림만으로 이해가 될 것이다. 또한 어학 공부할 때 문법 분석이라는 나무 그림을 그려본 사람이면 알 수 있을 것이다. 수학적 표현(수식)이 우리가 사용하는 언어와 별로 다를 것이 없다. 우리가 사용하는 언어도 이와 같은 방식으로 분석이 가능하다. 책에는 이 과정이 상세하게 설명되어 있지만 먼저 그림을 보고 이해하면 책의 글을 읽을 필요는 없다. 중간 언어는 거의 어셈블리어와 비슷한 수준의 일종의 가상적인 기계(컴퓨터)의 어셈블리어라고 보면 된다. 그러니 중간 언어가 만들어졌다면 나머지는 쉽게 된다고 생각하고 컴파일러의 핵심이 중간언어 만드는 것까지라고 알면 된다. ★ Phase(기능 단계) : Pass(문서 읽기 단위) ※ 여러 Phase를 모아서 1 Pass를 만들 수 있다. Pass란 문서를 한 번 훑어 읽는 것을 말한다. 앞의 그림에서 문서를 한 번 읽어서 단어/문법/의미 해석까지 한다면 1 Pass로 3 Phase가 처리 되는 것을 말한다. 용어로만 알아 두자. Ch2에서 간단한 1Pass 컴파일러를 만들어 보게 된다. 결과물은 중간 언어까지다.
|