对于高度依赖数学的用户编码的脚本或插件语言的建议? [关闭]
Posted
技术标签:
【中文标题】对于高度依赖数学的用户编码的脚本或插件语言的建议? [关闭]【英文标题】:Recommendations for a scripting or plugin language for highly math-dependent user coding? [closed] 【发布时间】:2011-09-06 01:51:32 【问题描述】:我已经为这个问题开始赏金
...因为我真的想要 社区的投入。我可以(并且拥有) 看了几种语言/ 框架并认为'好吧,这将 可能工作正常' - 但我会 非常感谢专门基于 我面临的问题,尤其是来自 任何有整合经验的人 / 使用你推荐的。
我从事科学分析软件的工作。它为数据的数学转换提供了很多工具。一种工具允许用户输入他们自己的方程式,该方程式在数据集(大型 2D 或 3D 值矩阵)上运行并进行评估。
这个工具有一个图形方程编辑器,它在内部构建了一个面向对象的表达式树,每个操作都有一个不同的对象(例如,会有一个 Logarithm 类的实例,它是树中用于添加的节点计算一个值到一个底的对数;它有两个孩子作为它的输入。)它的一部分截图:
您可以在左侧看到它正在构建的树,在右侧的菜单中可以看到许多(五十个?)潜在操作中的一些。
这有一些缺点:
图形编辑器在处理复杂方程时变得笨拙 有些操作难以用图形表示,例如创建大型矩阵(例如 n x n 卷积的内核) 它只允许方程:没有分支或其他逻辑当它更简单时,它很整洁,但不再是,因为我们的用户希望能够用它来做那种事情。如果我现在写它,我会做的完全不同——这是我的机会:)
我想给用户一些更强大的东西,让他们编写代码 - 脚本或编译 - 可以执行更高级的操作。 我正在寻求 SO 的建议,以了解应该使用什么技术或最佳方法。
这个问题的其余部分很长 - 对不起。我试图详细描述这个问题。提前感谢您阅读它:)
重要限制:
我们的数学运算适用于大型矩阵。在上面的等式中,V1 代表输入(可能是多个输入之一)并且是 2D 或 3D,并且每个维度都可以很大:在数千或数十万的数量级上。 (我们很少一次计算所有这些,只计算切片/段。但如果答案涉及需要编组数据的内容,请注意其大小和速度是一个考虑因素。)
我们提供的操作允许您编写2 x V
,它将V
中的每个元素乘以2。结果是另一个相同大小的矩阵。换句话说,包含标准数学原语的脚本或编程语言是不够的:我们需要能够控制什么原语可用,或者如何实现它们.
这些操作可能很复杂:输入可以像数字 (2, 5.3, pi) 一样简单,也可以像包含 数字 的 1、2 或 3 维矩阵一样复杂, boolean 或 complex(配对值)数据。我目前的想法是一种足够强大的语言,我们可以将数据类型公开为类并可以实现标准运算符。一个简单的评估器是不够的。
我希望用户能够: 提供不同的输出输入的大小;调用其他函数;等等。对于主机程序,能够询问用户的代码将需要输入的哪一部分或哪一部分来评估输出的一部分或部分是很有用的。我认为公开我们的部分课程并使用 OO 语言可能是实现这些目标的最佳方式。我们的受众主要是研究科学家,他们要么不习惯编码,要么可能习惯于 Matlab 或 R 等语言。
我们使用Embarcadero C++ Builder 2010 进行开发,使用少量的Delphi。这可能会限制我们可以使用的东西——仅仅因为某些东西是 C++ 并不意味着如果它只针对 VC++ 或 GCC 编码就可以工作。它还必须适用于商业软件。
我们的软件目前有一个 COM 接口,部分应用程序可以自动化,我们的应用程序是进程外 COM 服务器。如果需要,我们可以为一些内部对象添加 COM 接口,或者专门为此创建第二个 COM 框架。
“工具”(包括这个工具)正在迁移到多线程框架。最终解决方案需要能够在任何线程中执行,并且在多个线程中同时执行多个实例。这可能会影响托管语言运行时 - 例如,Python 2.x 具有全局锁。
如果使用库附带的用于数学或科学用途的语言会很棒。
与旧表达式工具的向后兼容性并不重要。这是第 2 版:从头再来!
目前的想法:
RemObjects Pascal Script 和DWScript 是易于绑定到TObject
派生类的语言。不知道能不能提供算子重载。
托管 .Net 运行时,并将基于 C#(例如)的 DLL 作为插件加载。我更喜欢这个想法:我已经看到主机程序提供了语法高亮显示、调试等功能。不过,我认为这是一个大量代码。它也可以使用 IronPython 和 F#。
RemObjects Hydra 看起来是一种有趣的实现方式。不幸的是,它宣传的是 Delphi,而不是 C++ Builder;我正在调查兼容性。
托管类似Python, which is doable from RAD Studio
提供 BPL 接口,如果用户购买 RAD Studio 的副本,则可以直接针对我们的程序编写代码(即,提供插件接口,并通过接口公开类;可能需要使用二进制兼容版本的我们的 IDE)
...
感谢您的意见!我感谢所有答案,即使它们不是很完美 - 我可以研究,我只是在获得关于去哪里的指示,以及关于如何处理它或可能发生什么的意见(请在答案中包含原因的意见:p)适用。每一个答案,无论多短,都会受到赞赏。但是如果你推荐一些详细的东西而不仅仅是“使用语言 X”,我会非常有兴趣阅读它:)
干杯,
大卫
更新:
目前已推荐以下内容:
Python:2.6 有一个全局锁,这听起来像是一个游戏杀手。 3(显然)还没有得到有用库的广泛支持。对我来说(我知道我是 Python 社区的局外人)听起来有点分散 - 使用起来真的安全吗?
Lua:好像不是直接OO,而是provides "meta-mechanisms for implementing features, instead of providing a host of features directly in the language"。从程序员的角度来看,这听起来很酷,但这并不是针对想要玩酷东西的程序员。对于目标受众,我不确定它的效果如何 - 我认为提供更多内置基础的语言会更好。
MS 脚本/ActiveScript。我们已经提供了一个外部 COM 接口,我们的用户使用它来自动化我们的软件,通常是 VBScript。但是,我想要一种比 VBS 更强大(坦率地说,设计更好)的语言,而且我认为 JScript 也不适合。我也不确定通过 COM 编组数据可能会出现什么问题 - 我们有很多数据,通常是非常明确的类型,因此速度和保持这些类型很重要。
Lisp:我什至没有想到那种语言,但我知道它有很多粉丝。
托管 .Net 插件:没有人提及。这不是一个好主意吗?你会得到 C#、F#、Python……它是否有与 COM 相同的编组问题? (托管 CLR 是否通过 COM 工作?)
两点澄清:“矩阵”是指 Matlab 变量意义上的矩阵,即一个巨大的值表 - 不是你可能用于 3D 的 4x4 变换矩阵软件。它是随时间收集的数据,数以千计的值通常每秒多次。我们也不是在追求计算机代数系统,而是用户可以编写完整插件并编写自己的数学的东西——尽管该系统能够处理复杂的数学,就像计算机代数系统一样,会很有用。如果两者不混合,我会采用“全语言”而不是“代数”,以允许用户代码中的复杂分支/路径以及 OO 接口。
【问题讨论】:
说实话,听起来很像 matlab:mathworks.com/products/matlab @Stijn Sanders:是的...我试图在不涉及特定领域的情况下对其进行一般性描述,但我猜这个特定的组件会是相似的。整个产品的功能远不止于此,这只是其中的一小部分 :) 一些用户使用 Matlab,如果我们提供足够他们不需要的功能,那就太好了。 有人知道 wolfram alpha 是如何构建的吗?也许这会有所帮助? :) 如果你需要一个迷你 matlab,也许 wxMaxima 对你来说是一个很好的基础......正如我在回答中所说的那样。 关于“托管 .Net 插件”:就我所见的此类解决方案而言,您必须使用 COM 与它们对话。但是你需要visual studio来编写外观。恕我直言,有点过大。最好使用嵌入在您的应用程序中的脚本引擎,例如 python 和 Delphi 编写的 IDE。 【参考方案1】:我们一直在非常成功地使用 Microsoft 脚本自动化(主动脚本)。基本上你必须实现一个将运行脚本的主机。脚本可以用当前机器上安装的任何语言编写。我们为我们的脚本使用 javascript,但您不限于此。那里有很多脚本实现(甚至是python)。
从您的角度来看,您必须为脚本运行提供一个框架。这并不简单,但只要对 COM 有基本的了解,这也不难。 Delphi 有一些实现。这里有一些资源:http://www.torry.net/pages.php?id=280,但您可以在整个网络上找到资源。
祝你好运!
【讨论】:
感谢您的回答。我想我一直希望有比 MS 脚本更复杂或更紧密集成的东西——我们实际上已经支持我们软件的外部自动化。我不确定它是否真的适合(尤其是默认语言,JScript 和 VBScript)使用我们的内部类,传递大量数据(它们是后期绑定的,不是吗?)等等。谢谢,我会调查的!【参考方案2】:根据您的需要,这里有一些指导方针:
区分语言和库 - 您可以使用数学语言(如 MATLAB)或从高级语言(如 Python)调用的数学库; 语言(或库)应该由数学家为数学家设计; 使用的语言应该是现有的(不要重新发明***); 您应该能够与现有软件共享脚本内容; 您不应该从头开始这么大的复杂项目(数学脚本)。所以我猜它可能会减少候选名单:
JavaScript 并非为此类用途而设计(未使用); Delphi 脚本(DWS 或 PascalScript)主要用于自动化,而不是计算(并且未广泛使用); 我不知道您为什么要在客户应用程序中使用 Delphi IDE,但您不应该将 Delphi IDE 用于此类专有开发:原始的自定义 IDE 将比完整的 RAD 更有效率; Lua 或许应该考虑一下:您可以使用此脚本引擎制作任何您想要的东西 - 但与 Python 不同的是,使用 Lua 的数学家社区并不庞大...在开源世界中,您可以找到很多非常有趣的解决方案。见http://blog.interlinked.org/science/open_source_math_programs.html
我想Octave 可以考虑。它简单、强大、成熟、广为人知、被很多软件使用,并且是跨平台的。
据我所知,您 can call Octave library 来自 C/C++ 代码。在翻译相关的 .h 文件后,可以从 Delphi 恕我直言完成。
但请注意 GPL 许可。如果您的软件是专有的,则不可能将 Octave 作为您软件的一部分进行分发。但是您可以从您的软件if you make a clear distinction between your software and the GPL software 中调用 Octave 库或任何其他 GPL 内容(如 Python)。
Embedding Python 可能是一个很好的解决方案。这种语言可以从Delphi中调用,你应该有一个很好的架构,而不需要直接调用一些像Octave这样的C库。 Python 可能是您从 Delphi 应用程序访问所有其他计算库的主要途径。例如,可以从一些 Python 库中调用 Octave。您还可以使用 Python 脚本来自动化您自己的应用程序。你周围有一些Python IDE in Delphi。当然,每个组件的开源许可证都是安全的。越想越喜欢后一种方案……
只有我的两分钱。 :)
【讨论】:
谢谢@A。布切兹!听起来 Python 不错。你有任何使用它的经验,或者将类绑定到它等等吗?是否存在任何开源许可问题?调试它有多容易,所以我们可以给用户一个原始的开发环境?关于 Delphi IDE,与我们的软件成本相比,它的成本很小,所以如果他们想开发我们可以说“使用这个 IDE”,提供一个插件模板,他们就会得到功能齐全的东西。 几年前我确实使用过它,它按预期工作,但我绝对不是这里的专家 - SO中有几个相关的问题。关于许可证,请联系您的公司律师:这里没有“个人猜测”的地方。关于 IDE,请参阅code.google.com/p/pyscripter(在 MIT 许可下发布)。恕我直言,出于您的目的,使用 Delphi IDE 过于庞大。 'Lua',而不是'LUA'。 :-) lua.org/about.html Octave website 提到该项目是根据 GPL(如您的回答)而不是 LGPL 许可的。就 GPL 而言,与 LGPL 不同,链接算作修改。因此,除非 Octave 做出明确的例外,否则链接到它会对您的软件的许可证提出要求。 @Luc 您可以使用来自专有程序的 GPL 程序,只要用户清楚地说明并理解它。见gnu.org/licenses/gpl-faq.html#GPLInProprietarySystem所以所有与python相关的东西都可以从你的软件中调用,但不是你软件的一部分。就像您在 Linux 下运行专有软件一样。【参考方案3】:没有明确的答案,但有一些其他建议:-
查看 LMD Innovative ScriptPack,它支持本地 Pascal 脚本和基于 ActiveScripting 的语言。警告:我使用了很多 LMD 工具和组件,但我没有亲自使用过 Scriptpack。
LMD 也有 IDE-Tools package,如果您需要走这条路,它可以真正简化制作简单的自定义“RAD”工具的任务
又一票投给 Lua。我在 C++Builder2010 应用程序中使用 Lua 作为脚本语言,它运行良好。您可以利用 C++Builder/Delphi RTTI 来帮助 Lua 脚本和 C++ 代码之间的集成。回复。 Lua:我们有一个产品,多年来一直在其中包含一个超简单的“自制”脚本系统。没有循环、条件或过程 - 只是一系列参数化命令。我们想把它扩展到更强大的东西,选择第三方解决方案似乎比重新发明***要少得多。为此选择 Lua 的主要原因是:-
快速 已出版的书籍可用 (Programming in Lua) 用 C 编写 可通过静态链接直接嵌入到我们的项目中 MIT 许可证 C++ 代码可以调用 Lua 代码并访问 Lua 变量 Lua 代码可以调用 C++ 函数 部署占用空间小。 Lua 和它的标准库在压缩之前添加到我们的 .EXE 中,大小不到 200K。我确信其他语言也可以同样出色,但正是 Lua 的“轻量级”特性让我受益匪浅。
【讨论】:
谢谢@Roddy。完全原生的编译脚本语言听起来不错!他们的 IDE 工具看起来也很有用。我对 Lua 了解不多:是什么语言让你推荐它? @David M:更新答案:-)【参考方案4】:我喜欢那里的许多答案,而且,我是一个有偏见的 Delphi 书呆子 :) 但我建议您使用组合:RO Pascal Script+ ESBPCS for VCL。
我不知道这听起来是否像你 - 但我会试一试。
我从网站上提取了this link 关于库的矩阵非可视部分。 还有更多,您可能想尝试一下!
【讨论】:
嗨@Andrea - 感谢您的回答。我认为 ESBPCS 的目标可能是比我们的小得多的矩阵……也可能是对“矩阵”一词的使用略有不同。我们基本上指的是大型网格(如果它在 Excel 中)或数字表,而不是用于转换的矩阵或“标准”矩阵数学。 嗨大卫,我不知道你的确切要求是什么......可能最好的方法是问他们:)【参考方案5】:我建议使用 Lua。它是最常用的脚本语言之一,有很多工具,例如调试器、带有语法高亮显示的编辑器等,很多人都使用过它,它是最快的脚本语言之一,您可以轻松插入到 ac/ c++引擎。将 C 函数扩展到其中非常容易(特别是如果您使用的是 LuaJIT 和 FFI)。在 lua 中没有真正好的多线程方法,但是您可以轻松地在单独的线程中运行多个 lua 实例,以便运行多个脚本。
【讨论】:
嗨@Simon!感谢您的回答 - 并且还专门解决了多线程问题:) 其他答案之一也推荐了 Lua。我对此了解不多:如果您不习惯编程,是否容易读/写?你可以创建/使用类吗?你说你可以在其中扩展 C 函数,但是暴露一个 C++ 类来提供一个 OO 接口有多容易? 无论您选择哪种脚本语言,您都可以使用SWIG 向它公开C++ 类。 (SWIG 支持 Python、TCL.Lua 等) @David M:Lua 很容易使用。我不会说编程语言在语法上很困难,所以学习它可能会很简单。你可以使用类,有一些包装器可以帮助你(检查 lua.org,他们在描述这类事情方面比我好得多)......虽然我个人更喜欢通过 c 将事情暴露给 lua - 类似的界面。 (或通过 FFI - luajit.org/ext_ffi.html)。 @Nemo,感谢 SWIG 的建议 - 对我来说也很有趣!【参考方案6】:我建议您研究一下基于 wx (C++) 的 GUI 包装器,它围绕名为 Maxima 的经典开源数学程序,在 Windows 上称为 wxMaxima。但是,它是 GPL 许可的,而不是 LGPL,因此衍生作品也必须是开源的。
您应该能够使用这个应用程序及其代数引擎,也许您可以围绕 MACSYMA/MAXIMA (LISP) 引擎为这个 C++ UI 编写自己的 Delphi 包装器。他们系统的源代码包括一些你可能想要包装并作为服务提供的东西:
一种将数学方程式编码为显示格式的方法,从用户输入的格式开始,该格式定义良好,然后可以记录在案。
一个简单的“语言”规范,您可以使用它来构建您的“所见即所得方程”工具。
Maxima 可以处理绘图、矩阵、线性代数和基本计算,而且引擎很扎实。
由于您已经在 C++ 中做了很多事情,我会考虑使用 wxWidgets 来完成您的整个应用程序,并以 wxMaxima 为基础。我不确定您是否可以在 C++Builder 中进行 wx + VCL 混合,但您当然应该尝试一下。如果你不能,那么我会说用 wxWidgets 在 VC++ 中制作主应用程序,并在 Delphi 中为它制作插件(作为 DLL)。
【讨论】:
P:有趣的答案,谢谢!我以前没有遇到过这个。它绘制图形等的能力也可能很有用。 (顺便说一句,在 wxWidgets 中编写整个应用程序可能有利于未来的跨平台兼容性,但是......该应用程序有一个 15 年的代码库,数十万行代码,并且在 VCL 中根深蒂固。也许我们的下一个版本:p) 你确定它有一个“基于 C++ 的引擎”吗?***认为它是written in Common Lisp。 感谢您的更正-更新了我的答案以更清楚地表明 wxMAXIMA 表示 C++ 中的 GUI/UI 层,但底层 MAXIMA/MACSYMA 引擎是 LISP。我没有注意到 LISP 部分!【参考方案7】:因为你需要一种以数学为目标的脚本语言,我建议你看看Common Lisp。它是 LISP 的一种方言,最初是作为计算机程序的传统数学符号开发的。 Maxima 和 Axiom 等计算机代数系统是用 Common Lisp 编写的。最著名的 Common List 实现是ECL,它是在 LGPL 许可下发布的。当然还有很多其他的开源实现。
还有 GNU Guile 用于 Scheme 编程语言(Lisp 方言)的解释器。他们的网站声明
Guile 是一个高效的虚拟机,它执行由其优化编译器生成的可移植指令集,并且非常容易与 C 和 C++ 应用程序代码集成。除了 Scheme,Guile 还包括 ECMAScript 和 Emacs Lisp 的编译器前端(对 Lua 的支持正在进行中)...
但是,我自己从未使用过这个库,所以我不能保证将它嵌入到您的应用程序中会有多容易。
【讨论】:
我什至没有想到 Lisp!有趣的是,另一个回复也提到了 Maxima……我们并不像一门完整的语言那样追求计算机代数,但 Lisp 是一种有趣的可能性。不过,我们确实需要一些可以包含在商业(非操作系统)软件中的东西。不过,谢谢你的回复,我会调查的! @David,根据 LGPL 的条款,您可以在商业产品中使用该库!这就是为什么 ECL 是一个不错的选择。【参考方案8】:我的想法:
通过其 API(C、Java、C#)调用 Mathematica,但恐怕这对您来说太慢了 http://reference.wolfram.com/mathematica/guide/MathLinkAPI.html
使用 http://fsharppowerpack.codeplex.com/ 及其 fslex、fsyacc 生成 F#。 另见:How can evaluate an expression stored as a string in F#, Tim Robinson building a LISP compiler in F#
【讨论】:
有趣。我认为您对 Mathematica 的速度是正确的,但是能够生成这样的 F# 代码真是太酷了! 如果您在 F# 中构建 LISP 编译器,则可以通过它运行 MACSYMA/MAXIMA lisp 引擎,并最终得到一个 F# 代数/数学引擎。【参考方案9】:使用 Python,您可以“免费”获得 NumPy 和 SciPy。是的,有 GIL,但它仅在您的 Python 解释器运行多个线程时才有效。我相信您可以毫无问题地在单独的线程中运行多个 Python 主机(没有尝试过,认为)。
还有multiprocessing之类的东西。
Python 3 仍在流行,NumPy 在 1.5.0 版开始支持 Python 3,SciPy started support in version 0.9.0。此外,GIL 仍与 Python 3 一起使用,尽管它已被重做,所以它应该会更好。还有 NumPy releases 操作期间的锁。
【讨论】:
NumPy 和 SciPy 看起来非常有用。这正是我希望找到的那种库——你应该有不止一个我能给你的支持:) 我认为多个 Python 主机在不同的线程中可能是避免 GIL 的方法。 Checkout 还 matplotlib,SciPy 推荐的绘图库:matplotlib.sourceforge.net【参考方案10】:您提到您的观众可能已经习惯了 R。您应该考虑将您的产品与 R 集成,无论是作为 R 扩展还是从您的产品中调用 R。见Writing R Extensions。这样您就可以利用 R 的强大功能以及您的用户对 R 的熟悉程度。
【讨论】:
R 可能会非常方便。我没有太多使用它,也不知道它处理大量数据的速度。不幸的是,它是 GPL,我认为这意味着我们无法链接到它(就像使用 LGPL 一样?)【参考方案11】:python 上的GIL 不应该是一个大人物,因为它的存在并不意味着您的应用程序不能执行多线程。确实,您不能使用系统上所有可用的 CPU 内核,但同样,这只会影响您的大部分代码是用 python 编写的。您的应用程序将托管 python 代码,对吗?并且这些脚本将集中调用主机应用程序中可用的数学例程。这意味着仍有许多方法可以在您的应用程序中释放并保留 GIL,以尽量减少其副作用,您会没事的。
【讨论】:
如果我理解正确,你的意思是 GIL 只在执行 Python 代码时被持有,在执行 C 库或回调代码时被释放? 正确,您可以在本地代码(在 C 或 Delphi 中)执行任务之前和之后释放并保留 GIL。【参考方案12】:没有人提到PaxCompiler 可以将 Pascal、Javascript 和 Basic 编译为本机代码,并且可以轻松设置以访问 Delphi 项目中的对象。它有很多优点:
-
编译后的代码比解释的代码运行得更快
它提供了 3 种不同的编程语言,因此几乎所有开发人员都能有宾至如归的感觉
作为 Delphi 开发人员,您可以访问源代码并且它与您的项目紧密集成
价格很有意思
一个受欢迎的项目的缺点和挑战是:
-
确保平等对待这 3 种语言:根据我的测试,感觉 JavaScript 在捆绑示例方面落后
如果您选择捆绑所有 3 种编程语言,您可能希望以所有语言提供几乎所有示例,并且您必须能够轻松地支持所有这三种语言
【讨论】:
谢谢,@约翰!我不确定 Javascript 或 VBScript 是否适合数学/特殊编程,所以我很乐意将它们扔掉,只支持 Pascal。你有使用它的经验吗? FAQ worries me,它看起来缺少一些功能(例如,手动绑定到重载的虚函数需要大量的繁琐。) 我不确定我是否掌握一种语言需要什么才能非常适合数学/科学编程,以及在这一点上 Pascal 与 JS 或 VB 的区别,但这是你的决定。关于 PaxCompiler,我的建议是尝试一下,因为它真的很好。虽然我和你一样,我对网站/支持感到害怕,但是当我通过电子邮件联系他们时,我收到了快速而好的答案。我目前正在开发一个基于它的应用程序,到目前为止,没有问题:使用最新版本的 Delphi,您可以通过 RTTI 使用几行代码从脚本访问整个对象。以上是关于对于高度依赖数学的用户编码的脚本或插件语言的建议? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
sh 在jenkins脱机时安装一个或多个jenkins插件(包括依赖项)的脚本