이것은 언어 설계에 사용되는 개념을 프레임 워크 형태로 추상화하는 것을 목표로하는 추상화 프로젝트라는 프로젝트에 중점을 둔 일련의 질문 중 일부입니다.
구조적 타이핑과 관련된 다른 페이지는 여기에서 볼 수 있습니다 . 프레임 워크에 대한 문의 및 적절한 게시 장소와 관련된 메타 주제는 여기 에서 찾을 수 있습니다 .
언어 개발 프레임 워크를 사용하는 것이 얼마나 쉬워야합니까?
대규모 코드 생성 프레임 워크를 작성했으며 결과를 언어 별 컴파일러로 보내는 기능도 포함했습니다. 사용 편의성이라는 주제는 이러한 프레임 워크 예 중 하나 인 CodeDOM 또는 코드 문서 객체 모델에서 비롯됩니다.
일반적인 코드 구조를 설명하는 Microsoft에서 작성한 프레임 워크이지만 일반적으로 많은 부분 (표현식 강제)을 제외하고 특정 구문을 표현할 때 약간 추상적이면서 사용자가 수행 한 작업에 따라 잘못된 코드를 완전히 방출하는 경향이있었습니다. 사용 된 유형이 일반 인터페이스 인 경우 CodeDOM에서 방출 기능 PrivateImplementationType
을 제대로 처리하지 못했습니다 CodeMemberMethod
. CodeDOM은 첫 번째 코드 생성기를 작성한 최초의 이유였습니다.
내가하려고하는 한 가지, 프레임 워크를 단순화하기 위해 수행해야 할 작업의 양을 줄이고 작업에 해당 작업을 구성하는 특정 유형에 중점을 두는 것입니다.
다음은 내가 작성하는 프레임 워크의 작동 방식을 나란히 비교 한 것입니다.
//Truncated...
/* *
* From a project that generates a lexer, this is the
* state->state transition character range selection logic.
* */
var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference()));
//...
char start = rangeElement.B.Value.Start;
char end = rangeElement.B.Value.End;
/* *
* 'start' <= nextChar && nextChar <= 'end'
* */
currentExpression = start.LessThanOrEqualTo(nextChar).LogicalAnd(nextChar.LessThanOrEqualTo(end));
코드 대
//Truncated...
var nextChar = new CodeVariableReferenceExpression("nextChar");
//...
var start = new CodePrimitiveExpression(rangeElement.B.Value.Start);
var end = new CodePrimitiveExpression(rangeElement.B.Value.End);
currentExpression = new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(start, CodeBinaryOperatorType.LessThanOrEqual, nextChar), CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(nextChar, CodeBinaryOperatorType.LessThanOrEqual, end));
이 프레임 워크의 초점은 언어 애호가 및 코드 또는 응용 프로그램 생성에 관심이있는 사람들입니다. 컴파일, 코드 생성 및 언어 개발에 중점을 둔 프레임 워크는 사용 편의성 또는 강력한 기능에 중점을 두어야합니까?
저의 주요 목표는 이러한 도구의 가용성을 높이는 것이므로 도메인에 관심이있는 사람들은 자신의 언어 중심 프로젝트를 시작하기 전에 언어 이론 도메인에 대한 많은 경험이 필요하지 않습니다.
내가 프레임 워크의 저자라는 것을 감안할 때, "사용성"에 대한 나의 견해는 편향되어 있습니다. 따라서 프로젝트에 관련되지 않은 다른 사람들에게 초점과 목표가 합당한 지 다른 사람에게 물어봐야합니다.