这是一系列问题的一部分,这些问题集中于一个称为抽象项目的项目,该项目旨在以框架的形式抽象语言设计中使用的概念。
使用语言开发框架应该有多容易?
我编写了大规模的代码生成框架,其中还包括将结果发送到特定语言的编译器的功能。易用性主题来自这样一个框架示例:CodeDOM或代码文档对象模型。
它是由Microsoft编写的框架,描述了常见的代码结构,但通常忽略了很多(表达强制),并且在表示某些结构时趋于抽象,完全根据您的工作发出错误的代码:当使用的类型是通用接口时,CodeDOM不能很好地处理PrivateImplementationType
on 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));
与CodeDOM:
//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));
该框架的重点是语言爱好者以及对生成代码或应用程序感兴趣的人。考虑到它专注于编译,代码生成和语言开发,该框架应该关注易用性或原始能力吗?
我的主要目标是提高此类工具的可用性,因此对本领域感兴趣的人员在开始从事自己的以语言为中心的项目之前,不需要在语言理论领域有很多经验。
鉴于我是框架的作者,因此我对“可用性”的看法有偏见。因此,我必须再问一个问题,重点和目标是否对与项目无关的其他人有意义。