문제

DSL을 만들기 위해 어떤 기술을 권장 하시겠습니까? .NET의 비즈니스 규칙 및 유효성 검사 응용 프로그램 블록? 그리고 왜?

프레임 워크의 아키텍처는 제작에 의해 확립되고 증거 테스트됩니다. 인간 읽을 수있는 규칙을 컴파일 된 규칙 구현으로 변환하기 위해 .NET 프로세서를 작성하고 싶습니다.

내가 알고있는 옵션은 다음과 같습니다.

  • 컴파일러 파이프 라인을 사용하십시오 .net boo
  • F#과 함께 제공되는 파서 빌더를 사용하십시오. FSLEX 및 FSYACC

불행히도 이러한 접근법 중 어느 것도 DSL 구문 (진화)을 고려할 때 DSL을 편집하기위한보다 친근한 IDE를 구축 할 수있는 것은 없습니다.

아이디어 나 힌트가 있습니까?

도움이 되었습니까?

해결책

Microsoft의 차세대 응용 프로그램 개발 플랫폼 인 코드 명 오슬로

사람들이 작업중인 문제 영역에 맞는 방식으로 물건을 쉽게 작성할 수 있도록합니다.

Oslo는 "Quadrant"라는 비주얼 디자인 도구, "M"이라는 모델링 언어 및 규칙을 저장하는 "Oslo"리포지토리 (SQL Server 데이터베이스)로 구성된 것 같습니다.

따라서 내용을 올바르게 읽으면 M에서 모델링 언어를 정의하고 사분면을 사용하여 자체 모델링 언어를 사용하여 유효성 검사 규칙을 정의하고 편집하고 Oslo 저장소를 사용하여 비즈니스 규칙을 생성하고 유효성 검사 응용 프로그램을 생성하는 응용 프로그램을 작성할 수 있습니다. .NET 블록.

다른 팁

비즈니스 규칙을위한 그래픽 언어는 좋은 생각이 아닙니다. 나는 IT 비즈니스 규칙에 수표와 루프가 많아서 시각화되지 않는 많은 경우를 피할 수 있습니다.

비즈니스 규칙을 설명하기위한 텍스트 언어로 훨씬 나아질 수 있습니다.

코드 편집에 대한 경이로운 사용자 경험을 얻으려면 다음과 같이 필요합니다.

  1. 오류 복구가 양호한 파서
  2. 점진적인 재 컴파일을 수행하는 능력

우수한 오류 복구를 통해 신디케이트가 불완전한 구성에서 프로그래머 의도를 효과적으로 결정할 수 있습니다. 그것은 지성을 구현하는 데 중요합니다.

증분 계보를 수행하는 기능은 사용자 편집에 대한 응답으로 효율적인 배경 컴파일을 수행 할 수 있습니다.

좋은 오류 복구를 얻는 가장 쉬운 방법은 파서를 손으로 작성하는 것입니다. 이렇게하면 구문 오류가있을 때 무엇을 해야하는지 알아 내기 위해 미리 룩의 양 또는 algrorithmic 규칙을 사용할 수 있습니다.

파서 생성기를 사용하여 구문 분석기를 만들 때 구문 오류를 처리하는 데 많은 유연성이 느슨해집니다. 이러한 유연성은 좋은 지적 경험과 상자의 차이를 만듭니다. 따라서 재귀 하강을 사용하여 손으로 쓰는 것이 좋습니다.

효율적인 재 컴파일을 구현하려면 다음을 수행 할 수 있어야합니다. 1) 시맨틱 분석을 위상으로 올바르게 분해합니다 (C#과 같은 경우에는 다음과 같은 것입니다. 첫 번째 네임 스페이스 및 유형 기호를 구성한 다음 명령문을 사용하여 해결 한 다음 기본 클래스 등을 해결하십시오). 2) 위상 인식 의존성 그래프를 구성하는 기능 3) 종속성 그래프를 처리하기위한 알고리즘 및 사용자 편집에 대한 응답으로 IT의 부분을 무효화하는 기능

완전한 프로그래밍 언어의 경우, 재 컴파일을 구현하는 것이 실제로 까다로워 질 수 있습니다. 귀하의 경우, 귀하가 비즈니스 규칙을 설명하고 있기 때문에, 귀하에게는 많은 심각한 일 수 있습니다 (또는 편집이 충분히 빠르면 필요하지 않을 수도 있습니다).

그래서 나는 파서부터 시작한 다음 그 위에 지성을 만들 것입니다.

대 통합을 피할 수 있다면, 나는 할 것이다. VS에 통합하려면 많은 배관이 필요하며 인터 로프는 두통을 유발할 수 있습니다. Parser를 연결하는 Windows Forms 편집기 컨트롤을 판매하는 회사가 몇 개 있습니다. VS보다 통합하기가 훨씬 쉽습니다.

또 다른 흥미로운 대안은 f# 인용문을 사용하는 것입니다.

인용문을 사용하면 프로그램의 일부를 데이터로 취급 할 수 있으므로 AST를 가져 오거나 분석하여 다른 언어로 번역하거나 비표준으로 실행할 수 있습니다. F#의 유연성과 함께 많은 것을 표현할 수 있어야하므로 규칙을 설명하기 위해 내부 F# DSL/Combinator 라이브러리를 개발해야합니다.

버스 사인 규칙이 어떻게 보일지 확실하지 않지만 다음과 같은 글을 쓸 수 있습니다.

let rule = <@
  if (exists customer having validEmail) then success
  else require whatever 
@>

이 주제에 대한 소개를 내 블로그에 썼습니다. 불행히도, F# CTP에는 큰 변화가 있었으며 아직 소스 코드를 업데이트하지 않았지만이 접근법의 가능성과 한계가 무엇인지에 대한 좋은 아이디어를 제공해야합니다.

DSL의 좋은 예는 F# 단위 테스트 framewrok입니다.

편집하다왜 이것이 좋은 접근법이라고 생각하는지 명확히하기 위해 :

  • DSL을 편집하기 위해 Visual Studio를 사용하고 (무료로 F#을 설치 한 쉘 버전을 사용할 수 있음) 무료로 편집 경험이 있습니다. 구문 강조 표시뿐만 아니라 가능한 구조물과 DSL의 '문법'체커 역할을하는 배경 유형 확인을 제안합니다.
  • 다른 접근법과 비교할 때 이것은 아마도 구현하기가 가장 쉬운 것 중 하나 일 것입니다.
  • 유일한 제한은 F# 구문에 의해 경계가 있다는 것입니다. 그러나 자신의 언어를 디자인하는 것은 정말 어려워서 전혀 나쁘지 않을 수 있습니다. 특히 F#의 유연성을 감안할 때.

/편집하다

도움이 되었기를 바랍니다!

나는 Boo를 사용합니다. 현재 DSL 생성을위한 가장 유연한 도구 중 하나라고 생각합니다. 거기에 아주 좋은 책 주제에 대해. Ayende 's 그리고 로드리고의 블로그도 좋은 영감입니다.

IDE에 대해 확장 할 수 있습니다 SharpDevelop, 보세요 이것.

DSL 이음새를 구축하기위한 표준 도구 antlr - 컴파일러 출력을위한 대상 언어가 많은 강력한 Lexer / Parser 생성기입니다. C#, Java, C/C ++, Python 등의 백엔드가 있습니다 (참조 코드 생성 대상 목록) 및 대상 언어의 컴파일러에 사용자 정의 코드를 쉽게 주입 할 수 있습니다.

매우 강력한 IDE (Antlrworks)와 많은 문서가 있습니다. (체크 아웃 방어 antlr 참조 Terrence Parr, Antlr의 저자)에서 다른 사람을 사용하는 사람에 대한 참고 문헌. 증언 페이지.

여전히 IDE를 위해 대부분의 배관을해야하지만 Antlr에서 얻을 수있는 강력한 컴파일러 프레임 워크를 감안할 때 훨씬 쉬워야합니다. 이것은 여기에 게시 된 대부분의 솔루션의 경우입니다 ...

현재 ANTLR로 작성된 컴파일러를 사용하여 자체 DSL을 C/C ++ 출력으로 전제로 처리하고 있으며 매우 만족합니다. 충분히 광고, 당신은 스스로 시도해야합니다 :) 재미있게 보내십시오!

제트 브레인 메타 프로그래밍 시스템

새로운 언어에 대한 사용자 정의 언어 편집기 및 기타 제약 조건을 정의 할 수 있으므로 해당 DSL과 함께 작업하는 것이 정말 간단 해집니다. 기존 프로그래밍에 익숙하지 않은 도메인 전문가는 도메인 별 용어를 사용하여 도메인 별 언어로 MP로 쉽게 작동 할 수 있습니다.

나는 그것에 익숙하지만 오메타 DSL을 개발하기위한 이상적인 도구 인 것 같습니다. 그 주위에 IDE가없는 것 같지만 좋은 소식은 Ometa에 쓸 수있는 "규칙"이 매우 읽을 수 있다는 것입니다. (그리고 그것은 좌익을 다루고 있습니다. 이것은 매우 시원합니다.)

현재 적어도 JavaScript (나에게 매우 흥미 진진한)와 Python에는 현재 Ometa 구현이 있습니다. C#, 제프 모저 당신이 읽을 수있는 일을하고 있습니다. 그의 블로그 그리고 코드 플렉스 . 행운을 빕니다.

boo + ometa = boo.ometa.parser

현재 파서는 개발 중이지만 이미 복잡한 외부 DSL을 생성하는 데 사용할 수 있습니다. Ometa는 프로그래머가 어휘 분석기 및 파서를 쉽게 구현할 수있는 강력한 도구입니다. Boo의 확장 가능한 컴파일러 파이프 라인 아키텍처를 사용하면 표준 boo.parser를 boo.ometa.parser로 교체 할 수 있습니다. 거의 모든 종류의 구문으로 Boo 구문을 확장하는 데 사용할 수 있습니다. 예를 찾을 수 있습니다 여기.

내 프로젝트 메타# 이 문제를 해결하려고합니다.

DSL을 편집하는 친근한 IDE를 만들고 싶다면 IDE를 완전히 그래픽으로 만들고 .NET 객체로 컴파일하거나 IronpyThon과 같은 것을 접착제 언어로 사용하십시오).

규칙이 충분히 간단한 경우 전체 규칙 구조를 그래픽으로 구현할 수 있습니다. 규칙이 충분히 복잡하면 "인간의 가독성"은 불가능한 목표가됩니다.

어느 쪽이든, 중개 코드를 생성하는 .NET 클래스 또는 IronpyThon 객체가 "인간 읽기 가능"충분하지 않은 경우, 가능성이 있다면 문법보다 더 내장을 원합니다.

즉, 프로그래머가 비즈니스 규칙을 만들기 위해 사용할 수있는 간단한 언어를 만들고 싶다면 위의 내용을 자유롭게 사용하고 구문을 Visual Studio의 IDE가 필요하지 않을 정도로 최소한으로 만드십시오.

루비는 DSL을 만드는 훌륭한 언어입니다. 예를 들어 갈퀴 Ruby와 함께 작성된 빌드 스크립트 DSL입니다.

다가오는 아이언 루비 C# 코드를 직접 호출하는 스크립트를 작성할 수 있습니다.

여기에 있습니다 약간 조항 루비에서 DSL을 작성합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top