language-design - 有没有关于 DSL 设计的书籍/论文? (不是 DSL 实现)

标签 language-design dsl

我必须为非程序员(我们公司的客户)创建一个 DSL,它需要提供一些更高级别的语言功能(循环、条件表达式、变量...... - 所以它不仅仅是一个“简单”的 DSL)。

使用 DSL 应该很容易;人们应该能够试验它并通过玩耍来学习它。我们希望在 Microsoft Excel 中实现类似于宏的功能 - 许多 Excel 用户可以创建简单的公式、总和或计算,并且从未使用过“真正的”(通用)编程语言。

显然不是每个 Excel 用户都理解更复杂的内置方法(如 When()),但他们可以使用简单的方法,如 SUM() 或 AVG()。我想用 DSL 实现类似的效果——用户应该能够直观地使用它并定义简单的规则或执行简单的计算。同时,DSL 应该为更倾向于技术的人提供更高级别的特性——比如循环、if 语句、可能的方法或 lambda。

这让我想到了我的问题:哪些语言结构直观、易于学习和理解?

在当前的 DSL 实验版本中,我们尝试了方法链方法,例如:list.where(item -> item.value > 5).select(item -> item.name + " " + item.value) )。
想想whereselectforeach构造 where item是一个变量,表示循环中的当前项目。

我们首先尝试这种方法的原因是它很容易支持代码完成 - 每当用户输入句点 ( . ) 时,显示可能的方法列表。但是,我不确定这个概念是否符合我的标准,即直观且易于理解和阅读。

如果没有大括号,用户是否更容易/更易读? (就像在 LINQ 中: from item in list where item.value > 5 select item.name + " " + item.value )。然而,在这种情况下,没有“边界”——在前面的例子中,用户知道语句以最后一个右大括号结束——在这种情况下,如果他在 select 之后键入更多的代码语句的一部分,他不知道它是否属于该语句(除了解析器也不知道并且必须有某种闭包的事实)。

我希望我的问题通过这两个例子更清楚一些 - 我正在寻找 设计指南、最佳实践、现实生活体验 ,大概 研究资料哪些语言结构对其他语言结构有利——或者对某些语言结构的优缺点进行一些评估。

我不是在找 关于如何创建 DSL、我可以使用哪些解析器生成器等的信息,并且由于 DSL 的使用方式,我也不能使用现有的通用语言(Ruby、Python 等)。 (解析后的 DSL 直接与我们的对象模型一起工作 - 我不会在这里详细介绍这个问题,因为这个问题已经足够长了)。

编辑:也许我应该指出,“语言结构”是指语法、编写内容的方式,而不是语言应该提供的功能——我们已经有了 DSL 必须提供的功能列表。问题是如何最好地表达这些特征以允许创建(和维护)简单和复杂的公式。

最佳答案

虽然我不喜欢回答我自己的问题,但我想关闭这个问题,并为那些寻找类似信息的人留下一些链接。 (我接受这个的原因是,虽然艾拉的回答朝着正确的方向发展,但报告有点过时了——詹姆斯的回答与我的问题无关)。

因此,关于语言的可用性:

Cognitive Dimensions of Notations是一个很好的框架来评估符号的可用性,或者任何与此相关的认知工件。

Natural Programming网站包含很多有趣的出版物,对我最有用的是Usability Issues in the Design of Novice Programming Systems

最后,与我的问题相关的最近活跃的研究领域似乎是 End User Development .搜索该领域的出版物应该会得到很多有用的信息。

关于language-design - 有没有关于 DSL 设计的书籍/论文? (不是 DSL 实现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8086364/

相关文章:

c++ - 为什么 C++ 要求仅针对 float、double 或 long double 实例化该复数?

java - HttpRequestHandlingMessagingGateway PayloadExpression java 配置

Jenkins dsl 管道 def 变量

c# - 我可以编写一个 resharper 插件来重构生成 c# 代码的自定义 DSL

使用 ANTLRv4 的 Java DSL 实现

c# - 为什么 C# 不允许只读局部变量?

language-agnostic - 为什么编程语言不允许标识符中有空格?

javascript - 定义将由用户实现的功能

delphi - 为什么 Pascal 控制结构看起来不一致?

java - 将自然语言描述解析为结构化数据的策略