언어를 정의하자



컴파일러를 만들기 전에 반드시 해야 하는 것이 있습니다.

바로 '만들려고 하는 컴파일러가 어떤 언어를 컴파일 할 것인가?' 입니다.

즉, 언어를 정의해야 한다는 것입니다.


C 언어 컴파일러를 만들거라면, C 언어 문법을 정의해야 합니다.

그리고 java 언어 컴파일러를 만들려면, java 언어 문법을 정의해야 겠지요.

아시다시피 이렇게 기존에 있는 언어를 위한 컴파일러를 만들 때는, 문법 정의를 할 필요가 없습니다.

이미 만들어져 있는 언어니까요.


하지만, C나 java 처럼 많이 쓰고있는 언어들은 그 양이 너무나 방대합니다. orz

공부를 하기 위해서 C 나 java 같은 언어의 컴파일러를 만들어 보면, 더 없이 좋겠지만 엄청난 인내와

엄청난 시간이 필요하겠지요


그래서 공부를 위해서 C 나 java 컴파일러를 만들 수는 없을 것 같아, 매우 매우 매우 심플한 언어를 정의해 볼까 합니다.

사실 언어라고 말 하기에도 민망하게 그지 없습니다.

그만큼 간단하게 만들거거든요.


중요한건 얼마나 멋진 언어냐가 아니라, 처음부터 끝까지 컴파일러를 만들어 본다는데 의미를 두도록 하겠습니다.

멋진 언어야 컴파일러를 만들 줄만 안다면, 얼마든지 가능한 일 아니겠습니까?


주저리 주저리 말이 너무 많은것 같으니, 본론으로 들어가 언어 정의를 해 보도록 하겠습니다.

절대... 만들려고 하는 언어가 허접해서 계속 떠드는건 아닙니다.. 는 개뿔 사실입니다.





언어


언어를 만들려면 먼저 이름을 지어주어야 할 것 같습니다.

C, java, ruby, caml, python 등과 같이 뭔가 이름이 있어야 겠지요.


어차피 간단한 언어니까, 문법만큼이나 이름도 생각없이 지어보도록 하겠습니다.

이름하여~~~ 'VVSL' 입니다.

눈치 빠르신 분들은 벌써 무슨 약자인지 아실겁니다. -_-;

'Very Very Simple Language' 입니다. 하하하...............(민망하네요)


일단 기능정의를 해 보도록 하겠습니다.


기능정의

1. 함수는 지원한다.

2. 변수 선언 지원한다.

3. 데이터 타입은 void 를 제외하고 int, string 두개만 지원한다.

4. 연산은 대입연산과 사칙연산만 지원한다.



너무나 간단하죠? 후후...

아마 VVSL 로 작성된 코드는 이런 모양이 되겠네요.


[예상 소스코드]


 int main(void) {
   int x = 3;
   string str = "abc";
   print str * x;

   return 0;
}





지금 코드를 보면 간단하지만, 괜히 욕심내서 이것저것 넣었다가는 나중에 가서 감당이 안될것 같아 그렇습니다.

처음부터 욕심내서 중간에 포기하느니, 심플하게라도 끝내고 싶은 저의 마음이랄까...


이제 어떤 언어의 컴파일러를 만들지, 대략 정해진것 같습니다.

물론, 실제로 저런식으로 대충대충 정의해서는 안되겠지요.

그러나 보시는것 처럼 c 와 python 의 복합버젼이라고 생각하시면 될 겁니다.



이제 본격적으로 컴파일러를 만들기 위해서 스캐너(scanner)를 만들어야 합니다.

스캐너(scanner)를 직접 만들기엔 일이 너무 많으니, 렉서 제너레이터(lexer generator)를 이용하도록 하겠습니다.

사용할 제너레이터(generator)는 JavaCC(Java Compiler Compiler) 입니다.

이는 LL(k) 타입의 렉서(lexer) 겸 파서(parser) 제너레이터(generator) 입니다.

출력되는 소스코드 언어는 이름에서 알 수 있듯이 java 입니다.


스캐너(scanner) 작성은 다음 블로그에서 진행하도록 하겠습니다.





'개발관련 > 컴파일러' 카테고리의 다른 글

컴파일러 만들기 6부  (17) 2014.05.31
컴파일러 만들기 5부  (9) 2012.07.13
컴파일러 만들기 4부  (0) 2012.07.12
컴파일러 만들기 2부  (8) 2012.07.11
컴파일러 만들기 1부  (4) 2012.07.10