Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scripting 创建DSL与嵌入现有语言_Scripting_Interpreter - Fatal编程技术网

Scripting 创建DSL与嵌入现有语言

Scripting 创建DSL与嵌入现有语言,scripting,interpreter,Scripting,Interpreter,这种情况经常出现:您的应用程序已经变得足够广泛,是时候向其中添加一些可编程性以使其灵活。一个例子可能是一个金融应用程序—您希望添加一个公式编辑器,这样您就可以创建自己的自定义公式,而无需重新编译代码 您必须做出选择:您是否创建了自己的标记器、解析器和解释器/编译器链,这可能需要很长时间,并且可能不正确地完成?或者你只是嵌入了另一种脚本语言,它的问题是它可能会使你的代码膨胀,并使你的应用程序暴露于安全漏洞 您将如何平衡权衡并做出此决定?没有权衡——嵌入一个经过全面测试、记录良好的解释程序。否则,您

这种情况经常出现:您的应用程序已经变得足够广泛,是时候向其中添加一些可编程性以使其灵活。一个例子可能是一个金融应用程序—您希望添加一个公式编辑器,这样您就可以创建自己的自定义公式,而无需重新编译代码

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


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

没有权衡——嵌入一个经过全面测试、记录良好的解释程序。否则,您将得到一个像MAXScript这样令人讨厌的东西。

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


话虽如此,您不想设计自己的图灵完整语言。如果您的需求如此复杂,您可能应该嵌入一种脚本语言。如果您使用的是JVM,那么JRuby和Clojure是这方面的优秀人选,特别是考虑到它们在内部DSL领域的优势。

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

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

除非DSL足够简单,解析器/解释器可以放在一个页面上,否则我建议嵌入现有的脚本语言

我最近花了几个月的时间在一个我继承的项目上,该项目包含一种完全自主开发的脚本语言。我花了很多时间来理解解析器和解释器,这样我就可以修复bug,使其线程安全,扩展它,优化它。此外,还有时间学习和理解这种新的脚本语言的怪癖,它的工作方式几乎与我所知道的其他脚本语言一样,但并不完全相同。 我更愿意利用这段时间嵌入Ruby或Lua等现有语言,并对其进行调整以满足我们的需要


用户将从一种更容易编程的语言中获益,这种语言没有那么多怪癖和陷阱。如果我能更深入地理解一种设计良好且流行的语言的内部结构,我将受益匪浅,而不是在“myScript”中获得相对毫无价值的专家知识。

如果我嵌入Python或perl之类的东西,我将不得不经历很多过程,以确保它们不能执行任意代码,不是吗?这两种语言很难保护。。。其他语言(我认为Lua是其中之一)提供了沙盒。@克劳迪乌:你可以限制Python上的导入。请参阅
站点
模块,了解限制导入和使用内容的方法。脚本不应该绕过安全性,因此在脚本中执行“任意”代码只是愚蠢的,并不危险。