DSL 구축 : 범용 언어 또는 독립형 언어로 스크립트를 작성 했습니까?


10

주어진 모호한 프로그래밍 모델을 단순화하기 위해 도메인 특정 언어를 디자인하는 것에 대해 토론하고 있습니다. 토론의 일부는 기존 언어 / 런타임 (예 : Java) 위에 빌드 (스크립트로)하거나 독립형 (자체 컴파일러 & c)으로 만드는 것입니다.

DSL 설계 경험이있는 사용자라면 적절한 접근 방식에 대한 찬반 양론 또는 확실한 답변이 있습니까?


이 DSL의 소비자는 누구입니까? 그리고 잠재적 인 호스트는 무엇입니까 (자바를 언급했지만 다른 가능성을 고려하고 있습니까)?
Mauricio Scheffer 5

나는 호스트에 대한 가능성을 고려합니다. 소비자는 비동기 프로그램 (대상이있는 메시지)을 작성하는 사람입니다.
Jé Queue

답변:


9

기존 언어 (내부 DSL) 위에 DSL을 만드는 것이 좋습니다. DSL 소비자가 시스템의 구성 파일로 사용되는 python 파일을 작성하는 시스템을 만들면서 Python 으로이 작업을 몇 번 수행했습니다. 구성 파일은 내가 정의한 구문 (클래스, 함수)을 사용합니다. 이러한 구성은 DSL을 형성합니다.

호스트 시스템이 .NET 또는 Java 인 경우 Python (IronPython 또는 Jython) 또는 Ruby (IronRuby, JRuby)와 같은 언어 인 IMO는 Java 또는 C #보다 DSL을 기반으로하는 것이 좋습니다.

필자의 경우 호스트 시스템도 (C) Python이므로 DSL에 Python을 선택하는 것이 당연한 일입니다.

일부 전문가 :

  • 건물 비용이 저렴합니다. 구현해야 할 것이 훨씬 적습니다. 파서 / 컴파일러 / 인터프리터를 구현하는 데 시간을 소비하는 대신 문제에 집중할 수 있습니다.
  • 호스트 언어에 대한 액세스 : 귀하의 언어는 기존 언어 / 플랫폼의 모든 기능에 액세스 할 수 있습니다.

나는 언어에 구애받지 않지만 파이썬 화신이 더 적합하다고 생각하는 이유는 무엇입니까?
Jé Queue

1
무엇보다 더 적합합니까? Ruby와 Python에는 동일한 이점이 많이 있다고 생각합니다. Ruby는보다 유연한 구문으로 인해 내부 DSL에 더 적합 할 수 있습니다. Java 및 C #의 경우, 해당 언어로 유창한 인터페이스가 많이 나타났습니다 (개체 이니셜 라이저 구문과 같이 내부 DSL 작성 / 사용을보다 쉽게하는 최신 버전의 구문이 있음). "예식"언어보다 약간 더 적합합니다.
codeape

1
"무료"컴파일 타임 정적 유형 검사를 활용하기 위해 내부 DSL을 정확하게 구현하기 위해 C #을 선택했습니다. 동적 언어 DSL은 외부 DSL에 비해 많은 이점을 제공하지 않습니다.
Den

@Den은 파이썬에서 iDSL을 시도했을 때 정확히 실망했습니다. Java에서 iDSL은 IDE에서 즉각적인 지원을받는 것처럼 느껴집니다. 파이썬에서 그렇게 할 IDE를 찾지 못했습니다.
candied_orange

2

에서 봐 Xtext (http://www.eclipse.org/Xtext/)과 을 Xbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html). 사용자가 프로그래머가 아닌 경우 기존 프로그래밍 언어를 기반으로 DSL을 사용해야한다고 생각하지 않습니다. 그들에게는 너무 복잡 할 것입니다. "깨끗한"DSL은 올바르게 만들면 매우 효율적일 수 있습니다.


2

특정 접근 방식을 추천하는 대신 결정을 내리는 데 훌륭한 리소스로 Martin Fowler의 도메인 별 언어 를 추천 해 드리겠습니다 . 내부 및 외부 DSL의 상대적인 장점에 대한 광범위하고, 생각을 자극하는 시험이 있습니다.


1

세 번째 옵션이 있습니다-범용 언어 위에 컴파일러로 DSL을 빌드하십시오. C ++과 같은 하위 수준의 언어를 포함하여 합리적인 수준의 메타 프로그래밍 기능을 갖춘 모든 언어가 작동합니다. 이런 종류의 것들에 대해서는 Lisp 및 유사한 언어를 선호하지만 Template Haskell 또는 Nemerle은 동일한 수준의 유연성을 제공 할 수 있습니다.


1

Martin Folwer는 자신의 저서 "도메인 특정 언어"에서 내부외부 DSL에 대해 설명 합니다.
Internal DSL=는 기존 프로그래밍 언어의 하위 세트입니다 (예 : Ruby / Java 등).
External DSL= 구문과 어휘를 정의합니다.
외부 DSL은 훨씬 표현력이 높지만 외부 파싱 및 코드 생성이 필요할 수 있습니다.
내부 DSL에는 추가 처리가 필요하지 않지만 비 프로그래밍 도메인 전문가 (예 : 비즈니스 분석가, 테스터)에게는 이해하기 어려운 경우가 있습니다.

DSL 유형을 선택할 때 사용자가 누구인지 분석하는 것이 중요합니다. 이들이 대부분 기술이 아닌 사람들이라면 외부 DSL이 더 나은 선택이 될 수 있습니다. 숙련 된 프로그래머로 구성된 소규모 팀의 경우, 사용하는 프로그래밍 언어가 충분히 표현적인 경우 내부 DSL을 선택할 수 있습니다.

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