针对高度依赖math的用户编码的脚本或插件语言的build议?

我已经开始了这个问题的赏金

…因为我真的想要社区的投入。 我可以(也可以)查看几种语言/框架,并认为“好,这可能会工作正常” – 但我真的很感谢那些专门针对我面对的问题的build议,特别是那些有经验的人集成/使用什么你推荐。


我从事科学分析软件。 它为数据的math转换提供了很多工具。 一个工具允许用户input他们自己的方程,该方程运行在数据集(数值的大的2D或3Dmatrix)上并被评估。

这个工具有一个graphics方程式编辑器,它在内部为每个操作构build一个面向对象的expression式树(这里有一个对数类的实例,例如,树中用于添加计算对数的对数一个价值的基地;它有两个孩子是它的input。)它的一部分截图:

在这里输入图像说明

你可以看到它在左边的树,以及右边的菜单中的许多(五十?)个潜在的操作中的一些。

这有几个缺点:

  • graphics编辑器对于复杂的方程变得笨拙
  • 有一些操作很难用graphics表示,例如创build大型matrix(例如用于x n卷积的内核)
  • 它只允许方程:没有分支或其他逻辑

当它简单得多时,我们的用户希望能够做到这一点,这一点很简单。 如果我现在写了,我会做得完全不同 – 这是我的机会:)

我想给用户更强大的function,让他们编写代码脚本或编译 – 可以执行更高级的操作。 我正在寻求SO对这个应该使用什么技术或最好的方法的build议。

这个问题的其余部分很长 – 对不起。 我试图详细描述这个问题。 预先感谢您阅读:)

重要的限制:

  • 我们的math运算在大matrix上运行。 在上面的等式中,V1表示input(可能是很多),是2D或3D,每个维度可以很大:大约成千上万或几十万。 (我们很less计算所有这一切,只是切片/片段,但如果答案涉及到需要编组数据的东西,请注意这是一个考虑因素的大小和速度。

  • 我们提供的操作允许你写2 x V ,它将2 x V每个元素乘以2.结果是另一个相同大小的matrix。 换句话说,包含标准math基元的脚本或编程语言是不够的:我们需要能够控制哪些基元是可用的,或者是如何实现的。

    这些操作可能很复杂:input可以像数字(2,5.3,pi)一样简单,也可以像包含数字布尔值复数 (配对值)数据的1,2或3维matrix一样复杂 。 我目前的想法是一种足够强大的语言,我们可以将我们的数据types公开为类,并且可以实现标准的运算符。 一个简单的评估者是不够的。

    • 我们希望用户能够:(1)通过编写一个或多个input迭代评估的操作来提供输出(可通过expression式求值器轻松实现)input; 调用其他函数; 等等。对于主机程序,能够询问用户的代码将需要什么样的部分或input部分来评估切片或输出的一部分将是有用的。 我认为暴露我们课堂的某些部分并使用OO语言可能是实现这些要点的最好方法。
  • 我们的读者主要是研究科学家,他们或者不习惯于编码,或者可能习惯于像Matlab或R这样的语言。

  • 我们使用Embarcadero C ++ Builder 2010进行开发,只有less量的Delphi。 这可能会限制我们可以使用的东西 – 仅仅因为C ++的东西,并不意味着它只会被编码为VC ++或GCC。 它也必须适用于商业软件。

  • 我们的软件目前有一个COM接口,部分应用程序可以通过我们的应用程序作为进程外COM服务器来实现自动化。 我们可以将COM接口添加到某些内部对象,或者根据需要为此专门创build第二个COM框架。

  • 包括这个工具在内的“工具”正在被移植到一个multithreading框架中。 最终解决scheme需要能够在任何线程中执行 ,并且能够在多个线程中同时执行 多个实例 。 这可能会影响托pipe语言运行时 – 例如,Python 2.x具有全局锁。

  • 使用图书馆提供的math或科学用语是很好的。

  • 向后兼容旧expression式工具并不重要。 这是版本2:干净的石板!

目前的想法:

  • RemObjects Pascal脚本和DWScript是易于绑定到TObject派生类的语言。 我不知道是否有可能提供运算符重载。
  • 承载.Net运行时,并加载C#(说)基于DLL的插件。 我非常喜欢这个想法:我已经看到在主机程序提供语法高亮,debugging等function的情况下完成了这个工作。不过,我收集了大量的代码。 这将使IronPython和F#的使用。
    • RemObjects Hydra看起来像是一个有趣的实现方式。 不幸的是,它宣传自己的Delphi,而不是C ++ Builder; 我正在调查兼容性。
  • 托pipe类似Python的东西,可以从RAD Studio中实现
  • 提供一个BPL接口,让用户直接对我们的程序进行编码,如果他们购买RAD Studio的副本(即提供一个插件接口,并通过接口公开类;也许需要插件编译与我们的IDE二进制兼容版本)

感谢您的input! 我赞赏所有的答案,即使他们不完美 – 我可以研究,我只是在指出去哪里和意见(请回答:理由包括在答案中的意见)如何接近它或什么可能适用。 每一个答案,不pipe多短,将不胜感激。 但是,如果你推荐一些细节,而不仅仅是“使用X语言”,我会非常感兴趣的阅读:)

干杯,

大卫

更新:

到目前为止,已经推荐以下内容:

  • Python:2.6有一个全局锁,这听起来像是一个游戏杀手。 3(显然)还没有得到有用的图书馆的广泛支持。 这听起来对我来说(我知道我是Python社区的外部人员)就像分裂了一下 – 是否真的安全使用?

  • Lua:似乎并不是直接的OO,而是提供了“实现function的元机制,而不是直接在语言中提供许多function” 。 从程序员的angular度来看,这听起来非常酷,但这并不是针对想要酷玩的程序员。 我不确定在目标受众方面效果如何 – 我认为提供更多基础知识的语言会更好。

  • MS脚本/ ActiveScript。 我们已经提供了一个外部的COM接口,我们的用户使用它来自动化我们的软件,通常在VBScript中。 不过,我想要一个比VBS更强大(而且坦率地说,devise得更好)的语言,我不认为JScript也适合。 我也不确定哪些问题可能会通过COM编组数据 – 我们有很多数据,通常是非常特别的types,所以速度和保持这些types是非常重要的。

  • Lisp:我甚至没有想过那种语言,但我知道它有很多粉丝。

  • 主机.Net插件:没有被任何人提及。 这不是一个好主意吗? 你得到C#,F#,Python …它有COM相同的编组问题可能吗? (通过COM托pipeCLR工作吗?)

一些澄清: “matrix”是指在Matlabvariables意义上的matrix,即一个巨大的值表 – 而不是像您可能用于3D软件的4×4变换matrix。 它是随着时间的推移收集的数据,通常每秒数千次的数千个数值。 我们也不是在计算机代数系统之后,而是用户可以编写完整的插件并编写他们自己的math的东西 – 尽pipe能够处理复杂math的系统(如计算机代数系统)可能是有用的。 尽pipe如果两者不混合,我们可以把“全语言”翻译为“代数”,以允许用户代码中的复杂分支/path以及面向对象接口。

根据您的需求,这里有一些指导方针:

  • 区分语言和库 – 可以使用高级语言(如Python)来调用math语言(如MATLAB)或math库;
  • 语言(或图书馆)应该由math家为math家devise;
  • 使用的语言应该是现有的语言(不要重新发明轮子);
  • 您应该能够与现有软件共享脚本内容;
  • 你不应该从头开始这样一个大型的复杂项目(math脚本)。

所以我想这可能会减less候选人名单:

  • JavaScript并没有被devise(不使用)这样的用法;
  • delphi脚本(DWS或PascalScript)主要是为了自动化,而不是计算(并没有广泛使用);
  • 我不知道你为什么要在客户应用程序中使用Delphi IDE,但不应该使用Delphi IDE进行这种专有的开发:一个原始的定制IDE比一个完整的RAD更有效率;
  • 应该也许应该考虑使用Lua :你可以用这个脚本引擎做任何你想要的东西 – 但是,与Python不同的是,没有一个使用Lua的庞大的math家社区。

在开源世界中,你可以find很多非常有趣的解决scheme。 请参阅http://blog.interlinked.org/science/open_source_math_programs.html

我想这个八度可以考虑。 它简单,强大,成熟,众所周知,被很多软件所使用,并且跨平台。

据我所知,你可以从C / C ++代码中调用Octave库 。 这可以从delphi恕我直言,完成相关的.h文件的翻译。

但请注意GPL许可证。 如果您的软件是专有的,那么将Octave作为软件的一部分是不可能的。 但是, 如果您明确区分软件和GPL软件 , 则可以从软件中调用Octave库或任何其他GPL(如Python)。

embeddedPython可能是一个很好的解决scheme。 这种语言可以从delphi调用,你应该有一个很好的架构,而不需要直接调用像八度的一些C库。 Python可能是您的Delphi应用程序中所有其他计算库的主要门户。 例如,Octave可以从一些Python库中调用。 你也可以使用Python脚本自动化你自己的应用程序。 Delphi中有一些Python IDE 。 当然,每个组件的开源许可证都是安全的。 我想的越多,我越喜欢这个后一种解决scheme…

只是我的两分钱。 🙂

没有明确的答案,但是还有一些其他的build议:

  • 看看支持本地Pascal脚本的LMD创新ScriptPack ,以及基于ActiveScripting的语言。 警告:我使用了很多LMD工具和组件,但是我没有亲自使用Scriptpack。

  • LMD也有IDE-Tools软件包 ,如果你需要走这条路线,它可以真正简化制作一个简单的自定义“RAD”工具的任务

  • 另一个投给Lua。 我已经使用Lua作为C ++ Builder2010应用程序中的脚本语言,并且运行良好。 您可以利用C ++ Builder / Delphi RTTI来帮助Lua脚本和C ++代码之间的集成。

回覆。 Lua:我们有一个多年来有一个超级简单的“自制”脚本系统的产品。 没有循环,条件或过程 – 只是一系列参数化的命令。 我们想把这个扩展到更强大的东西,select第三方解决scheme似乎比重新发明轮子要less得多。 selectLua的主要原因是:

  • 快速
  • 已出版书籍( 以Lua编程 )
  • 写在C
  • 通过静态链接直接embedded到我们的项目中
  • MIT许可证
  • C ++代码可以调用Lua代码并访问Luavariables
  • Lua代码可以调用C ++函数
  • 小型部署足迹。 Lua和它的标准库在压缩之前添加到我们的.EXE的200K以下。

我相信其他语言本来可以同样好,但是这是Lua的“轻量级”特性,为我打开了它。

我喜欢那里的许多答案,好吧,我是一个有偏见的Delphi书呆子:)但是我build议你使用一个组合:RO Pascal Script + ESBPCS for VCL。

我不知道这听起来像你 – 但我会放弃它。

从网站上,我提取了关于图书馆matrix非可视部分的链接 。 还有更多,你可能想要放弃!

用Python,你可以免费获得NumPy和SciPy 。 是的,这里有GIL,但是它只在你的Python解释器运行多个线程时才有效。 我相信你可以运行多个Python主机在单独的线程没有问题(还没有尝试,思想)。

另外,还有像多处理这样的东西。

Python 3仍然在发展,NumPy在1.5.0版本中开始支持Python 3,而SciPy 在0.9.0版本中开始支持 。 另外,GIL仍然使用Python 3,虽然它已经重做,所以应该会更好。 NumPy在操作过程中释放锁。

我们一直在使用Microsoft脚本自动化(活动脚本),相当成功。 基本上你必须实现一个将运行脚本的主机。 脚本可以使用当前机器上安装的任何语言编写。 我们为脚本使用JavaScript,但不限于此。 那里有很多的脚本实现(甚至是python)。

从你的angular度来看,你将不得不提供一个脚本运行的框架。不是简单的,但是基本的COM理解也不难。 有为Delphi实现的实现。 这里有一些资源: http : //www.torry.net/pages.php?id=280,但你可以find资源遍布networking。

祝你好运!

我会build议Lua。 它是最常用的脚本语言之一,有很多工具,比如debugging器,带语法高亮的编辑器等等,很多人都用它,它是最快速的脚本语言之一,你可以很容易地插入到ac / c ++引擎。 将C函数扩展到它是很容易的(特别是如果你使用LuaJIT和FFI的话)。 在lua中没有multithreading的好方法,但是你可以很容易地在不同的线程中运行lua的多个实例来运行多个脚本。

因为你需要一个math有针对性的脚本语言,我可以推荐你看看Common Lisp 。 它是LISP的一种方言,最初是作为计算机程序的常规math符号而开发的。 像Maxima和Axiom这样的计算机代数系统是用Common Lisp编写的。 最显着的通用列表实现是ECL ,它是在LGPL许可下发布的。 当然,还有许多其他的开源实现。

也有用于Scheme编程语言(Lisp的一种方言)的GNU Guile解释器。 他们的网站指出

Guile是一个高效的虚拟机器,它执行由其优化编译器生成的便携式指令集,并且非常容易地与C和C ++应用程序代码集成。 除了Scheme之外,Guile还包括ECMAScript和Emacs Lisp的编译器前端(对Lua的支持正在进行中)…

但是,我从来没有使用过这个库,所以我不能保证将它embedded到应用程序中是多么容易。

没有人提到PaxCompiler可以将Pascal,Javascript和Basic编译成本地代码,并且可以很容易地设置为访问Delphi项目中的对象。 它有很多优点:

  1. 编译的代码将比解释的代码运行得更快
  2. 它提供了3种不同的编程语言,几乎所有的开发人员都能感觉到在家
  3. 作为Delphi开发人员,您可以访问源代码,并且与您的项目紧密集成
  4. 价格非常有趣

一个受欢迎的项目的缺点和挑战是:

  1. 确保3种语言被平等对待:在我的testing中,感觉就像捆绑的样本一样JavaScript是落后的
  2. 如果您select将所有3种编程语言捆绑在一起,您可能希望提供几乎所有语言的样本,并且必须能够支持所有这三种语言

我build议你看看基于wx(C ++)的graphics用户界面(GUI)封装器,这个名为Maxima的经典的开源math程序,在Windows上叫做wxMaxima。 这是GPL许可,但是,而不是LGPL,所以派生的作品也必须开源。

你应该可以使用这个应用程序和它的代数引擎,也许你可以在MACSYMA / MAXIMA(LISP)引擎上为这个C ++ UI编写你自己的Delphi包装器。 他们的系统的源代码包括一些你可能想要包装和提供的服务:

  1. 一种将math方程式编码成显示格式的方法,从用户input的格式,这是很好的定义,然后可以logging。

  2. 一个简单的“语言”规范,你可以用它来构build你的“所见即所得的方程”工具。

最大值可以处理图,matrix,线性代数和基本计算,并且引擎是稳定的。

既然你已经在C ++中做了很多事情,我会考虑使用wxWidgets来做你的整个应用程序,以wxMaxima为基础。 我不确定您是否可以在C ++ Builder中使用wx + VCL混合,但是您一定要试一试。 如果你不能,那么我会说用wxWidgets在VC ++中创build主应用程序,并在Delphi中为它创build插件(如DLL)。

在这里输入图像说明

我的想法:

  1. 通过它的API(C,Java,C#)调用Mathematica,但是恐怕对你来说可能太慢http://reference.wolfram.com/mathematica/guide/MathLinkAPI.html

  2. http://fsharppowerpack.codeplex.com/和fslex,fsyacc生成F#。; 另请参见: 如何在F#中评估以stringforms存储的expression式 , Tim Robinson 在F#中 构buildLISP编译器

你提到你的观众可能习惯了R.你应该看看把你的产品与R集成在一起,无论是作为R Extension还是从你的产品中调用R. 请参阅编写R扩展 。 这样你就可以利用R的力量和你的用户熟悉R.

在python上的GIL不应该是一个showstopper,因为它的存在并不意味着你的应用程序不能做multithreading。 确实,你不能使用系统上可用的所有CPU核心,但是这只会影响你的大部分代码是用python编写的。 你的应用程序将托pipepython代码吗? 而那些脚本会密集地调用宿主应用程序中可用的math例程。 这意味着仍然有很多解决scheme来释放和保持GIL在您的应用程序,以尽量减less其副作用,你会很好。