2009-03-19 3 views
6

현재 제가 작업하고있는 프로젝트에는 (외부 영향으로 인해) 완전히 고정 된 모델이 없으므로 필자는이를 작성하는 데 약간의 유연성을 원합니다. 현재 그들은 응용 프로그램의 세 가지 레이어 (db, web api 및 client)에 걸쳐 복제되며 각각에는 유사한 논리가 있습니다 (즉 유효성 검사).DSL을 사용하여 C# 코드 생성

모델 파일을 작성하고 (루비에서 말하면) 모델을 필요한 C# 파일로 변환 할 수있는 방법이 있는지 궁금합니다. 현재 나는 어떤 단계에서 바뀔지도 모르는 보편적 인 코드를 많이 작성하고있는 것 같지만, 이렇게 생성 된 접근법은 훨씬 중요한 것들에 집중할 수있게 해줄 것입니다.

누구나 이런 식으로 권장 할만한 사람이 있습니까?이 작업을 수행 할 수있는 DSL/언어는 누구에게 어떤 경험이 있습니까?

답변

5

ANTLR으로 쉽게 수행 할 수 있습니다. 출력이 유사하다면 단순히 텍스트 템플릿 메커니즘을 사용할 수 있습니다. 그렇지 않으면 트래버스 할 수 있도록 추상 구문 트리를 생성 할 수 있습니다.

5

사용자 지정 코드에 영향을주지 않고 코드를 다시 생성 할 수 있도록 부분 클래스와 부분 메서드를 사용하는 시스템을 보았습니다. "규칙 엔진"은 Visio 상태 다이어그램에서 완전히 생성 된 것입니다. 기본적으로 워크 플로우는 좋지 않지만 수정할 수 있습니다. Viso 다이어그램은 powershell과 T4를 사용하여 클래스를 생성하기 위해 XML로 내보내졌습니다.

위의 예는 외부 DSL입니다. I.E. 응용 프로그램이 실행되는 프로그래밍 언어 외부에서 실행될 수 있습니다. 반면에 프로그래밍 언어로 구현되고 사용되는 내부 DSL을 만들 수 있습니다.

코드 매거진의이 코드는 article on DSLSs입니다.

위의 링크에서 Neal Ford는 유창한 인터페이스를 사용하여 C#으로 내부 DSL을 만드는 방법을 보여줍니다.

그가 아직 언급하지 않은 한 가지 점은 IntelliSense로 보이지 않도록이 속성 [EditorBrowsable (EditorBrowsableState.Never)]을 메서드에 넣을 수 있다는 것입니다. 이는 유창한 API를 훨씬 더 쉽게 발견 할 수 있도록 DSL 사용자로부터 클래스에 대해 비 DSL (원한다면) 메소드를 숨길 수 있음을 의미합니다.

당신은 유창 인터페이스는 그것의 능력에 매우 강력하다 당신은 또한 Oslo (CTP at the moment) 수있는 옵션이 외부 DSL을의 주제 TDD

와 함께 IoC 컨테이너 작성에 Daniel Cazzulino하여이 비디오 시리즈에서 라이브 기록되는 볼 수 있습니다 생각할 수있는 코드 생성을 사용하기보다는 직접 실행될 수있는 외부 DSL을 만들 수있게 해줌으로써 실제로 DSL을 많이 사용하지는 않습니다.

+1

많은 본격적인 컴파일러가 실제로 코드 생성기입니다. 원래의 C++ 컴파일러 인 cfront는 C 코드를 생성하고 Eiffel과 Haskell은 바이너리로 컴파일하기 전에 C로 컴파일합니다. –

+0

모든 컴파일러는 코드 생성기이며 인간 친화적 인 코드를 생성하지 않을 수 있습니다. 기계어 명령어조차도 일반적으로 프로세서 내에 내장 된 마이크로 코드로 해석되는 상위 레벨 명령어입니다. –

1

나는 당신이 올바른 길에 있다고 생각합니다.

내가 보통 이런 상황에서하는 일은 내 필요를 포착하고 LL1 (재귀 하강) 파서를 작성하는 간단한 언어를 디자인하는 것입니다.

언어에 중괄호가 아닌 C# 구문이 포함되어 있으면이를 인용하거나 대괄호로 묶어서 출력 코드로 전달하면됩니다.

구문 분석 트리 구조를 생성 할 수 있으며 3 가지 다른 종류의 코드를 생성 할 수도 있고 3 가지 값이있는 모드 변수를 사용하여 코드를 생성 할 수도 있습니다. 3 개의 다른 출력 파일에 코드를 작성하십시오.

하나 이상의 방법이 있습니다. 파서 작성을 두려워하는 경우 (일부 프로그래머와 마찬가지로), 다른 곳에서는 도움이 많이 있습니다.