* 2015년 경희대학교 DASOM 동아리에서 진행된 스터디 내용입니다.
이번에는 이런 고급언어들이 어떻게 해서 컴퓨터에 명령을 내리는지 살펴보겠습니다.
컴퓨터가 고급언어들을 이해하기 위해서는 기계어(또는 어셈블리어)로 번역해줄 일종의 “번역가”가 필요합니다.
이런 번역기는 “프로그램”으로써 정의되어 지는데, 우리가 C++을 짤때 사용하는 Visual Studio도 컴파일러라는 번역기를 내장하고 있고, Java도 javac라는 자바 컴파일러가 내장되어있습니다. python도 python인터프리터를 내장하고 있고요
이런 번역프로그램들은 크게 “컴파일러”와 “인터프리터”로 나뉘어 집니다.
컴파일러는 프로그램 제작시점 또는 컴파일 시점에 프로그램을 전부 기계가 이해할 수 있는 문장으로 번역하는 것이고, 인터프리터는 소스코드를 실행파일으로, 기계에 바로 명령을 내리게 됩니다.
컴파일의 대표적 예는 위에서 언급한 C/C++이 있고
인터프리팅의 대표적 예는 Python이 해당됩니다.
컴파일의 경우 인터프리팅에 비해 속도가 매우 빠릅니다. (런타임, 즉 수행시간에 문법을 분석하지 않고 바로바로 실행 가능하기 때문에), 또한 인터프리팅은 소스코드를 그대로 공개하여야 하기 때문에 보안에도 취약한 편이죠.
하지만 인터프리팅 언어도 쉽다는 장점이나, 가벼운 언어를 구성할 수 있다는 장점이 존재하기에 이 두 방법이 널리 쓰이고, 때론 혼용되어서 쓰이기도 합니다.
이번 클래스에서는 컴파일러를 구성하기에는 난이도가 있으므로, 단순한 형태의 인터프리터를 구현하는것을 목표로 하겠습니다.
그렇다면 본격적인 구현에 앞서 우리가 무엇무엇을 구현해야 하는지 살펴 봅시다.
현대의 프로그래밍 언어는 기본적으로 위의 속성들을 가지고 있다고 볼 수 있습니다.
우선 입력과 출력은 기본적으로 되어야합니다,
사용자가 프로그램과 상호작용 하기 위해서는 아주 필수적인 요소이죠.
이런 연산이 가능하기 위해서는 저장공간도 필요하고,
적당히 때에 따라 연산을 달리 수행하려면 로직도 필요합니다.
그리고 프로그램의 구현을 간소화 시켜줄 함수도 당연히 필요합니다.
하지만 이런것들을 전부 지원해도 매번 Ctrl+C, Ctrl+V로 짜야한다면 불편하겠죠?
모듈화, 모듈삽입을 지원하여 반복적인 개발작업을 단순화 시켜야 합니다.
우리는 이 클래스에서 이러한 속성을 가진 언어를 개발할 예정입니다.
언어의 개발은 C++로 이루어 질 태니 C++에 대해 기본적인 문법적 이해가 필요합니다.
여기서는 가볍게 훑는 느낌으로 진행하니 디테일한 내용은 여러 전공서적이나, 온라인 강의등을 추천하는 바입니다.
아래의 내용의 문법을 모른다면 먼저 공부하고 와야합니다!
1. 기본입출력과 파일입출력이 필요합니다.
2. if, else if, else 등의 분기문이 필요합니다.
3. for, while, do~while 등의 반복문이 필요합니다.
(특히 for문은 자유자재로 다룰 수 있어야 합니다.)
4. 함수의 선언과 호출이 가능해야하고, parameter와 return value의 이해도 필요합니다.
5. string 헤더의 std string을 이해하고 쓸 수 있어야 합니다.
6. 다차원 배열과 동적할당을 이해할 수 있어야 합니다.
7. 상태 다이어그램에 대해서 이해하여야 합니다.
위 내용중 1~6번은 블로그나 책에서 많이 찾아볼 수 있고, 이 강의에서는 7번 항목만 설명하도록 하겠습니다.
흔히 상태천이도, 상태다이어그램등으로 불리고, FSM(유한상태기계)라는 단어로도 묶어서 부르기도 합니다.
유한 상태기계 에서는 일단 phase또는 state라고 정의되는 “상태”가 존재합니다.
상태는 각각의 조건에 따라 다른 상태로 이동하게 됩니다.
예를들어서 컴파일러에서 “nice”라는 문구가 들어오는지 찾는다면 위와 같은 상태천이도를 가지게 되는것이죠.
마찬가지로 우리가 짜는 인터프리터도 위의 방식으로 파싱을 진행하고, 문법적 내용이 추가되면서 상태천이도는 매우 복잡해집니다.
BNF문법이나 여러가지 내용으로도 문법을 설명하고 (그게 간단하지만) 여기서는 초보자들의 이해를 돕기 위해 상태도로 최대한 설명하고자 합니다.
(BNF, EBNF문법은 후반부에 설명할 예정입니다.)
위의 예시 말고도, 상태도는 매우 다양하게 표현할 수 있습니다.
“입력값이 문자(A-Z, a-z) 인가?”, “뒤에 3글자만 존재하는가?” 등 프로그래밍에 대해서는 신경쓰지 않고도 마음대로 논리를 가져다 쓸 수 있다는 점을 명심하였으면 하고 다음 시간까지 과제가 있습니다.