문제

실제적이고 정직한 외부 DSL을 구축하는 데 어떤 도구가 있습니까?아니요, 저는 Ruby, Boo, XML 또는 다른 기존 언어나 구문을 남용하는 것에 대해 말하는 것이 아닙니다. 제 말은 실제 외부 DSL, 즉 제 목적을 위한 나만의 언어를 의미합니다.

나는 몇 가지 언어 워크벤치가 개발되고 있다는 것을 알고 있으며 .NET용 "Irony"와 같은 것에 대해 들어본 적이 있습니다.그리고 물론 ANTLR, Lex/Yaac 등도 있지만 제가 하려는 작업에 비해 너무 복잡할 것 같습니다.

귀하가 사용했거나 들어본 적이 있는 DSL 빌더 도구와 그것이 어떻게 도움이 되는지, 단점은 무엇인지에 대해 이야기해 주십시오.

도움이 되었습니까?

해결책

저는 Boo, Irony.NET 및 Grammatica라는 툴킷으로 DSL을 작성했습니다.당신은 파서 생성기가 너무 복잡하다고 말했지만 너무 성급하게 판단했을 수도 있습니다. 사실 작은 학습 곡선을 지나면 사용하기 매우 간단하고 쉽게 무시할 수 있는 광대한 가능성의 세계를 열 수 있습니다. 노력.나는 대부분의 파서 생성기에 대한 문법을 ​​작성하는 데 필요한 표기법을 배우는 것이 정규식을 배우는 것과 다소 비슷하다는 것을 알았습니다. 이를 받아들이려면 마음을 약간 구부려야 하지만 보상은 상당합니다.

내 의견은 이렇습니다.대상 언어가 멍청한 비주얼 디자이너가 처리할 수 있을 만큼 단순하다면 파서 생성기를 사용하여 해당 언어에 대한 문법을 ​​작성하는 것은 매우 쉬울 것입니다.

대상 DSL이 너무 복잡해서 문법을 작성하는 데 땀을 흘려야 할 경우, 멍청한 시각적 도구는 어쨌든 겨자를 자르지 않으며 결국 문법 작성 방법을 배워야만 할 것입니다.

하지만 내부 DSL과 외부 DSL에 대해서는 장기적으로 동의합니다.저는 Boo에서 내부 DSL을 작성했고 그것이 작동하도록 DSL 구문을 수정해야 했는데, 항상 해킹처럼 느껴졌습니다.Irony.NET 또는 ANTLR을 사용하는 동일한 문법은 더 많은 유연성으로 쉽게 수행할 수 있습니다.

나는 블로그 게시물 몇 가지 옵션에 대해 논의 중입니다.이 게시물은 런타임 표현식 평가를 위한 DSL 작성에 중점을 두고 있지만 도구는 모두 동일합니다.

Irony.NET에 대한 나의 경험은 모두 긍정적이었고 이를 사용하여 구현된 여러 참조 언어가 있으므로 시작하기에 좋은 곳입니다.귀하의 언어가 단순하다면 시작하고 실행하는 것이 전혀 복잡하지 않습니다.CodeProject에는 TinyParser라는 라이브러리도 있습니다. 이 라이브러리는 파서를 순수 소스 코드로 생성하기 때문에 정말 흥미롭습니다. 이는 최종 제품에 제3자 참조가 전혀 없음을 의미합니다.하지만 나는 그것을 직접 사용하지 않았습니다.

다른 팁

독립형 DSL 작성을 고려하고 있다면 컴파일러 구축을 고려하고 있는 것입니다.컴파일러 구축 ~이다 필수적인 프로그래밍 지식을 갖추고 있으며 일반적으로 생각하는 것만큼 어렵지 않습니다.스티브 예게의 오른쪽 프로그래머 음식 컴파일러를 아주 훌륭하게 구축하는 방법을 아는 것의 가치를 요약합니다.

시작하는 방법에는 여러 가지가 있습니다.기사에 언급된 2개의 논문을 확인해 보시기 바랍니다. 컴파일러를 작성하고 싶나요?이 두 논문을 읽어보세요.첫번째, 컴파일러를 만들어보자, 접근성이 매우 좋습니다.구현 언어로 터보 파스칼을 사용하지만 다른 언어로도 쉽게 구현할 수 있습니다. 소스 코드가 매우 명확합니다.파스칼은 간단한 언어입니다.

작동 방식과 관련 용어에 대해 잘 이해하고 나면 다음과 같은 내용을 자세히 살펴보는 것이 좋습니다. ANTLR.ANTLR에는 멋진 IDE가 있습니다. ANTLRWorks, 이는 인터프리터 및 디버거와 함께 제공됩니다.또한 즉석에서 문법을 정말 훌륭하게 시각화해 줍니다.나는 그것이 학습에 있어서 매우 귀중한 것임을 알았습니다.

ANTLR에는 몇 가지 좋은 튜토리얼이 있지만 처음에는 다소 부담스러울 수 있습니다. 이 하나 ANTLR 2.0에 반대하기는 하지만 좋습니다. 따라서 최신 버전(현재 최신 버전은 3.1)과 호환되지 않을 수 있습니다.

마지막으로 DSL에 대한 또 다른 접근 방식이 있습니다.Lisp 접근 방식.Lisp의 구문이 없는 특성(귀하의 코드는 기본적으로 추상 구문 트리임)을 고려하면 괄호에 익숙해지면 무한한 언어를 만들 수 있습니다 :).

해당 접근 방식을 사용한다면 내장 가능한 Lisp를 사용하고 싶을 것입니다.Java에서는 클로저, JVM 및 해당 라이브러리와 완벽하게 상호 운용되는 Lisp 방언입니다.개인적으로 사용해본 적은 없지만 좋아보이네요.Scheme에는 GNU가 있습니다 교활, 이는 LGPL에 따라 라이센스가 부여됨.Common Lisp의 경우 ECL, LGPL에도 적용됩니다.둘 다 상호 운용성을 위해 C 인터페이스를 사용하므로 다른 언어에 삽입할 수 있습니다.ECL은 각 Lisp 함수가 C 함수로 구현된다는 점에서 Lisp 중에서 고유하므로 원하는 경우 C로 Lisp 코드를 작성할 수 있습니다(예를 들어 자신의 확장 메서드 내에서 Lisp 객체에서 작동하는 C 함수를 만들 수 있습니다. 그런 다음 Lisp에서 호출합니다).나는 한동안 내 사이드 ​​프로젝트에 ECL을 사용해왔는데, 마음에 듭니다.관리자는 매우 활동적이고 반응이 좋습니다.

꼭 확인해 보세요 라겔.이는 일반 소스 코드에 상태 머신을 포함시키는 프레임워크입니다.Ragel은 C, C++, Objective-C, D, Java 및 Ruby를 지원합니다.

Ragel은 파일 및 프로토콜 파서를 작성하고 외부 DSL 항목을 단계별로 실행하는 데 적합합니다.주로 상태 전환 등에 대해 모든 종류의 코드를 실행할 수 있기 때문입니다.

Ragel을 사용하는 몇 가지 주목할만한 프로젝트는 다음과 같습니다. 똥개, 훌륭한 루비 웹 서버입니다.그리고 에프리코, Ruby 기반 HTML 파서이며 jQuery에서 영감을 받았습니다.

Ragel의 또 다른 큰 특징은 생성 방법입니다. 그래프 시각화상태 머신을 시각화하는 기반 차트입니다.아래는 에서 가져온 예입니다. 제드 쇼의 레이겔 상태 차트에 관한 기사.

ragel state chart

Xtext 이를 위해 만들어졌습니다.

웹사이트에서:

Xtext는 프로그래밍 언어 및 도메인 특정 언어 개발을위한 프레임 워크입니다.

여기에는 파서, 링커, 컴파일러 또는 통역사에서 완전한 언어 인프라의 모든 측면이 완전한 최고 수준의 Eclipse IDE 통합에 이르기까지 다룹니다.이 모든 측면에 대한 좋은 기본값이 제공되며 동시에 모든 단일 측면은 귀하의 요구에 맞게 조정될 수 있습니다.

저는 Irony를 사용해 왔으며 좋은 결과를 얻었습니다.아이러니의 가장 큰 장점은 DSL을 사용하는 런타임에 쉽게 포함할 수 있다는 것입니다.저는 C#으로 작성된 의미 체계 모델에 입력할 외부 DSL을 만들고 있으므로 아이러니가 대단합니다.그런 다음 의미 체계 모델을 사용하여 StringTemplate으로 코드를 생성합니다.

외부 DSL을 구현할 계획이라면 Spoofax( http://strategoxt.org/Spoofax )는 이를 수행하기에 좋은 Language Workbench입니다.SDF, Stratego 등 여러 첨단 기술을 활용한 파서 기반의 텍스트 언어 워크벤치입니다.DSL 구현 외에도 코드 완성, 개요 보기, Intellisense 등과 같은 매우 풍부한 편집기 서비스를 얻을 수 있습니다.이는 여러 언어를 구축하는 데 사용되었습니다. http://mobl-lang.org/.제공된 지원에 대한 아이디어를 얻으려면 이것을 확인하십시오.

Spoofax 프로젝트에는 즉시 사용 가능한 멋진 샘플 DSL 구현 및 Java 코드 생성기가 함께 제공됩니다.이는 도구를 시작하기 위한 출발점으로 작용할 수 있습니다.

이 언어 워크벤치 사용법에 대한 튜토리얼 세부사항을 따르십시오. http://strategoxt.org/Spoofax/Tour.

도움이 되길 바랍니다!

심각한 외부 DSL의 경우 구문 분석 문제를 피할 수 없습니다.ANTLR은 필요한 것 중 최소한입니다.확인하려는 것은 임의의 DSL 구문을 Java와 같은 대상 언어로 매핑하는 데 사용할 수 있는 프로그램 변환 시스템입니다.

보다 http://en.wikipedia.org/wiki/Program_transformation

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