도메인 특화 언어 (DSL: Domain-Specific Languages)

도메인 특화 언어(DSL)란?

도메인 특화 언어는 관련 특정 분야에 최적화된 프로그래밍 언어입니다. DSL은 해당 분야 또는 도메인의 개념과 규칙을 사용합니다.

도메인 특화 언어와 '진정한' 프로그래밍 언어와의 차이점은 무엇인가요?

도메인 특화 언어는 일반적으로 Java, C, Ruby 등의 범용 언어보다 덜 복잡합니다. 보통 DSL은 해당 DSL이 사용될 분야의 전문가와 긴밀하게 협력하여 개발합니다. 대부분의 경우 DSL은 소프트웨어 전문가가 아닌, 해당 DSL의 대상 분야에 능통한 비 프로그래머가 사용하도록 제작됩니다.

도메인 특화 언어의 이점과 중요성은 무엇인가요?

DSL을 이용하면 많은 이점을 얻을 수 있습니다. 무엇보다 DSL의 가장 큰 이점은 언어와 변환 엔진을 갖추면 지루한 작업을 일일이 수행할 필요가 없어, 해당 DSL과 관련된 소프트웨어 개발의 특정 부분에서 훨씬 더 효율적으로 작업할 수 있다는 것입니다. 소스 코드를 해석하는 것이 아닌 DSL 프로그램으로 생성하려는 경우, 해당 DSL 프로그램에서 컴파일러와 마찬가지로 추상성을 제거하고 효율적인 코드를 생성하므로 런타임 오버헤드 없이 도메인에 특화된 멋진 추상적 개념을 사용할 수 있습니다.

해당 도메인에 따라 긴밀히 조율된 언어로 도메인 문제를 표현할 방법이 있는 경우, 작성 코드가 구현 세부 정보로 복잡해지지 않기 때문에 더 명확하게 판단할 수 있습니다. 즉, DSL을 사용하면 중요하지 않은 복잡한 요소에서 필수 항목만 분리할 수 있습니다.

해당 분야의 전문가(즉, 비 프로그래머)가 직접 표현하는 방식에 맞춰 긴밀하게 조율된 도메인, 추상적 개념, 표기법을 가진 DSL은 프로그래머와 해당 분야의 전문가를 매우 원활하게 연결해 줍니다.

DSL 및 실행 엔진을 사용하면 대상 플랫폼에서 자유로운 DSL 코드로 애플리케이션 로직을 표현할 수 있습니다. 또한 DSL을 사용하면 버그는 줄고, 구조적 적합성은 향상되며 유지보수의 편의성이 높아지는 등, 제작한 제품의 품질을 향상시킬 수 있습니다. 이는 불필요한 자유도를 없애고 코드 내 중복을 피하며 반복 작업을 자동화하여 나온 결과입니다.

도메인 특화 언어와 일반 코드를 함께 사용하는 방법은 무엇인가요?

전통적인 코드와 DSL 코드를 통합하는 방법에는 전혀 다른 2가지가 있습니다. 첫 번째는 DSL 코드와 일반 코드를 별도의 파일에 보관하는 것입니다. 이때 DSL 코드는 자동 코드 생성기를 통해 프로그래밍 언어 코드로 변환되거나 해당 생성기에 도메인별 코드로 로드되어 실행됩니다. 이처럼 범용 언어(GPL) 및 DSL 코드를 분리하는 첫 번째 접근 방식을 외부 DSL이라고 합니다. 외부 DSL의 예시는 SQL을 떠올려 보면 됩니다.

다른 접근 방식은 DSL 코드와 범용 코드를 동일한 프로그램 파일에 혼합하는 것으로, 두 코드가 훨씬 더 긴밀하게 통합됩니다. 이때 DSL은 GPL의 문법과 파서를 재사용하고 호스트 언어의 확장 옵션을 이용합니다. 내부 DSL이라는 용어는 이러한 시나리오를 설명하는 데 사용됩니다.

일부 GPL은 다른 GPL보다 확장에 더 적합하다는 사실에 유의해야 합니다.

상황에 따라 2가지 방법 모두 의미가 있으며 MPS에서 둘 다 지원됩니다.

DSL 구조와 구문은 해당 DSL 코드가 삽입될 대상 언어로 코드를 작성하여 정의합니다. 일반적으로 IDE는 DSL을 이해하지 못하므로 지원(코드 완성, 사용자 지정 오류 검사 등)을 제공하지 않습니다. 그러나 MPS에서는 언어 확장을 정의하는 언어 개발용 특수 DSL이 있는 MPS 프레임워크를 사용할 수 있습니다. 즉, IDE가 이를 이해하고 있어, 삽입되는 도메인 특화 언어에 완벽한 IDE 지원이 제공됩니다.

언어 지향 프로그래밍이란?

언어 지향 프로그래밍이라는 용어는 JetBrains 창립자 겸 CEO이자 MPS의 '창시자'인 Sergey Dmitriev의 2004년 논문인 Language-Oriented Programming: The Next Programming Paradigm(언어 지향 프로그래밍: 차세대 프로그래밍 패러다임)에서 처음 사용되었습니다. 다른 사람들도 유사한 접근 방식을 대개 다른 이름으로 제안했습니다. 대표적 예로는 Charles Simonyi의 의도적 프로그래밍(Intentional Programming) 접근 방식과 Martin Fowler가 2005년 논문, Language Workbenches: The Killer-App for Domain Specific Languages?(언어 도구: 도메인 특화 언어의 핵심 애플리케이션은 무엇인가?)에서 설명한 접근 방식이 있습니다.

핵심 아이디어는 소프트웨어를 개발할 때 하나의 언어만 사용하는 것이 아니라 작업별로 가장 적합한 언어를 사용하는 것입니다. 겉으로 보기에 다중 언어 프로그래밍과 접근 방식이 유사해 보이지만, 이와 달리 언어 지향 프로그래밍은 개발자가 고유한 DSL을 빌드하거나 해당 접근 방식의 일부로 도메인 특화 개념을 사용하여 기존 언어를 확장하도록 뚜렷하게 권장합니다. MPS와 같은 언어 도구는 언어 지향 접근 방식에서 이를 실현하는 데 중요한 요소입니다.

MPS를 사용하면 새로운 언어용으로 사용자 지정 에디터를 정의하여 DSL을 더 간편하게 이용할 수 있습니다. 도메인 특화 언어는 분야별 전문 용어로 설계되어 전통적인 프로그래밍에 익숙하지 않은 분야별 전문가도 MPS에서 쉽게 작업할 수 있습니다.

다음 동영상에서는 MPS로 대화식 음성 응답(IVR)을 제작하는 방법의 예시를 볼 수 있습니다. DSL은 비기술 전문가를 대상으로 하므로 사용자 환경이 그에 맞게 조정됩니다.