컴파일러로 점프!
컴파일러
//hello_world.c
#include <stdio.h>
void print_hello(){
printf("Hello World?\n");
}
int main(){
print_hello();
printf("Hello World!\n");
}
매번 보는 C 언어 책 챕터 1에서 볼법한 Hello World!
출력하기 함수이다.
C 언어라는 프로그래밍 언어를 사용하면서 한 번도 hello_world.c
라는 파일에 있는 문자열들이 어떻게 Hello World!
를 출력하는 하나의 프로그램으로 변하는지 관심을 가지는 사람은 많이 존재하지 않을 것이다.
또는 관심을 가지더라도 쉽게 다가가기 어려운 주제일 수 있다.
이 컴파일러 챕터는 컴파일러라는 주제를 이해하는 것을 목표로 한다.
그리고 실제로 제작하는 것까지 진행하는 것을 최종 목표로 삼는다.
언어?
우리는 프로그래밍 언어 라는 단어를 흔하게 사용한다, 그런데 이 언어라는 단어의 정체는 뭘까?
물론 우리는 언어학자가 아니므로 언어학의 시각으로 언어라는 단어를 해석할 필요는 없다.
그렇다면 다음과 같은 정의 중에서 우리 엔지니어들의 입맛에 잘 맞는 정의를 선택해 보자
언어(言語)에 대한 정의는 여러 가지 시도가 있었다. 아래는 그러한 예의 일부이다.
- 사람들이 자신의 생각을 다른 사람들에게 나타내고 전달하기 위해 사용하는 체계.
- 사물, 행동, 생각, 그리고 상태를 나타내는 체계.
- 사람들 사이에 공유되는 의미들의 체계.
- 문법적으로 맞는 말의 집합.
- 언어 공동체 내에서 이해될 수 있는 말의 집합.
[출처 - https://ko.wikipedia.org/wiki/언어 ]
어느 정도 감이 오는가?
위 정의 중에서는 4번이 컴파일러라는 주제를 이해하기 위한 가장 적절한 정의라고 생각된다.
그렇다면 문법적으로 맞는 말이 무엇일까?
문법
우리가 정의하는 언어는 일정한 문법에 따라서 배열된 일정한 기호들의 집합을 언어라고 정의할 수 있다.
그렇다면 일정한 문법과 일정한 기호는 무엇일까?
사실 C언어를 수만 코드 이상 작성한 여러분들은 아마도 프로그램을 작성하라고 하면 몸이 본능적으로 다음과 같이 함수를 생각하지도 않고 작성할 것이다
int main(int argc, char* argv[]){
...
}
오! 만약 이 문장을 바로 적었다면 여러분은 자신의 모국어와 함께 C 언어라는 언어의 화자라고 보아도 무방할 것이다
함수 뜯어보기
그렇다면 위 함수를 뜯어보자, C언어를 배울 때 함수 선언에 대해서 우리는 보통 이렇게 배운다.
- 먼저 함수의 return 형식을 적는다
- 함수의 이름을 적는다
- 소괄호(
(
)를 연다 - 함수에서 사용할 변수'들'을 적는다
- 변수는 '변수의 type' '변수명' '
(,)
' 의 형식으로 적는다
- 변수는 '변수의 type' '변수명' '
- 소괄호(
)
)를 닫는다 - 괄호(
{
)를 연다 - 함수 내용을 작성한다
- 괄호(
}
)를 닫는다
이 과정이 바로 문법에 맞게 언어를 사용하는 예시이다.
C 언어라는 언어에서 함수를 정의하고 싶으면 위의 문법에 맞게 언어를 사용하여야 한다.
마치 영어 (또는 다른 외국어를) 배울 때 지독하게 외웠던 to 부정사, 동사의 3단 변화 같은 것과 동일한 것으로 볼 수 있다.
컴파일러란 이렇듯 문법에 맞는 문자열들을 파싱하여 함수와 같은 언어의 구성 요소들로 나누어주고, 나누어진 구성요소에 맞게 기계어로 바꾸어주는 도구이다!
앞으로 배울 것
지금까지 언급한 것을 중심으로 앞으로 무엇을 배울 것인지 알아보자.
- 먼저 프로그래밍 언어라는 것이 어떻게 정의되는지 알아보자.
- 다음으로 C 언어라는 제3외국어의 문법이 어떻게 정의되는지 살펴보자
- 문법에서의 요소들을 어떻게 쪼갤 수 있는지 알아보자
- 쪼갠 요소들을 어떻게 기계어로 바꿀 수 있는지 알아보자
위 주제들을 이해하고 컴파일러를 만들어보면 언어와 컴퓨터를 보는 시각이 완전히 달라질 것이라고 장담할 수 있다!!
하지만 그만큼 어렵고 배워야 할 것도 많은 주제이다. 앞으로 몇 년이 걸릴지 모르지만, 필자도 글을 끝까지 작성할 수 있도록 노력할 것이다.
단순한 컴파일러를 만들고 나면 조금 더 다양한 주제인 컴파일러 최적화와 같은 요소들을 살펴보는 것도 재미있을 것이다.