我必须为非程序员(我们公司的客户)创建一个DSL,它需要提供一些更高级别的语言功能(循环,条件表达式,变量......)所以它不仅仅是一个& #34;简单" DSL)。
使用DSL应该很容易;人们应该能够尝试并通过玩耍来学习它。我们希望在Microsoft Excel中实现类似于Macros的东西 - 许多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必须提供的特征列表。问题是如何最好地表达这些特征,以便创建(和维护)简单和复杂的公式。
答案 0 :(得分:8)
虽然我不想回答我自己的问题,但我想关闭这个问题,并为那些寻找类似信息的人留下一些链接。 (我接受这个的原因是,虽然艾拉的回答是正确的,但报告有点过时 - 詹姆斯的回答与我的问题无关。)
所以,关于语言的可用性:
Cognitive Dimensions of Notations是一个很好的框架,用于评估符号的可用性,或任何认知工件。
Natural Programming网站包含大量有趣的出版物,对我来说最有用的是Usability Issues in the Design of Novice Programming Systems
最后,与我的问题相关的最近活跃的研究领域似乎是End User Development。在该领域搜索出版物应该会产生大量有用的信息。
答案 1 :(得分:7)
在我看来,设计域的关键问题是它的概念以及它们之间的关系。域分析涵盖了这一点,它听起来像你已经完成的,但无论如何都是关键链接:
Guillermo Arango on Domain Analysis
通过这样的分析,您希望设计一个域,包括表达问题和解决方案的方法。维基百科Domain Engineering 这是显而易见的第一名,但我发现它非常不满意,因为它未能引用Arango的作品。
(Arango在20世纪80年代是UCI Irvine的同事,当时领域分析和工程是一个热门话题)。
你想要的是langauge设计中的人为因素。 Bill Curtis produced a report虽然有点旧,但可能会有所帮助。他(仍然是)心理学家。我会寻找引用他的研究论文(查看google学者的引文)。
答案 2 :(得分:1)
我已经阅读了行动中的DSL(http://www.manning.com/ghosh/),他在解释有关编写DSL的不同问题方面做得非常出色,并且在他的示例中使用了在JVM上运行的多种语言。
所以,您可能想要检查一下,然后您可以查看他的参考资料,以获取您需要的更多信息。