Scripting 创建DSL与嵌入现有语言
这种情况经常出现:您的应用程序已经变得足够广泛,是时候向其中添加一些可编程性以使其灵活。一个例子可能是一个金融应用程序—您希望添加一个公式编辑器,这样您就可以创建自己的自定义公式,而无需重新编译代码 您必须做出选择:您是否创建了自己的标记器、解析器和解释器/编译器链,这可能需要很长时间,并且可能不正确地完成?或者你只是嵌入了另一种脚本语言,它的问题是它可能会使你的代码膨胀,并使你的应用程序暴露于安全漏洞Scripting 创建DSL与嵌入现有语言,scripting,interpreter,Scripting,Interpreter,这种情况经常出现:您的应用程序已经变得足够广泛,是时候向其中添加一些可编程性以使其灵活。一个例子可能是一个金融应用程序—您希望添加一个公式编辑器,这样您就可以创建自己的自定义公式,而无需重新编译代码 您必须做出选择:您是否创建了自己的标记器、解析器和解释器/编译器链,这可能需要很长时间,并且可能不正确地完成?或者你只是嵌入了另一种脚本语言,它的问题是它可能会使你的代码膨胀,并使你的应用程序暴露于安全漏洞 您将如何平衡权衡并做出此决定?没有权衡——嵌入一个经过全面测试、记录良好的解释程序。否则,您
您将如何平衡权衡并做出此决定?没有权衡——嵌入一个经过全面测试、记录良好的解释程序。否则,您将得到一个像MAXScript这样令人讨厌的东西。我将使用现有的解析器生成器(如ANTLR或Haskell/Scala的解析器组合器)创建自己的解释器。这真的没有那么难,对于简单的语言来说,这真的很容易。我在一个下午为一个极其简单的DSL创建了实现,第一次它运行得非常完美(没有bug)
话虽如此,您不想设计自己的图灵完整语言。如果您的需求如此复杂,您可能应该嵌入一种脚本语言。如果您使用的是JVM,那么JRuby和Clojure是这方面的优秀人选,特别是考虑到它们在内部DSL领域的优势。插件系统如何?有几个优点:
- 允许客户开发人员在开发源应用程序的环境中进行开发
- 在现代开发平台中,您可以通过软件合同获得很多控制和安全性
- 如果它的设计正确,你可以正确地将膨胀和故障归咎于导致它的插件——就像当Flash或其他第三方插件崩溃时Chrome所做的那样
- 易于通过许可/证书添加额外的安全性
- 如果某个插件非常棒,并且您希望所有客户都拥有它,则可以轻松地将其与应用程序合并
用户将从一种更容易编程的语言中获益,这种语言没有那么多怪癖和陷阱。如果我能更深入地理解一种设计良好且流行的语言的内部结构,我将受益匪浅,而不是在“myScript”中获得相对毫无价值的专家知识。如果我嵌入Python或perl之类的东西,我将不得不经历很多过程,以确保它们不能执行任意代码,不是吗?这两种语言很难保护。。。其他语言(我认为Lua是其中之一)提供了沙盒。@克劳迪乌:你可以限制Python上的导入。请参阅
站点
模块,了解限制导入和使用内容的方法。脚本不应该绕过安全性,因此在脚本中执行“任意”代码只是愚蠢的,并不危险。