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必须提供的功能列表.问题是如何最好地表达这些特征以允许创建(和维护)简单和复杂的公式.
在我看来,设计域的关键问题是它的概念以及它们之间的关系.域分析涵盖了这一点,它听起来像你已经完成的,但无论如何都是关键链接:
通过这种分析,您希望在一个域中进行工程设计,包括表达问题和解决方案的方法.关于领域工程的维基百科 显然是第一位的,但我发现它非常不满意,因为它未能引用Arango的工作.
(Arango在20世纪80年代是我在UCI Irvine的同事,当时领域分析和工程是一个热门话题).
你似乎想要的是langauge设计中的人为因素. 比尔柯蒂斯发表了一份报告,虽然有点陈旧,但可能会有所帮助.他(仍然是)心理学家.我会寻找引用他的研究论文(查看google学者的引文).