DSL(Domain Specific Language) 이해하기
Language/Groovy 2016. 9. 9. 15:34DSL(Domain Specific Language) 이해하기
1. DSL이란
특정 도메인(산업, 분야등 특정 영역)에 특화된 언어를 말한다.
"문제 영역의 해결에는 그 영역의 언어를 전제로 둬야하며, 거기에서 프로그래밍 솔루션을 꺼내는 것이 중요하다." 라고 Dave Thomas가 한 말을 생각하면 이해하기 쉽다.
특정 영역의 문제 해결에는 그 영역에 맞는 특화된 도구를 사용하자라는 것이다. 어찌보면 과도로 끝내도 될 일을 맥가이버칼을 들이대는 격이다. 그리고 표현 방식은 해당 도메인의 전문가가 이해할 수 있는 형태(고급 언어)여야 한다.
실제로 Ruby처럼 그 코드가 일반 자연어를 읽는 것과 같이 쉽게 이해되기 때문에 도메인 전문가와 프로그래머가 아이디어를 공유하기 좋고 거기에 Lisp 계열이어서 DSL에 많이 활용된다.
그리고 DSL은 개발 생산성과 도메인 전문가와 커뮤니케이션을 원할하게 하기 위해서 도입되는 경향이 많지만, No Silver Bullet.
참고로 UNIX에서도 특정한 응용 영역의 문제를 해결하기 위해 그 영역에만 적용할 수 있는 특수한 언어를 만들어 문제를 해결하는 오랜 전통이 존재한다. 이런 언어를 "작은 언어(little language)", 또는 "미니 언어(mini language)"라고 부르는데 DSL도 이와 유사하다고 볼 수 있다.
2. 내부 DSL과 외부 DSL
2.1 내부 DSL
- 호스트 언어 구문을 이용하여 자체적으로 의존하는 무언가를 만드는 경우에 해당된다.
- 내부 DSL에서는 API와 DSL의 경계가 모호해 비슷하게 생각하는 경향이 있다.
. 좀 더 일반 사용자가 알아보기 쉬운 API가 내부 DSL로 생각해도 될 듯 하다.
- 호스트 언어 능력과 지금까지 사용하던 도구를 그대로 사용할 수 있다는 점, 처리 결과를 쉽게 예측할 수 있어서 해당 언어를 잘 알면 친근할 수 있다.
- 형태
. 메타 프로그래밍의 형태로 언어에 미니 언어를 만들 수 있다.
. 원래 언어로 새로운 구문으로 도입 된다. 그래서 언어 확장을 일으켜 다른 언어가 된다.
. 인라인 코드 형태로 표현될 수도 있다.
- 적합한 언어 : Lisp, Ruby, Smalltalk
2.2 외부 DSL
- 호스트 언어와 다른 언어 (XML, Makefile과 같은 고유 형식)에서 생성된 DSL.
- GUI 도구를 제공해 주는 것이 특징.
- 외부 DSL에서는 DSL과 범용 언어(GPL : General Purpose Language)과의 경계가 모호해지는 경향이 있다.
. 그 차이는 언어 작성자와 언어 사용자의 목적에 있다. 특정 영역에서 언어의 작성자가 아닌 사용자의 목적에 부합하는, 이해를 할 수 있으면 외부 DSL이다.
- 외부 DSL 개발자가 자유롭게 DSL의 형식을 결정할 수 있다.
- 형태
. 실행 파일에서 DSL 을 동적 로딩할 수 있다.
. DSL 컴파일러를 만들어서 표현할 수 있다.
. DSL을 범용 언어로 코드로 변환한다.
- 적합한 언어 : Java, C#, C++
3. DSL의 장점과 단점
3.1 장점
- 반복이 제거되고 비슷한 처리 코드는 자동 생성(템플릿) 된다.
- 프로그래밍 코드의 양이 적고 가독성이 높다.
- 특정 프로그래머(lay programer - martin fowler)들과 커뮤니케이션이 쉽다.
. XML, CSS, SQL 등
3.2 단점
- 설계가 어렵다.
- 잘 설계가 되지 않는다면 읽기 어려운 코드가 될 수 있다.
- 하위 호환성을 유지해야 한다.
4. 우리 주변에 있는 DSL
- java
. ANT, Maven, struts-config.xml, Seasar2 S2DAO, HQL(Hibernate Query Language), JMock
- Ruby
. Rails Validations, Rails ActiveRecord, Rake, RSpec, Capistrano, Cucumber
- 기타
. SQL, CSS, Regular Expression(정규식), Make, graphviz
[참조 사이트]
특정 도메인(산업, 분야등 특정 영역)에 특화된 언어를 말한다.
"문제 영역의 해결에는 그 영역의 언어를 전제로 둬야하며, 거기에서 프로그래밍 솔루션을 꺼내는 것이 중요하다." 라고 Dave Thomas가 한 말을 생각하면 이해하기 쉽다.
특정 영역의 문제 해결에는 그 영역에 맞는 특화된 도구를 사용하자라는 것이다. 어찌보면 과도로 끝내도 될 일을 맥가이버칼을 들이대는 격이다. 그리고 표현 방식은 해당 도메인의 전문가가 이해할 수 있는 형태(고급 언어)여야 한다.
실제로 Ruby처럼 그 코드가 일반 자연어를 읽는 것과 같이 쉽게 이해되기 때문에 도메인 전문가와 프로그래머가 아이디어를 공유하기 좋고 거기에 Lisp 계열이어서 DSL에 많이 활용된다.
그리고 DSL은 개발 생산성과 도메인 전문가와 커뮤니케이션을 원할하게 하기 위해서 도입되는 경향이 많지만, No Silver Bullet.
참고로 UNIX에서도 특정한 응용 영역의 문제를 해결하기 위해 그 영역에만 적용할 수 있는 특수한 언어를 만들어 문제를 해결하는 오랜 전통이 존재한다. 이런 언어를 "작은 언어(little language)", 또는 "미니 언어(mini language)"라고 부르는데 DSL도 이와 유사하다고 볼 수 있다.
2. 내부 DSL과 외부 DSL
2.1 내부 DSL
- 호스트 언어 구문을 이용하여 자체적으로 의존하는 무언가를 만드는 경우에 해당된다.
- 내부 DSL에서는 API와 DSL의 경계가 모호해 비슷하게 생각하는 경향이 있다.
. 좀 더 일반 사용자가 알아보기 쉬운 API가 내부 DSL로 생각해도 될 듯 하다.
- 호스트 언어 능력과 지금까지 사용하던 도구를 그대로 사용할 수 있다는 점, 처리 결과를 쉽게 예측할 수 있어서 해당 언어를 잘 알면 친근할 수 있다.
- 형태
. 메타 프로그래밍의 형태로 언어에 미니 언어를 만들 수 있다.
. 원래 언어로 새로운 구문으로 도입 된다. 그래서 언어 확장을 일으켜 다른 언어가 된다.
. 인라인 코드 형태로 표현될 수도 있다.
- 적합한 언어 : Lisp, Ruby, Smalltalk
2.2 외부 DSL
- 호스트 언어와 다른 언어 (XML, Makefile과 같은 고유 형식)에서 생성된 DSL.
- GUI 도구를 제공해 주는 것이 특징.
- 외부 DSL에서는 DSL과 범용 언어(GPL : General Purpose Language)과의 경계가 모호해지는 경향이 있다.
. 그 차이는 언어 작성자와 언어 사용자의 목적에 있다. 특정 영역에서 언어의 작성자가 아닌 사용자의 목적에 부합하는, 이해를 할 수 있으면 외부 DSL이다.
- 외부 DSL 개발자가 자유롭게 DSL의 형식을 결정할 수 있다.
- 형태
. 실행 파일에서 DSL 을 동적 로딩할 수 있다.
. DSL 컴파일러를 만들어서 표현할 수 있다.
. DSL을 범용 언어로 코드로 변환한다.
- 적합한 언어 : Java, C#, C++
3. DSL의 장점과 단점
3.1 장점
- 반복이 제거되고 비슷한 처리 코드는 자동 생성(템플릿) 된다.
- 프로그래밍 코드의 양이 적고 가독성이 높다.
- 특정 프로그래머(lay programer - martin fowler)들과 커뮤니케이션이 쉽다.
. XML, CSS, SQL 등
3.2 단점
- 설계가 어렵다.
- 잘 설계가 되지 않는다면 읽기 어려운 코드가 될 수 있다.
- 하위 호환성을 유지해야 한다.
4. 우리 주변에 있는 DSL
- java
. ANT, Maven, struts-config.xml, Seasar2 S2DAO, HQL(Hibernate Query Language), JMock
- Ruby
. Rails Validations, Rails ActiveRecord, Rake, RSpec, Capistrano, Cucumber
- 기타
. SQL, CSS, Regular Expression(정규식), Make, graphviz
[참조 사이트]
출처 - http://www.mimul.com/pebble/default/2013/06/21/1371806174467.html
'Language > Groovy' 카테고리의 다른 글
Domain-Specific Language (0) | 2016.09.09 |
---|---|
Metaprogramming (0) | 2016.09.09 |
그루비의 동적 객체지향 - 1 (0) | 2016.09.09 |
그루비의 동적 객체지향 - 2 (0) | 2016.09.08 |
What does .delegate mean in groovy? (0) | 2016.09.08 |