2008-11-25 58 views
4

这经常出现:您的应用程序已经足够广泛,现在是时候在其中添加一些可编程性以使其具有灵活性。一个例子可能是财务应用程序 - 您想要添加公式编辑器,以便您可以创建自己的自定义公式,而无需重新编译代码。创建一个DSL与嵌入现有语言

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

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

回答

3

没有任何交易 - 嵌入了一个经过全面测试,有据可查的解释器。否则,你最终会像MAXScript一样受到憎恶。

+0

如果我嵌入类似Python或Perl的东西,我必须经历很多以确保它们不能执行任意代码,对吗? – Claudiu 2008-11-25 18:17:23

0

我会使用现有的解析器生成器(如ANTLR或Haskell/Scala的解析器组合器)创建自己的解释器。它并不像所有那样辛苦,对于简单的语言来说,它确实非常简单。我在一个下午创建了一个非常简单的DSL实现,并且它第一次完美运行(没有错误)。

就是说,你不想要设计自己的图灵完整语言。如果您的需求非常复杂,那么您应该嵌入一种脚本语言。如果你在JVM上,JRuby和Clojure是这类事情的最佳人选,尤其是考虑到他们在内部DSL领域的优势。

2

插件系统如何?有几个优点:

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

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

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

用户本来可以从一门更容易编程的语言中受益,但却没有什么怪癖和困难。我会从深入理解精心设计的流行语言的内部而获益,而不是在'myScript'中获得相对不值得的专业知识。