有关DSL设计的书籍/论文吗?(不是DSL实施)

enz*_*nzi 13 dsl language-design

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

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

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

这引出了我的问题:什么语言结构直观,易于学习和理解?

在DSL的当前实验版本中,我们尝试了一种方法链接方法,例如:) list.where(item -> item.value > 5).select(item -> item.name + " " + item.value).可以想象where并且select作为foreach构造在哪里item是表示循环中当前项的变量.

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

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

我希望我的问题对这两个例子更清楚一点 - 我正在寻找设计指南,最佳实践,现实生活经验,可能是哪些语言结构对其他人有利的研究材料 - 或某些对某些方面的利弊评价语言结构.

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

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

enz*_*nzi 8

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

那么,关于语言的可用性:

符号认知维度是一个很好的框架,用于评估符号或任何认知工件的可用性.

自然的编程网站包含大量有趣的出版物,对我来说最有用的是在新手编程系统的设计可用性问题

最后,与我的问题相关的最近活跃的研究领域似乎是最终用户开发.在该区域搜索出版物应该会产生大量有用的信息.


Ira*_*ter 7

在我看来,设计域的关键问题是它的概念以及它们之间的关系.域分析涵盖了这一点,它听起来像你已经完成的,但无论如何都是关键链接:

Guillermo Arango关于域名分析

通过这种分析,您希望在一个域中进行工程设计,包括表达问题和解决方案的方法.关于领域工程的维基百科 显然是第一位的,但我发现它非常不满意,因为它未能引用Arango的工作.

(Arango在20世纪80年代是我在UCI Irvine的同事,当时领域分析和工程是一个热门话题).

你似乎想要的是langauge设计中的人为因素. 比尔柯蒂斯发表了一份报告,虽然有点陈旧,但可能会有所帮助.他(仍然是)心理学家.我会寻找引用他的研究论文(查看google学者的引文).