这可能是主观的,我不知道:我有这个问题,我有点等同于“这个项目用什么语言?”问题,因为我似乎无法解决它。
我一直致力于为一个技术精湛的社区写一本关于某个领域的书(让我们说一个非常具体的物理学分支),但他们不是程序员。这是一本关于这个算法子集的书,他们日复一日地使用它们。
为此,鉴于我的观众,我一直在研究定义DSL的想法,而不是让他们学习语言X,并且从这个角度讨论算法,而不是在给定的语言或伪代码中
问题是,那么:有什么迹象表明你需要的是一个DSL,而不是一个从一个完善的通用语言中调用的函数库?
感谢。
编辑:目前有关DSL的建议:
答案 0 :(得分:3)
我会选择通用语言的DSL。
答案 1 :(得分:3)
您可以选择与您正在处理的域名完全匹配的DSL。程序员可以熟悉通用语言并在许多情况下应用它。您的非程序员可能会受益于与他们直接相关的语言。如果关键字和概念符合他们的专业知识,他们也可以更容易理解。
与大多数事情一样,这是一种权衡。对于您的受众来说,DSL应该更容易,但对您来说可能更有用。
答案 2 :(得分:2)
您可以使用DSL从呼叫语言解除一组相关操作。
如果您希望保护用户免受通用语言的复杂性(或限制他们访问该语言,因为他们可能会滥用它),请设计DSL。
但如果您希望以与调用语言集成的方式使用操作,则使用函数库(或其他运算符)。
答案 3 :(得分:2)
我认为这将取决于编写DSL和函数式编程语言,因为根据我的经验,物理学家在Fortan或Matlab中相当有能力。
您可能希望尝试将这些语言用于您的示例,因为它可以让您进入算法,因为它可能会帮助那些更具技术性的算法。
正如Mitch Wheat所提到的,当您想要隐藏用户的详细信息时,DSL很不错。
答案 4 :(得分:1)
我认为DSL的目的是抽象出细节,让程序员(或实现者)通过保持领先地位来提高工作效率,可以这么说。
如果你想解释算法集合的细节,我会坚持一个常见的嫌疑人(C ++?)。
一个重要的考虑因素是您的受众是否已经主要使用单一语言。如果是这样,我们已经做出了选择!
您可能想要考虑的另一件事是,通过选择流行的主流语言,您的图书适用于更广泛的受众,而无需先“学习”DSL。
答案 5 :(得分:1)
最终我会这样看待它:DSL(就像任何编程语言一样)是一组词汇标记和习语,你可以用来解释如何做某事。这组令牌中隐含的是一组习语。
任何语言的想法都是你选择一个合适的语言,以便更容易表达预期的算法。
一个很好的例子是报告语言(例如自然)。这是因为报告有像团体,破坏条件等常见的习语。任何以通用语言表达的人都会告诉你,做一些像破坏条件这样的事情真的很乏味,但这当然是可能的。
所以你应该问的问题是:是否有任何常见的习语,用通用语言表达是乏味,困难或极其冗长的?您还应该问:您最感兴趣的功能的特定子集是否会使其成为语言概念而受益?这可能是线性代数的向量和矩阵(具有适当的运算)或者对于积分/差分微积分或微分方程的相同。
最终你想拥有DSL的是500线路程序可以表达为50-100线的DSL,这适用于大多数“预期”算法。我想这有点像数据建模中的规范化,其目标是删除重复的组。用相同的变化编写相同的10-20行代码表明了一个常见的习语。
对于函数库,这是对同一事物(最终)的更有限的观点,除了函数库仅仅是不同行为的包。这就是你定义一个函数库,而不是包含复杂的对象层次结构,闭包等等。如果这样做,那么“功能库”和DSL之间的界限就会模糊不清。
我会想到一个函数库,比如说,大多数现代语言中存在的数学函数集(sin,cos,square root等)。所以我想它归结为:
答案 6 :(得分:0)
使用伪代码来解释您的算法。这比使用带有库API的通用编程语言更通用。
您认为您的DSL有多复杂?读者要熟悉它吗?
虽然您可以使用源代码填充书的后面以填充这些页面。
答案 7 :(得分:0)
你必须权衡你可以提供更清晰的符号的程度,以及没有人知道你使用的符号的事实。从理论上讲,你可能能够遵循这个小组一般使用的符号,以至于它“直观明显” - 但除非它们与大多数物理学家不同,否则可能效果不佳。许多人使用典型键盘上不存在的希腊语和/或希伯来语字符。
如果您确实使用了DSL,那么您是否准备好实施它,但是要花费大量的时间来维护它?您是否拥有超越语言的资源,并为其提供基础设施以成为有用的开发工具?如果它将用于实际开发,它可能需要一个调试器。您可能还需要考虑新的IDE(如果它真的不同)或定制现有产品(例如为emacs创建专用模式或为Eclipse创建插件)。
如果你发明了DSL,那么人们真正使用它的可能性有多大?如果已经有了彻底根深蒂固的东西,取代它可能会非常困难。创建一种填充真空的新语言比替换已经使用的东西要容易得多。另一方面,如果确实存在真空,这可能表明市场不多 - 您的受众可能对成为软件开发人员不是特别感兴趣。