도메인 특정 언어는 무엇입니까? 사용하는 사람 있나요? 그리고 어떤 방식으로?


107

나는 어떤 종류의 인트로를 찾고 있고 누군가 그것을 사용했는지 확인하고 있다고 생각합니다. 사용하면 특별한 이점이 있습니까?

Wikipedia :

DSL (도메인 특정 언어) 은 특정 문제 도메인, 특정 문제 표현 기술 및 / 또는 특정 솔루션 기술 전용 프로그래밍 언어 또는 사양 언어입니다.

아무도 당신이 그것을 어떻게 구현했는지 또는 주어진 시나리오에서 어떻게 유용 할 수 있는지에 대한 구체적인 예를 줄 수 있습니까?


실제로 도메인 특정 언어는 프로그래밍에서 잘 정의 된 의미를 가진 용어입니다. 위키피디아 기사 확인
1800 INFORMATION

아래에서 언급했듯이 DSL은 하나의 언어가 아니라 특수 목적 언어의 전체 클래스 이름입니다.
dmckee --- 전 중재자 새끼 고양이

R이 DSL이라고 말할 수 있습니까?
Srikar Doddi

2
가장자리에 있지만 그렇지 않습니다. R은 모든 범용 구조를 가지고 있으며 광범위한 계산에 사용됩니다. 숫자 계산 및 통계는 그다지 nrrow 도메인이 아닙니다. 그래도 정의에 대한 좋은 테스트입니다.
Charlie Martin

답변:


114

도메인 특정 언어는 특정 도메인 또는 일련의 문제를 처리하기 위해 작성된 언어입니다. 소프트웨어 빌드를 설명하기위한 make, ant, rake, 언어 생성을위한 lexx 및 yacc와 같은 많은 것들이 있습니다. 최근 몇 년 동안 더 쉽게 만들 수 있도록 결합되어 인기를 얻었습니다. 그중 가장 큰 것은 새로운 DSL을 쉽게 구축 할 수있는 몇 가지 기능이있는 Ruby의 인기 증가입니다.

Martin Fowler는 여기 에서와 같이이 아이디어의 큰 지지자입니다 .


3
새로운 DSL을 더 쉽게 만들 수있는 Ruby에는 어떤 기능이 있습니까?
Lernkurve

2
@Lernkurve-Ruby에는 메타 프로그래밍이있어 도움이되었습니다. rubylearning.com/blog/2010/11/23/…
James Black

@CharlieMartin "그루비"에 대해 알려 주시겠습니까? 정확히 어떤 유형의 언어입니까? 알고 싶습니다. 여기 도와주세요.
G dangi

2
Groovy는 JVM에서 실행되는 스크립팅 언어입니다. 기본적으로 Ruby에 대한 Java 답변입니다. 범용 언어이지만 DSL을 작성하는 데 사용할 수 있습니다. docs.groovy-lang.org/docs/latest/html/documentation/...
찰리 마틴에게

1
Gradle의 그루비를 추가하고 싶습니다. 착각하지 않으면 빌드를 설명하는 자체 언어가 있습니다.
네온 Warge

67

DSL은보다 일반적인 프로그래밍 언어로 작성된 함수에 대한 지나치게 복잡한 인수로 생각할 수 있습니다. 실제 프로그래밍 언어가 DSL 코드를 분석하고 그것으로 무언가를, 일반적으로 DSL 코드에만 초점을 맞추고 어떤 아웃 당신이 원하는, 그리고 더 큰 시스템의 수치 방법 .

DSL의 예로는 모든 쿼리 언어 (SQL, XPath, ...), 모든 템플릿 언어 (Django, Smarty, ...), 특히 twill과 같은 것을 포함한 쉘 스크립트, 명령 기반 웹 브라우저 (주로 자동화 된 테스트에 사용됨)가 있습니다. ), 데이터 저장 및 교환 언어 (XML, YAML, ...), LaTex, HTML 또는 CSS와 같은 문서 언어.

TCL 및 Lisp와 같은 매우 유연한 구문을 가진 일부 언어는 가능한 경우 DSL을 해당 언어로 직접 빌드합니다. 대부분의 언어는 일반적으로 외부 파일에서로드되는 문자열을 사용합니다.

그것들을 사용하면 특별한 이점이 있습니까? 그것들을 의도 된 목적으로 사용하는 것은 당신이 그들을 DSL로 생각하지 않고 SQL이나 HTML을 사용했던 것처럼 (내 생각에) 모르는 사이에 그것들을 사용할 수 있다는 점에서 매우 유리합니다.

나는 당신이 필요로 할 수있는 어떤 종류의 애플리케이션에도 충분한 DSL이 있다고 감히 말할 것이다. 당신은 거의 확실히 당신 자신의 것을 작성하는 방법을 배울 필요가 없습니다.



12

(질문의 핵심을 다룬다)

어딘가 에서 DSL 과 그 정의를 "도메인 특정 언어"로 처음 보았을 때 저는 DSL이 방금 들어 본 적이없는 구체적이고 구체적인 언어라고 생각했습니다. 특정 응용 분야에 맞게 조정됩니다.

아이러니하게도 TCL 을 "도구 명령 언어"로 방금 들었다면 DSL처럼 다양한 도구에 대한 많은 TCL 이있을 것이라고 생각할 수 있습니다. 그러나 특정 스크립팅 언어의 특정 이름은 아닙니다.


10

특정 영역의 문제를 해결하기에 적합한 언어라고 생각합니다. 규칙 처리 언어 또는 서비스 설명 언어 일 수 있습니다.

DSL (도메인 특정 언어)의 반대는 범용 언어 입니다.


10

모든 것이 DSL입니다 ...

어셈블러 : MOV R1 to R2
컴파일러 : 할당 문-A = A + 1, 조건문-IF (TRUE) ..., 분기-RETURN
HTML : ... 중첩 구조 설명
TCP / IP : 설명 대상 / 시작 주소
PDF : 종이에 텍스트 / 이미지 배치
설명 글꼴 : 문자 설명

특정 프로세스를 설명하는 데 사용하는 모든 언어는 DSL입니다. 안타깝게도 가장 기본적인 프로세스도 설명 할 수있는 도메인 별 언어가 부족하므로 모든 작업을 설명하는 데 필요한 몇 가지 언어를 사용합니다. "내 웹 사이트의 모든 html 파일 압축"을 완료하려면 300 줄의 3 개 또는 4 개 언어가 필요합니다.

DSL을 구축하려면 기억할 수 있고 문서가 필요하지 않은 프로세스를 설명하는 데 필요한 최소 문자 수를 결정하십시오. 속도와 사용 편의성이 기본 설계 기준이라는 점을 기억하십시오. 구문 분석이 너무 빠르기 때문에 어떤 구문을 사용하든 괜찮습니다. 대부분의 경우 "매월 1 일에 직원에게 지불"구문으로 자연어를 선호하지만 도메인 특정은 도메인에 따라 다르며 가장 적합한 구문을 결정합니다. 문제에 맞습니다.

편리 할 수 ​​있지만 데이터 (XML)를 정의하는 데 사용 된 HTML과 같은 문제에 맞지 않는 다른 솔루션은 사용하지 않을 것입니다. CSV는 매우 유용하며 대부분의 문제에 적합합니다. JSON은 사용의 용이성 부분에 맞지 않으며, CSV가 대부분의 문제에서 작동하는 불필요한 합병증을 추가하는 것은 과잉입니다. 우리는 DSL에 EXCEL을 많이 사용합니다. 트리 구조 나 메뉴, A 열은 레벨, 다른 열은 아이콘, 색상, 레이블 등과 같은 65K에서 1M 행 미만의 작은 문제를 설명하는 데 적합합니다 (EXCEL은 편집 가능한 CSV).

HTML이 페이지 레이아웃의 문제를 실제로 해결하지 못한다는 것을 알았 기 때문에이를 제거하고 적합한 DSL을 정의했습니다. 페이지에서 HEADER, BODY, FOOTER, LEFT / RIGHT MARGINS 및 LEFT / RIGHT FULL MARGINS의 6 개 영역을 정의했습니다. 그런 다음 페이지 생성기에 TITLE BAR, STATUS BAR, MENUS, TABLE, FORMS, ...를 특정 셀에 추가하도록 지시 할 수 있습니다. 그런 다음 각 셀을 임의의 깊이까지 행과 열로 분할 할 수 있습니다. 페이지 레이아웃은 모든 스타일에 몇 초가 걸립니다.

BODY에는 직원 테이블이
포함되어 있습니다 .HEADER에는 Collins Software에 로그인 할 수있는 제목 표시 줄 캡션 'Hello World'가 포함되어 있습니다.

메뉴 DSL은 페이지 레이아웃 DSL에 맞지 않으므로 메뉴를위한 고유 한 DSL을 만들었습니다.

리소스 내 메인 메뉴
* define : menu, m, Level, Label, Icon, Action;
m, 0, 파일;
m, 1, open, open.gif, Dialog Open File;

각 문제는 고유하며, 컴퓨터는 모든 형식을 사용할 수 있으며, DSL이 설계된 것은 사람입니다. 따라서 사람이 이해할 수있게 만들고 입력 할 수있는 언어를 실제 단어로 만들 수 있습니다. 우리가 설명하는 것은 실제 사람, 장소, 사물이기 때문입니다.


8

DSL은 프로그래머가 아닌 사람이 사용할 언어를 개발하는 좋은 방법입니다. 예를 들어, 회사의 재무 담당자를위한 DSL이있는 경우 사양에 맞게 프로그래밍하는 대신 원하는 프로그램을 작성하도록 할 수 있습니다. 그런 다음 너무 느리면 작성한 내용을 원하는대로 가져와 컴파일 된 언어로 작성하여 속도를 높일 수 있습니다.


5

잘! 위에서 설명한 것들이 많이 있습니다. 나와 같은 사람이 이해할 수 있으므로 훨씬 더 간단하게 설명하려고 노력할 것입니다.

범용 언어가 방대한 목적으로 사용되기 때문에 DSL은 특정 도메인에 대해서만 만들어집니다. HTML 또는 CSS와 같습니다.

어떤 사람이나 당신의 가장 친한 친구 만이 이해할 수 있고 다른 사람은 이해할 수없는 논문에 지침을 썼다고 말할 수 있습니다. 그러면 DSL 일 수 있습니다. 그러나 많은 사람들이 이해할 수 있고 따를 수있는 용어로 지침을 작성했다면 이것은 DSL이 아닙니다.

컴퓨터의 직렬 포트를 통해 작동 할 수있는 사용자 용 스위치 보드를 만든 적이 있는데 사용자는 해당 보드에서 실행할 수있는 해당 보드 용 프로그램을 원하고 그에 따라 릴레이 스위치를 켜고 끕니다. 그래서 몇 가지 지침을 작성하고 사용자에게이 지침에 따라 해당 보드를 프로그래밍하도록 지시했습니다. 이것은 DSL의 예입니다. 나는 새로운 언어를 발명 한 것이 아니라 마이크로 컨트롤러가 EEPROM에서 읽을 수 있고 그에 따라 구문 분석하고 특정 작업을 수행 할 수있는 문자열 묶음을 만들었습니다.


4

DSL 사용을 좋아하는 이유를 설명하는 간단한 블로그 게시물을 작성했습니다.

도메인 특정 언어 (DSL)를 사용했으면합니다.

여기에서 DSL을 다음과 같이 정의합니다.

특정 문제 영역에 대한 솔루션을 전달하도록 특별히 설계된 작은 프로그래밍 언어입니다.

사용 측면에서 Ant, SQL (Structured Query Language) 또는 CSS (Cascading Style Sheets)를 사용한 적이 있다면 DSL을 사용한 것입니다.

저는 DSL을 사용하는 것을 좋아합니다. DSL은 특정 문제 공간에 대한 솔루션 커뮤니케이션을 촉진하는 데 초점을 맞추고 있으며 도메인 전문가를 포함시키는 방식으로 그렇게합니다.


3

DSL (Domain Specific Language)의 간단한 예는 웹 기반 응용 프로그램이라는 특정 도메인에 사용되는 HTML입니다.


3

최근에 DSL을 들었지만 정말 유용한 예를 찾았습니다 : LUNA (이전 lunascript).

Asana 팀이 자체 플랫폼을 위해 만든 맞춤형 프로그래밍 언어 / 프레임 워크입니다.

내가 더 알다시피 많은 회사는 적절한 경쟁 우위를 창출하기 위해 자체 프레임 워크와 언어를 만듭니다. 몇 가지 예는 다음과 같습니다.

  • AbAp를 사용한 SAP
  • PeopleCode와 PeopleSoft
  • Objective-C를 사용하는 Apple
  • Facebook에는 FBML 및 FQL과 같은 것이 있습니다.

이러한 플랫폼에서 작업하는 데 거의 독점적으로 사용하므로 도메인별로 다릅니다.

이 답변이 개념을 명확히하는 데 도움이 되었기를 바랍니다.


3
Objective-C는 도메인 특정 언어가 아닙니다
boraseoksoon

그것은 또한 애플에 의해 만들어지지 않았습니다.
Alexander Rossa

2

Machine Learning에서 사용되는 DSL의 예는 Python의 patsy입니다 : https://patsy.readthedocs.io/en/latest/formulas.html#

R의 공식 DSL을 기반으로합니다 : https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html

https://cran.r-project.org/web/packages/Formula/vignettes/Formula.pdf

Hadley는 DSL w / R을 구축하는 방법을 설명하는 고급 R 책의 멋진 섹션을 가지고 있습니다. http://adv-r.had.co.nz/dsl.html

딥 러닝 분야가 어느 정도 안정화되면 (또는 지금도) Apache MXnet 프로젝트에서 비슷한 일이 발생하는 것을보고 싶습니다. 그러나 아직 제안 페이지 에서 이에 대한 제안을 보지 못했습니다 .


1

도메인 별 언어는 특정 분야의 개념과 논리를 직접 사용하는 언어로 도메인 프로세스와 지식을 표현합니다.

커뮤니티는 확실히 성장하고 있지만 여전히 다른 "주류"기술 수준은 아닙니다.

대부분의 경우 DSL은 회사 내부의 생산성을 향상시키기 위해 만들어 졌으므로 비공개로 유지하고 결과 / 통찰을 공유하지 않습니다.

다음은 발표자가 투영 편집 기술과 함께 JetBrains MPS를 사용하는 DSL의 몇 가지 예를 제공하는 컨퍼런스입니다 . https://vimeo.com/197381453


1

DSL-도메인 특정 언어. 도메인이 무엇인지 시작하겠습니다. 도메인은 정의 된 영역, 범위입니다. 이 도메인은 웹 사이트 모양이 될 수 있으며 CSS가 있고 두 번째 도메인은 웹 사이트 구조가 될 수 있으며 여기에는 HTML이 있습니다.

그러나 도메인은 Company X Application 일 수도 있습니다. 그리고이 도메인의 범위에서 일부 언어를 만들 수 있습니다. 언어는 의미가 없습니다. 자체 문법, 구문, 컴파일러 또는 런타임으로 완전히 맛을 낸 것입니다. DSL은 도메인 문제를 해결하는 도구 목록 일 수 있습니다.

OOP와 그 모델을 클래스와 메서드별로 도메인 객체를 객체 동작으로 표현하는 것을 고려해 보겠습니다. 이러한 구조를 만들고 이러한 개체에 동작을 제공하면 이러한 개념을 사용하여 코드를 작성할 수 있습니다. 이 의사 코드 예제를 고려하십시오.

cookie = async getCookie(cookieId)
user = async getUser(userId)
result async user.buy(cookie)
if (result.isError()) {
  error.showAlert("User has not enough money")
} else {
  confirmation.showSuccess("Cookie was bought")
}

위에서 GPL (범용 언어)은 얼마이며 특정 도메인 용어 및 도구는 얼마입니까? 이것은 두 가지가 혼합되어 있지만 여기에서는 모든 명령이 도메인별로 다릅니다. 즉, 도메인이 일부 애플리케이션 x 인 DSL로 작성되었다고 말할 수 있습니다.

이 예제를 통해 더 많은 추상적 인 도구를 만들 수 있으며 대부분 해당 도구로 제어 흐름을 수행 할 수 있습니다 (이것은 더 많은 FP이지만 내가 의미하는 바를 이해하기를 바랍니다).

waitForMany(getCookie(cookieId), getUser(userId)
  .andThen([cookie, user] -> user.buy(cookie))
  .andThen(showSuccess("Cookie was bought"))
  .whenError(showError("User has not enough money"))

보시다시피 저는 꽤 많이 추상화 할 수 있었고이 추상화를 사용하여 제어 흐름을 수행 할 수있었습니다. 그리고 모든 것은 GPL을 기반으로하며 GPL 범위에서 작동합니다.

진실을 밝히기 위해 우리는 모두 DSL을 작성합니다. 사용할 수있는 모든 도메인 별 추상화는 친절합니다. 그러나 이러한 추상화의 대부분은 완전한 해결책이 아니기 때문에이 단어를 너무 자주 사용하지 않는 것이 좋습니다. 그러나 도메인을 추상화하는 도구, 기능 세트가 있으면 일종의 DSL을 형성합니다.

또한 DSL은 무엇입니까? 예를 들어 일련의 규칙을 제공하는 모든 프레임 워크는 DSL입니다. 누군가가 그가 React 개발자라고 주장하는 것을 본다면, React는 네이티브 웹 플랫폼을 사용하는 대안 인 정확히 DSL이기 때문에 그가 Domain Specific Developer라는 것을 알 수 있습니다. 기존 도메인 특정 도구에서 기능을 구성 할 수 있다면 DSL을 사용하여 작성하는 것입니다. React에 대해 더 자세히 살펴보면,이 DSL : D가 아닌 모든 분들께 죄송합니다. 컴포넌트 세트를 생성하고 구성 요소로 구성 할 수 있습니다. 만세! 이제 DSL 위에 DSL을 만들었습니다.

네 여기서 DSL을 너무 많이 반복했습니다. 죄송합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.