지난 대안언어축제에서 김창준씨의 언어속언어세션을 들으면서 처음으로 DSL(Domain Specific Language)에 대해서 알게되었습니다. 물론 알고보니 그동안 제가 사용했던 적도 있고 생각했었던 개념이긴 했지만 언어에 기반한 문제 해결이 아니라 문제 해결에 기반한 언어를 생각하는 방식은 참신하고 즐거운 생각이었습니다. 실제로 세션에서 진행되었던 프로그래밍 부분에서는 간단한 프로그램을 설계했었지만 기존의 방식과 다른 EDSL(Embeded Domain Specific Language)를 이용한 설계에서 많은 것을 배울 수 있었습니다.
그렇게 DSL과 첫만남을 했었는데, 요즘 실용주의 프로그래머를 읽다보니 12장에 "도메인 언어"라는 챕터명으로 DSL에 대하여 설명이 나와 있는 것을 보고 굉장히 반가운 마음이 들어서 읽어보았습니다.
DSL은 결국 프로그래밍 언어
DSL은 말 그대로 어떤 영역에 특화된 언어입니다. 우리가 가장 흔하게 접할 수 있는 것으로는 퀘이크 등의 FPS게임의 스크립트 언어를 들 수 있는데요, 대부분의 이런 게임에 내장되어 있는 스크립트 기능을 이용해서 새로운 MOD(Modification)를 만들 수 있습니다. 게임에 내장된 언어를 이용하여 새로운 게임을 창출하는 거죠. 스타크레프트나 워크레프트3의 경우도 Custom Map을 디자인 할 수 있는 툴을 제공합니다. 툴에는 맵 디자인 뿐 아니라 스크립트엔진도 포함되어 있어 게임을 제작할 수 있죠. 실제 워크레프트3에 있는 시나리오 캠페인은 워크레프트3의 맵 제작기로 제작한 것이라 합니다.
게임 분야 뿐 아니라 CAD나 Maya와 같은 그래픽 프로그램에도 특화된 언어를 제공하고 있습니다. 더 일반적인 예로는 Excel의 매크로가 있겠죠. 이러한 DSL들은 프로그램을 더 강력하게 하고 일반적인 한계를 넘어서는 것 뿐만 아니라 프로그램의 사용을 더 편리하게 하는 역할도 합니다.
Battlefield 1942의 Mod중 가장 인기가 많았던 Desert Combat
DSL을 이용한 개발
좀 더 넓게 생각해보면 프로그램 개발에도 DSL을 이용할 수 있습니다. 대부분의 프로그램은 해결을 하기 위한 어떠한 문제가 존재합니다. 예를 들어 포토샵의 경우는 이미지를 편집해야 한다는 문제가 존재합니다. 우리가 이러한 프로그램을 만들면서 그 프로그램이 해결해야 할 문제를 알고 그 프로그램이 어떠한 영역에서 작동하는지 파악하면, 그 문제를 그 문제의 영역의 표현으로 기술할 수 있습니다. 그리고 그렇게 기술하는 언어가 DSL이 되는 것입니다.
"실용주의 프로그래머"에서의 예를 들면
일련의 X.25 선에서 ABC 규칙 12.3에 정의된 트랜잭션에 귀 기울이고 있다가, 트랜잭션이 오면 XYZ 회사의 43B 형식으로 바꾼 다음, 그것을 위성 통신을 이용해 다시 전송하고 추후 분석용으로 저장해 둡니다.
라는 문제를 해결하는 방법을 클라이언트가 정의하였다면 아래와 같은 소형 언어(mini language)로 표현할 수 있습니다.
From X25LINE1 (Format = ABC123) {
Put TELSTAR1 (Format = XYZ43B);
Store DB;
}
실제로 이렇게 쓰고 실행이 가능하다면 프로그램을 쉽게 작성할 수 있을 뿐 아니라, 추후 관리에서도 많은 도움이 될 것입니다. 실제 이와 같은 개발을 위해서는 사용할 소형 언어에 필요한 기능들을 구현하고 언어를 위한 간단한 인터프리터나 컴파일러를 구축합니다. 그렇게 만들어진 언어에는 우리가 만들고자 하는 프로그램에서 다루어야 할 문제에 대한 해결방법이 들어 있기 때문에 그 언어를 이용해 자연스럽게 목적 프로그램을 작성할 수 있습니다.
이러한 방식의 프로그래밍을 Buttom-Up Programming이라고 부릅니다. 기존의 프로그램 작성법인 Top-Down Programming에서는 프로그램을 몇개의 기능이나 다른 분류방법에 따라 분류한 후 그걸 또 분류하여 작성하는 방법을 택하였지만, Buttom-Up Programming에서는 그 기반이 되는 언어를 구성하고 그 언어를 기반으로 프로그래밍 하는 방법을 이용합니다.
연습문제
"실용주의 프로그래머" 챕터 12에 있는 연습문제 5번을 끝으로 이 글을 간단히 끝내려고 합니다. 제 생각에는 이 문제에 DSL의 장점과 개념이 들어 있는 것 같습니다. 이 문제는 문제를 푸는 것보다 문제를 보는 것이 중요할 것 같네요.
5. 우리는 간단한 그리기 프로그램을 제어하기 위해 소형 언어를 하나 구현하려 한다. 이 언어는 한 글자짜리 명령으로 구성되는데, 어떤 명령은 뒤에 한 자리 숫자가 따라 나올 수도 있다. 예를 들어, 다음을 입력하면 사각현이 하나 그려진다.
P 2 # 2번째 펜을 선택한다
D # 펜을 종이에 내려놓는다
W 2 # 서쪽으로 2cm 이동하며 그린다
N 1 # 그 다음 북쪽으로 1cm 이동하며 그린다
E 1 # 그 다음 동쪽으로 2cm 이동하며 그린다
S 1 # 그 다음 다시 남쪽으로 그린다
U # 펜을 종이에서 든다.
이 언어를 파싱하는 코드를 구현하라. 코드는 새로운 명령어를 추가하기 쉽게 설계되어야 한다.
반복적이고 유사한 Control flow를 data structure로 대체할 수 있다면 그렇게 하라는 속담과 비슷한 얘기지... 난 DSL솔류션을 매우 매우 좋아함... Interpreter만드는 것도 재밌고...
답글삭제DSL ê´ë ¨ ë©ëª¨
답글삭제No Fluff, Just Stuff Anthology (Pragmatic Programmers)ìì 13ì¥ The Many Guises of Method Instrumentationì ë¤ë£¬ Eitan Suezì´ ì¶ì²í ì± , Agile Web Development with Rails: A Pragmatic Guide (Pragmatic Programmers)ì 1쪽ì Railsì ê°ì ì...