변수이름 첫글자에 숫자가 올 수 없는 이유를 써 놓은 것을 보았는데, 핵심을 놓치고 있는것 같아서 적어봅니다.

궁극적인 이유는 lexical analysis의 편의를 위해서입니다.
컴파일 과정은 크게 3단계로 나뉘는데, 첫번째 단계가 lexical analysis, 두번째가 syntax analysis, 세번째가 code generation입니다. 간략히 설명드리자면,

lexical analyzer : 소스코드를 의미를 가지는 최소한의 심볼 단위로 자릅니다. 이렇게 자른 심볼을 lexeme, 즉 어휘라고 부르며, 이 렉심을 종류에 따라 구분하여 이것이 상수인지, 변수인지, 연산자인지를 판단하여 token으로 분류하여, 이 토큰의 열을 구문 분석기로 전달합니다. 따라서 어휘 분석기는 해당 언어에서 허용하는 어휘의 종류를 어떻게 판단할 수 있는지를 알아야 합니다. 즉, 소스 코드의 문자열이 어떻게 구성되어 있느냐에 따라 종류를 구분할 수 있어야 합니다.
예를 들어, a = 10; 이라는 구문이 있을 때, 어휘분석기는 이 구문을 다음과 같이 해석하여 구문 분석기로 전달합니다.
{a, 식별자}
{=, 연산자}
{10, 상수}
{;, 세미콜론}


syntax analyzer : 어휘 분석기로부터 넘어오는 토큰의 열이 문법에 맞는지를 검사합니다. 구문 분석기는 실제 lexeme이 무엇인가는 고려하지 않으며, 토큰의 구성 관계가 문법에서 허용하는 구성 방식인가만을 고려합니다. 따라서 구문 분석기는 언어의 문법에 관한 정보가 필요하게 됩니다. 만약, 언어에서 허용하는 문법 중에 <구문> ::= <식별자> <연산자> <상수> <세미콜론> 이라는 문법이 있고, 위의 예에서와 같이 {a, 식별자}, {=, 연산자}, {10, 상수}, {;, 세미콜론}과 같은 토큰의 열이 들어온다면, 구문 분석기는 lexeme은 고려하지 않고, 토큰의 종류만 보고서 이 토큰의 열이 문법에 맞는 구문이라고 받아들이게 됩니다. 만약, 토큰의 열이 {a, 식별자}, {=, 연산자}, {;, 세미콜론}, {10, 상수} 과 같은 순서라면, 해당하는 문법이 존재하지 않으므로 에러를 내게 됩니다.

code generator : 구문 분석기가 분석한 정보를 바탕으로 실제 오브젝트 코드를 생성합니다. 즉, a=10; 이라는 구문이 문법에서 적절한 구문이라면, a에 해당하는 메모리 번지에 10이라는 값을 쓰는 기계어 코드를 생성합니다.


위 컴파일 과정에서, 어떤 토큰이 변수명인지 상수인지를 구분하는 것은 lexical analyzer의 역할입니다. 이러한 lexical analysis는 기본적으로 문자열의 '패턴'을 보는 것이며, 이러한 문자열의 패턴은 거의 항상 Finite State Machine의 일종인, Deterministic Finite State Automata(이하 DFA)로 해석합니다. 여기에서 DFA의 자세한 동작을 설명드릴 수는 없고, 일단 간략히 설명드리자면, 기본적으로 DFA는 자신의 상태에 따라 입력을 하나씩만 보면서 자신의 상태를 바꿔 나가는 해석기입니다. 즉, 상태0에서 첫 글자가 A이면 상태1로 변하고, 첫글자가 B이면 상태 0으로 그대로, 그 밖의 경우에는 상태2로 변한다, 라는 식입니다. 즉, 글자를 하나씩 보면서 상태가 바뀌되, 그 앞의 입력을 다시 보는 경우는 없다, 라는 것이 DFA의 특징입니다.

이론적으로 DFA는 정규식으로 표현되는 어떠한 패턴의 문자열이라도 그 종류를 구분해 낼 수 있는 능력이 있으므로, lexical analysis의 근간을 이루는 계산 모델을 이룹니다. 하지만, 실제 컴파일러에게 필요한 lexeme의 종류는 한정되어 있으며 일정한 규칙이 있으므로, lexer의 스테이트 전이를 간단하게 만들 수 있는 규칙의 집합을 적절히 설계하는 것이 효율적인 컴파일러 작성에 중요합니다.
따라서, C의 lexer는 이를테면, 다음과 같은 식으로 구성되어 있습니다.

초기상태 : 알파벳, 혹은 _가 들어오면 "식별자 해석 상태"로 전이
초기상태 : 숫자가 들어오면 "상수 해석 상태"로 전이
초기상태 : 그밖의 다른 문자가 들어오면 "연산자 해석 상태"로 전이
식별자 해석 상태 : 알파벳이나 숫자, _가 들어오면 상태를 바꾸지 않음
식별자 해석 상태 : 그밖의 다른 특수문자가 들어오면 지금까지 읽어들인 문자를 모두 식별자로 해석하여 구분문석기에 넘겨주고 "초기상태"로 전이
상수 해석 상태 : 숫자가 들어오면 상태를 바꾸지 않음
상수 해석 상태 : 다른 문자가 들어오면 "XXXXX상태"로 전이
........ (이하생략) .......

즉, 첫 글자를 기준으로 상태를 크게 세 갈래로 바꾸어 해석함으로써 어휘 분석을 쉽게 할 수 있는 장점이 있게 됩니다. 첫글자가 숫자이면 "상수 해석 상태"에서 "식별자 해석 상태"로 전이할 일이 없게 되는 구조가 되어 lexical analysis구현이 훨씬 효율적으로 가능해지는 장점이 있게 되는 것이죠. 자세한 것은 Automata 교재나 컴파일러 교재를 참조하시기 바랍니다.

'Archive' 카테고리의 다른 글

Java 패키지 이름 짓기  (0) 2011.09.08
Because와 Since의 용법차이  (0) 2011.09.08
Callback 함수 튜토리얼  (0) 2011.09.08
쓰레드에 대해 공부하면서 도움이 된 글  (0) 2011.09.08
Hello World!의 기원  (0) 2011.09.08
  
 «이전 1  다음»