创建DSL与嵌入现有语言

时间:2008-11-25 18:11:19

标签: scripting interpreter

这常常出现:你的应用程序已经足够广泛,是时候为它添加一些可编程性以使其灵活。一个示例可能是财务应用程序 - 您希望添加公式编辑器,以便您可以创建自己的自定义公式,而无需重新编译代码。

你必须做出选择:你是否创建了自己的标记化器,解析器和解释器/编译器链,这可能需要很长时间并且可能不正确?或者你只是嵌入了另一种脚本语言,它的问题是它可能会使代码膨胀并使你的应用程序暴露在安全漏洞中。

您如何平衡权衡并作出此决定?

4 个答案:

答案 0 :(得分:3)

没有交易 - 嵌入经过全面测试,记录良好的翻译。否则,你最终会遭遇像MAXScript这样的憎恶。

答案 1 :(得分:2)

插件系统怎么样?有一些优点:

  • 允许客户开发人员在开发源应用程序的环境中进行开发。
  • 在现代开发中。平台,你通过软件合同获得了很多控制和安全。
  • 如果设计正确,你可以正确地归咎于膨胀和导致它的插件失败 - 就像Chrome在Flash或其他第三方插件崩溃时所做的那样。
  • 通过许可/证书轻松添加额外的安全性。
  • 很容易将插件与应用程序合并,如果它太棒了,并且您希望所有客户都拥有它。

答案 2 :(得分:1)

除非DSL足够简单以至于解析器/解释器适合单个页面,否则我建议嵌入现有的脚本语言。

我最近花了几个月的时间研究一个我继承的项目,其中包含一个完全成熟的脚本语言。我投入了大量时间来理解解析器和解析器。解释器,以便我可以修复错误,使其线程安全,扩展它,优化它。此外,还有时间学习和理解这种新脚本语言的怪癖,这种语言几乎与我已经知道的其他语言相似,但并不完全相同。   我宁愿用这段时间嵌入像Ruby或Lua这样的现有语言,并调整它以满足我们的需求。

用户本来可以从一种更容易编程的语言中受益,而且更少的怪癖和陷阱。我本可以从对设计精良的设计内部的深入理解中获益。流行的语言,而不是在'myScript'中获得相对无价值的专业知识。

答案 3 :(得分:0)

我将使用现有的解析器生成器(如ANTLR或Haskell / Scala的解析器组合器)创建自己的解释器。它真的没有那么难,对于简单的语言来说,它真的很容易。我在一个下午创建了一个非常简单的DSL的实现,它第一次完美运行(没有错误)。

话虽如此,您不希望设计自己的图灵完整语言。如果您的需求那么复杂,您应该嵌入脚本语言。如果你在JVM上,JRuby和Clojure是这类事情的绝佳选择,特别是考虑到他们在内部DSL领域的优势。