【发布时间】:2011-08-13 20:09:15
【问题描述】:
我已经从一个类似的问题中分出了这个问题,我在对我收到的许多很好的答案之一发表的评论中提出了这个问题。我最初询问的是 AST 宏,这主要引起了 Lispers 非常详细和深思熟虑的回应。谢谢。
我在评论中提出的问题是,特定于项目的 DSL 是否真的是一个好主意。当然,这完全是主观的——毕竟,当你用一种真正富有表现力的语言编写代码时,你在哪里划定了富有表现力的 API 和实际的 DSL 之间的界限?例如,我认为大多数 Ruby 主义者所说的“DSL”实际上只是精心设计的 API,仅此而已。
请注意,我说的是项目特定 API。我不认为很多人会反对在有意义的地方使用正则表达式或 SQL。
但尽管如此,我认为我们都可以在 API 和 DSL 之间划出一条模糊不清的界限。当然,它们都是真正的 API,但无论如何。
在一个极端情况下,你有 Lisp,其中似乎通过宏积极鼓励 DSL。另一方面,你有 Java 之类的东西,DSL 几乎是不可能的。
DSL 的支持者会争辩说,它们增加了灵活性、表现力和一致性(例如,使用与语言自己的数字相同的运算符的自定义数字对象)。
批评者会说他们会导致除了 DSL 编写者之外没有人知道的子语言,首先扼杀了使用不同编程语言的意义,并导致没有人可以理解的代码,因为 接口的方式 与 API 不同。
我得说,我在很多方面都同意双方的观点。由于缺乏表现力,一些 Java API 简直就是令人讨厌。尽管如此,我通常可以在不阅读文档的情况下弄清楚发生了什么——这对于自定义 DSL 一点也不能说。也许 DSL 支持者认为您应该始终阅读 API 文档。我不同意,但我也离题了。
但是,让我们看看目前的一些主要语言。 C#和Java,即。它们都没有真正“做” DSL,但它们非常受欢迎。这是否正是因为他们不允许允许使用 DSL 之类的东西,从而允许平庸的编码人员编写出仍然可以理解的代码?
DSL 允许平庸的编码人员产生难以理解的垃圾这一事实是否是 Lisp 没有得到应有的使用的原因,尽管 DSL 在右手中看起来会是什么样子?
【问题讨论】:
-
我认为如果你在创建 DSL 方面做得很好,无论如何它都会超越单个项目:)
-
@Affe:非常真实,哈哈。但公平地说,像正则表达式和 SQL 一样,能够深入到每个程序员必须学习的列表中的 DSL 也只有这么多。
-
谁说不能用Java来创建DSL? camel.apache.org/dsl.html
-
@duffymo:你的链接证明了我的观点:你不能在 Java 中做 DSL,所以他们必须结合语法在字符串和链式方法调用来实现 DSL,它似乎。比你在 Haskell 或 Lisp 中得到的东西笨拙得多,而且更容易出错。
-
我刚刚查看了 Xtext Wikipedia 页面,看到了这样的声明:“与标准解析器生成器不同,Xtext 不仅生成解析器,[...]”。这意味着它必须解析它,这反过来又意味着它不是 Java。用 Java 编写一个完整的解析器来解释 DSL 表明 Java 不擅长 DSL 构造。