【问题标题】:Are there any books / papers on DSL Design? (not DSL implementation)有没有关于 DSL 设计的书籍/论文? (不是 DSL 实现)
【发布时间】:2011-11-10 21:13:08
【问题描述】:

我必须为非程序员(我们公司的客户)创建一个 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))。 将whereselect 视为foreach 构造,其中item 是表示循环中当前项的变量。

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

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

我希望通过这 2 个示例让我的问题更清楚一些 - 我正在寻找 设计指南、最佳实践、实际经验,可能是研究材料哪些语言结构对其他人有利 - 或对某些语言结构的优缺点进行一些评估。

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

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

【问题讨论】:

  • 这正是我现在寻找信息的原因,Bart。我只是想说我不知道​​当前的方法是否直观,因为坦率地说我不知道​​,因为我是创建 DSL 的人,我将永远知道如何使用它。我们将与部分客户密切合作,以确保语言直观。但是,在这种情况下,我们的客户对语言的初始设计几乎没有帮助 - 如果我现在问他们是否方法链方法很好,他们可能会说是,当它完成并且他们必须使用它时,他们可能会说不。
  • enzi,对不起,我删除了我的评论,因为我认为你或多或少地通过编辑你的原始问题来回复它...... :)
  • 我是这么认为的,但我会留下我的评论,以防其他人想知道为什么我是判断 DSL 是否直观的人 - 我在问题中对此不够清楚。

标签: language-design dsl


【解决方案1】:

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

所以,关于语言的可用性:

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

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

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

【讨论】:

    【解决方案2】:

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

    Guillermo Arango on Domain Analysis

    通过这样的分析,您想设计一个领域,包括表达问题和解决方案的方法。维基百科Domain Engineering 显然是第一位的,但我发现它非常不满意,因为它没有参考 Arango 的作品。

    (早在 1980 年代,Arango 是我在 UCI Irvine 的同事,当时领域分析和工程是一个热门话题)。

    您似乎想要的是语言设计中的人为因素。 Bill Curtis produced a report,虽然有点老,但可能会有所帮助。他是(仍然是)心理学家。我会寻找引用他的研究论文(查看谷歌学者下的引文)。

    【讨论】:

      【解决方案3】:

      我已阅读 DSLs in Action (http://www.manning.com/ghosh/),他出色地解释了有关编写 DSL 的不同问题,并在他的示例中使用了在 JVM 上运行的多种语言。

      因此,您可能想检查一下,然后您可以查看他的参考资料,以便在您需要的地方获得更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        相关资源
        最近更新 更多