3.1) Handy CIL 프로그래밍 언어
이 문서에서 사용할 중간 단계 언어를 Handy C Intermediate Language라고 하겠다. 이 문서에서는 이를 CIL이라고 부를 것이다. 다음은 중간 단계 언어로 작성한 HelloWorld 프로그램이다. 다시 말하지만 C를 이용하여 중간 단계 언어를 흉내 낸 것이 불과하다.
HelloWorld.c |
#include "CIL.h"
STRING sHelloWorld = "Hello, world!"; // 프로그램에 사용할 문자열을 정의합니다.
PROC(main) // main 프로시저의 시작 지점입니다. PROC은 procedure의 줄임말입니다.
PUSH(sHelloWorld) // 콘솔에 문자열을 출력하기 위해 인자를 저장합니다. INVOKE(print_str) // 콘솔에 문자열을 출력하는 프로시저를 호출합니다.
ENDP // 프로시저의 정의가 종료되는 지점입니다. |
한 줄 한 줄 분석해보자.
- CIL 헤더 파일: 중간 단계 언어를 체험하기 위해 필자가 작성한 매크로가 정의된 파일이다.
- STRING: const char * 형식으로 정의되어있으며, C 형식의 문자열과 정의하는 방법이 같다.
- PROC(main): main 함수의 시작 지점이다. 함수는 프로시저(procedure)라고도 하는데, 앞으로 CIL에서는 함수라는 용어 대신 프로시저(procedure)라는 용어를 사용할 것이다.
- PUSH(sHelloWorld): CIL 프로그래밍 언어는 중간 단계이므로 함수를 호출하는 데 제약이 있다. C에서는 코드print_str("Hello, world!")를 작성하면 문자열이 잘 출력되지만, CIL에서는 다음과 같이 세 단계로 분리해야 한다.
> 프로시저 시작 이전에 문자열 sHelloWorld를 ("Hello, world!")로 정의한다.
> print_str 프로시저를 호출하기 전에 sHelloWorld를 PUSH 명령을 이용해 인자로 보관한다.
> INVOKE 매크로를 이용해 print_str 프로시저를 호출한다. 결과로 문자열이 출력된다.
- INVOKE(print_str): 방금 말했듯, print_str 프로시저를 호출한다.
- ENDP: 프로시저의 끝을 나타낸다. main 프로시저가 끝나면 프로그램이 종료된다.
예제는 아주 단순하다. 이해하는 데 무리가 없으리라 생각한다. 주의할 점이라면, CIL의 문장의 마지막에는 세미콜론(;)을 사용하지 않아도 되며 한 줄에 하나의 명령만 가능하다. 다만 PROC, ENDP와 같은 키워드에는 세미콜론을 사용하면 안 되는데 이에 대해서는 후에 자세히 다루겠다.