我必须为非程序员(我们公司的客户)创建一个DSL,它需要提供一些更高级的语言特性(循环、条件表达式、变量……所以它不仅仅是一个“简单的”DSL)。
使用DSL应该很容易;人们应该能够尝试它,并通过玩来学习它。我们希望在Microsoft中实现类似宏的功能--许多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,.)相反,由于DSL的使用方式。(当对DSL进行解析时,它直接与我们的对象模型一起工作-由于这个问题已经足够长,所以我将在这里不进行详细讨论)。
编辑:也许我应该指出,“语言构造”指的是语法,写东西的方式,而不是语言应该提供什么样的功能--我们已经列出了DSL必须提供的特性列表。问题是如何最好地表达这些特性,以便创建(和维护)简单而复杂的公式。
发布于 2012-10-24 07:09:00
虽然我不喜欢回答我自己的问题,我想关闭这个问题,并为那些寻找类似信息的人留下一些链接。(我之所以接受这一观点,是因为虽然艾拉的回答是正确的,但报告有点过时--詹姆斯的回答与我的问题无关)。
因此,关于语言的可用性:
符号的认知维度是一个很好的框架,用来评估符号的可用性,或者任何认知工件的可用性。
自然规划站点包含了许多有趣的出版物,对我来说最有用的是新手编程系统设计中的可用性问题。
最后,与我的问题相关的最新研究领域似乎是终端用户开发。搜索该领域的出版物应能得到相当多有用的信息。
发布于 2011-11-10 22:35:43
在我看来,设计一个领域的关键问题是它的概念和它们之间的关系。这是领域分析的一部分,听起来你已经做过了,但关键的链接是:
关于领域分析的Guillermo Arango
通过这样的分析,您需要在一个领域进行工程设计,包括一种表达问题和解决方案的方法。维基百科在领域工程上是显而易见的第一位,但我发现它非常不满意,因为它没有引用阿兰戈的工作。
(20世纪80年代,Arango是我在UCI Irvine的办公室成员,当时领域分析和工程是一个热门话题)。
你似乎想要的是语言设计中的人为因素。比尔·柯蒂斯撰写了一份报告虽然有点老了,但可能会有所帮助。他还是个心理学家。我会寻找引用他的研究论文(查看谷歌学者的引文)。
发布于 2011-11-11 01:17:46
我读过DSLs (http://www.manning.com/ghosh/),他出色地解释了与编写DSL有关的不同问题,并在他的示例中使用了在JVM上运行的几种语言。
因此,您可能想要检查,然后您可以查看他的参考资料,以获得更多的信息,你需要它。
https://stackoverflow.com/questions/8086364
复制相似问题