语言开发框架应该多么容易使用?


11

这是一系列问题的一部分,这些问题集中于一个称为抽象项目的项目,该项目旨在以框架的形式抽象语言设计中使用的概念。

可以在此处查看与它相关的与结构化类型相关的另一个页面。可以在此处找到与有关框架和适当发布位置的查询相关的元主题。

使用语言开发框架应该有多容易?

我编写了大规模的代码生成框架,其中还包括将结果发送到特定语言的编译器的功能。易用性主题来自这样一个框架示例:CodeDOM或代码文档对象模型。

它是由Microsoft编写的框架,描述了常见的代码结构,但通常忽略了很多(表达强制),并且在表示某些结构时趋于抽象,完全根据您的工作发出错误的代码:当使用的类型是通用接口时,CodeDOM不能很好地处理PrivateImplementationTypeon 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));

该框架的重点是语言爱好者以及对生成代码或应用程序感兴趣的人。考虑到它专注于编译,代码生成和语言开发,该框架应该关注易用性或原始能力吗?

我的主要目标是提高此类工具的可用性,因此对本领域感兴趣的人员在开始从事自己​​的以语言为中心的项目之前,不需要在语言理论领域有很多经验。

鉴于我是框架的作者,因此我对“可用性”的看法有偏见。因此,我必须再问一个问题,重点和目标是否对与项目无关的其他人有意义。


1
您应该在codereview.stackexchange.com上问这个问题。
罗伯特·哈维

6
问题是,是否应该以牺牲原始能力为代价来易于使用框架,这个问题看起来根本不适合Code Review.SE,因为“高级软件体系结构和设计” 未在以下位置进行:话题有,并且是话题在这里。代码审查适用于您拥有有效的代码并且需要批注的情况。

代码生成器的输入只是另一种编程语言。对代码生成的渴望意味着您所生成的语言功能不够强大。更好的语言具有内置的代码生成器。
凯文·克莱恩

@kevincline代码生成器的典型用例是使用通用代码生成框架的领域特定语言。这并不是真正的选择,替代方法是编译为您自己的内部中间语言并通过VM对其进行解释,或者将其自己转换为较低级别的结构,但最后您要做的是相同的操作。这就是该框架旨在实现的目标,当您需要进行工作以动态生成代码时,可以使用它而不是自己开发同一件事。
艾伦·克拉克·科普兰(Allen Clark Copeland Jr)

并不是说源语言是不够的,而是语言语法只是文本,直到编写了中介软件以将源文本转换为目标平台为止。在这种情况下,它是公共语言基础结构(CLI)或针对CLI的通用语言代码。该框架旨在处理艰巨的工作,即获取高级表示并将其转换为足够低级别的IL构造。即编译器,仅仅因为您需要编译器并不意味着您的语言功能不够强大。这是必需的。
艾伦·克拉克·科普兰(Allen Clark Copeland Jr)

Answers:


2

建立语言开发框架很困难。您必须确定希望它支持哪些类型的东西,然后必须确定您知道哪些类型的方法以及如何将它们整合为一个连贯的整体。最后,您已经进行了足够的投资,因此它可以与实际语言(例如,典型的计算机语言以及DSL)一起使用,并且实际上可以做一些有用的事情。我的帽子不适合您尝试。

您可以将自己的努力与我15年前开始的DMS Software Reengineering Toolkit进行比较。DMS旨在提供通用的代码解析,分析和转换。给定明确的语言规范,它将解析代码,构建AST,从AST重新生成代码(prettyprint),使用以目标编程语言编写的模式转换代码,构建符号表,计算控件和数据流等。通过添加自定义代码,一种使DMS产生多种效果的方法。(请参阅站点上的工具;它们都是DMS的一种或另一种形式)。

这是几年前有关DMS的技术论文。(我们不断改进)

尽管DMS本身很难构建,但我们发现要花费大量的工程来定义DMS的实际语言,包括IBM COBOL,C#4.0,Java 1.7,C ++ 11(以及许多其他语言)。

我们认为这样做(合理):将构建工具的成本降低1-2个数量级。这意味着,凡是凡人都可以将原本可能需要1-10年的任务视为1个月至1年的项目。什么仍然不容易:

  • 定义新语言
  • 处理当前语言的所有惯用法
  • 轻松编写特定于任务的自定义代码
  • 定义新的复杂分析
  • 处理部分程序或包含错误的程序
  • (至您的初衷)让非专家轻松使用这些工具

因此,还有很多改进的空间。让许多花开。


0

在《神话人月》的“概念完整性”部分中可能已经回答了这个问题。如果不是,则至少与您的问题高度相关。尽管Brooks描述了构建整个计算系统的构想,但本文也很好地适用于框架和新语言。

我相信,任何技术的采用率与其概念完整性和易用性之间都存在正相关关系。应该对诸如语言,框架和操作系统之类的最新技术进行案例研究,以证明这种相关性,但目前还不知道。


我唯一的问题是,它没有提供任何实际价值。是参考书的一部分,根据您的描述,仅在发布软件包后才适用。它在发布之前并没有给我任何答案,因为它基本上是在说:“如果易于使用且与该领域相关,它将很好。” 我不能说它将做得如何,因为还没有到可以使用它的地步。编译器要做的事情是,您需要做很多工作,而只是意识到自己只是在半山腰,所以这很容易。
艾伦·克拉克·科普兰(Allen Clark Copeland Jr)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.