모듈식 도메인 특화 언어 개발을 위한 MontiCore

모듈식 도메인 특화 언어 개발을 위한 MontiCore

초록

MontiCore는 DSL을 모듈화하여 재사용성을 높이는 프레임워크이다. 확장 가능한 문법 형식과 언어 상속·임베딩 개념을 도입해 파서와 편집기, 트리 기반 알고리즘(컨텍스트 검사, 포맷터, 코드 생성기)까지 일관된 지원을 제공한다. 이를 통해 기존 DSL을 확장하거나 조합해 새로운 프로젝트 전용 DSL을 빠르게 설계·구현할 수 있다.

상세 분석

본 논문은 객체 지향에서 사용되는 캡슐화, 인터페이스, 상속과 같은 모듈성 원리를 DSL 설계에 적용한다는 점에서 의미가 크다. MontiCore는 기존 문법 정의를 그대로 재사용하면서도 새로운 구문을 추가하거나 기존 구문을 변형할 수 있는 ‘언어 상속(language inheritance)’ 메커니즘을 제공한다. 언어 상속은 기본 DSL의 규칙을 그대로 물려받고, 서브 DSL에서는 추가 규칙만 정의하면 되므로 중복 정의를 방지하고 유지보수 비용을 크게 낮춘다.

또한 ‘언어 임베딩(language embedding)’을 통해 서로 독립적인 DSL을 하나의 통합 언어 안에 삽입할 수 있다. 임베딩은 파서 단계에서 삽입된 DSL의 토큰 스트림을 별도의 파서가 처리하도록 연결해 주며, 이 과정에서 문법 충돌을 자동으로 해결한다. 이러한 기능은 파서 생성기와 에디터가 공유하는 메타 모델에 기반하므로, 임베딩된 DSL의 구문 강조, 자동 완성, 오류 표시 등 IDE 지원이 자연스럽게 확장된다.

MontiCore는 문법 정의를 확장 가능한 ‘Grammar DSL’ 형태로 제공한다. 이 Grammar DSL은 일반 BNF와 유사하지만, 상속·임베딩 선언을 위한 키워드와, 속성(속성 선언, 타입 지정) 등을 포함한다. 결과적으로 개발자는 기존 문법 파일을 그대로 import하고, 필요한 부분만 오버라이드하거나 새로운 비터미널을 추가함으로써 새로운 DSL을 빠르게 만들 수 있다.

툴 체인 측면에서는 파서, AST(추상 구문 트리) 생성기, 트리 순회 기반 알고리즘이 일관된 인터페이스를 공유한다. 컨텍스트 검사기, 포맷터, 코드 생성기 등은 AST를 기반으로 동작하므로, 언어 상속·임베딩으로 구성된 복합 DSL에서도 동일한 알고리즘을 재사용한다. 이는 DSL 간의 기능적 중복을 최소화하고, 검증·생성 로직을 한 번만 구현해도 여러 DSL에 적용할 수 있게 한다.

실험에서는 프로젝트별 DSL을 정의하고, 기존 DSL을 상속·임베딩하여 새로운 DSL을 구성한 사례를 제시한다. 결과는 개발 시간 단축, 오류 발생률 감소, 그리고 유지보수 시 변경 파급 효과 최소화라는 구체적인 이점을 보여준다. 다만, 복잡한 임베딩 구조에서는 파서 충돌 해결을 위한 추가 설정이 필요하고, 상속 관계가 깊어질 경우 디버깅이 어려워질 수 있다는 한계도 언급한다.

전반적으로 MontiCore는 DSL 개발에 있어 모듈성, 재사용성, 툴 연계성을 동시에 만족시키는 실용적인 접근법을 제시한다.