构建DSL:在通用语言之上编写脚本还是在独立语言之上编写脚本?


10

我正在讨论设计一种领域特定的语言,以简化给定的,晦涩的编程模型。辩论的一部分是是否要在现有语言/运行时(例如Java)之上构建(作为脚本)还是使其独立(自己的编译器&c)。

那些具有DSL设计经验的人,是否有赞成/反对意见,或对适当方法的肯定回答?


谁是这种DSL的消费者?以及潜在的主机(您提到过Java,是否在考虑其他可能性)?
Mauricio Scheffer

我认为房东有任何可能。消费者将是那些编写异步程序(带有目标的消息)的人。
JE队列

Answers:


9

我建议您在现有语言(内部DSL)的基础上创建DSL。我用Python做过几次,创建了DSL的使用者在其中写入python文件的系统,该文件用作系统的配置文件。配置文件使用了我定义的构造(类,函数)。这些构造形成DSL。

IMO是Python(IronPython或Jython,如果主机系统是.NET或Java)或Ruby(IronRuby,JRuby)之类的语言,则比Java或C#更适合作为DSL的基础。

就我而言,主机系统也是(C)Python,因此为DSL选择Python是很自然的事情。

一些优点:

  • 降低建筑成本。您可以实施的东西少得多。您可以专注于眼前的问题,而不必花费时间来实现解析器/编译器/解释器。
  • 访问宿主语言:您的语言将有权使用现有语言/平台的全部功能。

我不太了解语言,但是为什么您认为Python的身材更适合呢?
JE队列

1
比什么更合适?我猜Ruby和Python具有许多相同的好处,因为Ruby语法更灵活,所以它甚至可能更适合内部DSL。至于Java和C#,我已经看到了许多使用这些语言的流畅接口(新版本中的结构使内部DSL的创建/使用更加容易,例如对象初始化程序语法)-但IMO的“低级”语言是比“高级典礼”语言更适合。
codeape 2011年

1
我选择C#来实现内部DSL,以恰好利用“免费”的编译时静态类型检查。动态语言DSL与外部DSL相比并没有太多优势。

当我尝试用Python进行iDSL时,@ Den正是让我失望的。在Java中,您的iDSL感觉就像它从IDE中获得即时支持。尚未找到可用于Python的IDE。
candied_orange

2

查看Xtext(http://www.eclipse.org/Xtext/)和Xbase(http://blog.efftinge.de/2010/09/xbase-new-programming-language.html)。如果用户不是程序员,那么我认为您不应将DSL基于现有的编程语言。对他们来说太复杂了。如果制作正确,“干净的” DSL可能会非常有效。


2

除了推荐一种特定的方法外,我还可以推荐Martin Fowler的“ 领域特定语言”作为做出决定的绝佳资源。它对内部和外部DSL的相对优点进行了广泛的,发人深省的检查。


1

第三种选择是-在通用语言之上构建DSL作为编译器。具有某种程度的元编程功能的任何语言都可以胜任,甚至包括C ++这样的低级语言。对于这种事情,我更喜欢Lisp和类似的语言,但是Template Haskell或Nemerle也可以提供相同级别的灵活性。


1

Martin Folwer在他的《域特定语言》一书中描述了内部外部 DSL。
Internal DSL=是现有编程语言的子集,例如Ruby / Java等。
External DSL=您定义了语法和词汇表。
外部DSL可能更具表现力,但可能需要外部解析和代码生成。
虽然内部DSL不需要额外的处理,但是对于非编程领域的专家(例如,业务分析师,测试人员)而言,有时很难理解。

选择您的DSL类型时,分析其用户是很重要的。如果他们大多是非技术人员,那么外部DSL可能是更好的选择。对于一小组经验丰富的程序员,如果他们使用的编程语言具有足够的表达能力,则可以选择内部DSL。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.