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

Dav*_*vid 48 c++ delphi api plugins

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

...因为我真的想要社区的意见.我可以(并且已经)查看了几种语言/框架,并且"好吧,这可能会正常工作" - 但我真的很感谢那些专门针对我面临的问题的建议,尤其是那些有经验整合/使用什么的人你推荐.


我从事科学分析软件的研究.它为数据的数学转换提供了许多工具.一个工具允许用户输入他们自己的等式,该等式在数据集(大的2D或3D矩阵值)上运行并进行评估.

这个工具有一个图形方程编辑器,它在内部构建一个面向对象的表达式树,每个操作都有一个不同的对象(例如,会有一个Logarithm类的实例,它是树中用于添加计算对数的节点一个值的基础;它有两个孩子作为其输入.)部分截图:

在此输入图像描述

您可以在左侧看到它正在构建的树,以及右侧菜单中的许多(五十个)潜在操作中的一些.

这有一些缺点:

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

对于我们的用户希望能够使用它的那种东西,它更简单,但不再是更简洁.如果我现在写它我会做得完全不同 - 这是我的机会:)

我想为用户提供更强大的功能,让他们编写代码 - 脚本或编译 - 可以执行更高级的操作. 我正在寻求对这应该使用的技术或采取最佳方法的建议.

这问题的其余部分很长 - 我很抱歉.我试图详细描述这个问题.在此先感谢您阅读:)

重要限制:

  • 我们的数学运算在大型矩阵上.在上面的等式中,V1表示输入(可能是许多之一)并且是2D或3D,并且每个维度可以是大的:大约数千或数十万.(我们很少同时计算所有这些,只是片段/片段.但如果答案涉及需要编组数据的内容,请注意这个问题的大小和速度.)

  • 我们提供的操作允许您编写,比如说,2 x V将每个元素乘以V2.结果是另一个相同大小的矩阵.换句话说,一个脚本或编程语言,其中包括标准的数学元是不够的:我们需要的是能够控制哪些元可用,或如何得到实施.

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

    • 而不是仅仅编写迭代地在一个或多个输入上评估的操作以提供输出,如当前(可通过表达式评估器轻松实现),我希望用户能够:提供不同大小的输出到输入; 打电话给其他功能; 对于主程序,能够询问用户的代码以评估切片或输出的一部分所需的输入的哪个部分或切片将是有用的.我认为暴露我们课程的某些部分并使用OO语言可能是实现这些要点的最佳方式.
  • 我们的受众主要是研究科学家,他们不习惯编码,或者可能习惯于像Matlab或R这样的语言.

  • 我们使用Embarcadero C++ Builder 2010进行开发,使用少量Delphi.这可能会限制我们可以使用的东西 - 仅仅因为某些东西的C++,并不意味着如果它只是针对VC++或GCC进行编码就会起作用.它还必须适合与商业软件一起使用.

  • 我们的软件目前有一个COM接口,部分应用程序可以自动化,我们的应用程序是进程外的COM服务器.我们可以将COM接口添加到某些内部对象,或者如果需要,可以专门为此创建第二个COM框架.

  • 包括这个在内的"工具"正在迁移到多线程框架.最终解决方案需要能够在任何线程中执行,并且可以在多个线程中同时执行多个实例.这可能会影响托管语言运行时 - 例如,Python 2.x具有全局锁定.

  • 使用图书馆附带的语言进行数学或科学使用会很棒.

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

目前的想法:

  • RemObjects Pascal ScriptDWScript是可以轻松绑定到TObject派生类的语言.我不知道是否可以提供运算符重载.
  • 托管.Net运行时,并将基于C#(例如)的DLL作为插件加载.我更喜欢这个想法:我已经看到这样做,主机程序提供语法高亮显示,调试等等.我收集它是一个巨大的编码量.它也可以使用IronPython和F#.
    • RemObjects Hydra看起来像是实现这一目标的有趣方式.不幸的是,它为Delphi而不是C++ Builder做广告; 我正在调查兼容性.
  • 托管类似Python的东西,这可以从RAD Studio中完成
  • 提供BPL接口,如果用户购买了RAD Studio的副本(即,提供插件接口,并通过接口公开类;可能需要使用我们IDE的二进制兼容版本编译插件),让用户直接对我们的程序进行编码
  • ...

感谢您的输入!我很欣赏所有的答案,即使它们不是很完美 - 我可以研究,我只是在指示去哪里,以及意见(请在答案中包含理由的意见:p)如何处理它或者可能的适用.每个答案,无论多短,都将受到赞赏.但是如果你推荐一些细节而不仅仅是"使用语言X"我会非常感兴趣阅读它:)

干杯,

大卫

更新:

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

  • Python:2.6具有全局锁定,听起来像游戏杀手.3(显然)尚未得到有用库的广泛支持.听起来对我来说(我知道我是Python社区的局外人),就像它有点碎片一样 - 使用它真的安全吗?

  • Lua:似乎不是直接OO,而是提供"实现功能的元机制,而不是直接在语言中提供大量功能".从程序员的角度来看,这听起来非常酷,但这不是针对那些想要玩酷玩的程序员.我不确定它对目标受众的效果如何 - 我认为提供更多基础知识的语言会更好.

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

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

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

一些澄清:通过"矩阵",我指的是Matlab变量意义上的矩阵,即一个巨大的值表 - 而不是像你可能用于3D软件的4x4变换矩阵.它是随着时间的推移收集的数据,成千上万的值通常是每秒多次.我们也不是在计算机代数系统之后,而是用户可以编写完整插件并编写自己的数学的东西 - 尽管具有处理复杂数学能力的系统,如计算机代数系统,可能会很有用.如果两者不混合,允许在用户代码中使用复杂的分支/路径,以及OO接口,我会对"代数"采用"全语言".

Arn*_*hez 18

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

  • 区分语言和库 - 您可以使用数学语言(如MATLAB)或从高级语言(如Python)调用的数学库;
  • 语言(或图书馆)应由数学家为数学家设计;
  • 使用过的语言应该是现有语言(不要重新发明轮子);
  • 您应该能够与现有软件共享脚本内容;
  • 你不应该从头开始这么大的复杂项目(数学脚本).

所以我猜它可以减少候选人名单:

  • JavaScript没有设计(不使用)用于此类用途;
  • Delphi脚本(DWS或PascalScript)主要用于自动化,而不是计算(并没有广泛使用);
  • 我不知道你为什么要在客户应用程序中使用Delphi IDE,但你不应该使用Delphi IDE进行这样的专有开发:原始的自定义IDE比完整的RAD更高效;
  • 也许应该考虑Lua:你可以用这个脚本引擎做任何你想要的东西 - 但是没有庞大的数学家社区使用Lua,不像Python ...

在开源世界中,您可以找到许多非常有趣的解决方案.请参见http://blog.interlinked.org/science/open_source_math_programs.html

我想可以考虑Octave.它简单,强大,成熟,众所周知,被许多软件和跨平台使用.

据我所知,您可以从C/C++代码调用Octave库.在翻译相关的.h文件后,可以从Delphi IMHO完成.

但要注意GPL许可证.如果您的软件是专有软件,则可能无法将Octave作为软件的一部分进行分发.但是,如果您明确区分软件和GPL软件,则可以从软件中调用Octave库或任何其他GPL内容(如Python).

嵌入Python可能是一个很好的解决方案.这个语言可以从Delphi调用,你应该有一个很好的架构,而不需要像Octave那样直接调用一些C库.从您的Delphi应用程序中,Python可以成为所有其他计算库的主要门户.例如,可以从一些Python库中调用Octave.您还可以使用Python脚本自动化您自己的应用程序.你在Delphi中有一些Python IDE.当然,每个组件的开源许可证都是安全的.我想的越多,我就越喜欢后一种解决方案......

只是我的两分钱.:)


Rod*_*ddy 7

没有确定的答案,但还有一些其他的建议: -

  • 查看支持本机Pascal脚本的LMD Innovative ScriptPack以及基于ActiveScripting的语言.警告:我使用了很多LMD工具和组件,但我没有亲自使用过Scriptpack.

  • LMD还有IDE-Tools软件包,如果你需要走这条路,它可以真正简化制作简单定制'RAD'工具的任务

  • Lua的另一票.我在C++ Builder2010应用程序中使用Lua作为脚本语言,它运行良好.您可以利用C++ Builder/Delphi RTTI来帮助Lua脚本和C++代码之间的集成.

回覆.Lua:我们的产品多年来都有一个超级简单的"自制"脚本系统.没有循环,条件或过程 - 只是一系列参数化命令.我们希望将其扩展到更强大的功能,而选择第三方解决方案似乎比重新发明轮子要轻松得多.选择Lua的主要原因是: -

  • 快速
  • 出版的书籍(Lua编程)
  • 用C写的
  • 通过静态链接直接嵌入我们的项目中
  • MIT许可证
  • C++代码可以调用Lua代码并访问Lua变量
  • Lua代码可以调用C++函数
  • 占地面积小.在压缩之前,Lua和它的标准库在我们的.EXE下添加了200K以下.

我敢肯定其他语言本来可以同样好,但是Lua的"轻量级"特性为我提供了它.


And*_*ndi 5

我喜欢那里的许多答案,好吧,我是一个有偏见的德尔福书呆子:)但我建议你使用一个组合:RO Pascal脚本+ ESBPCS为VCL.

我不知道这听起来像你 - 但我会试一试.

从网站上,我提取了关于库的矩阵非可视部分的链接.还有更多,你可能想放手一搏!


Har*_*riv 5

使用Python,您可以"免费" 获得NumPySciPy.是的,有GIL,但它只在你的Python解释器运行多个线程时才有效.我相信你可以在不同的线程中运行多个Python主机而没有问题(没想过,想过).

此外,还有像多处理这样的东西.

Python 3仍在流行,NumPy在1.5.0版本中开始支持Python 3,而SciPy 在0.9.0版本中开始支持.此外,GIL仍然使用Python 3,虽然它已经重做,所以它应该更好.此外,NumPy 在操作期间释放锁定.