gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:32:38 25 4
gpt4 key购买 nike

关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。












想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic

6年前关闭。



Improve this question




I have started a bounty for this question

...because I really want the community's input. I can (and have) looked at several languages / frameworks and think 'well, this will probably work okay' -- but I would really appreciate advice that's based specifically on the problem I face, and especially from anyone with experience integrating / using what you recommend.



我从事科学分析软件的工作。它为数据的数学变换提供了很多工具。一种工具允许用户输入他们自己的方程,该方程在数据集(大型 2D 或 3D 值矩阵)上运行并进行评估。

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

enter image description here

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

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

  • 当它更简单时它很整洁,但不再是我们的用户希望能够用它做的那种事情。如果我现在写它,我会完全不同 - 这是我的机会:)

    我想给用户一些更强大的东西,让他们编写代码 - 脚本或编译 - 可以执行更高级的操作。 我正在寻求 SO 的建议,以了解它应该使用什么技术或采取的最佳方法。

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

    重要约束:
  • 我们的数学运算在大矩阵上进行。在上面的等式中,V1 表示输入(可能是多个输入之一)并且是 2D 或 3D,并且每个维度都可以很大:数千或数十万的数量级。 (我们很少一次计算所有这些,只是切片/段。但如果答案涉及需要编码数据的东西,请注意这是一个考虑因素。)
  • 我们提供的操作允许你写,比如 2 x V ,它将 V 中的每个元素乘以 2。结果是另一个相同大小的矩阵。换句话说,包含标准数学原语的脚本或编程语言是不够的:我们需要能够控制哪些原语可用,或者它们是如何实现的。

    这些操作可能是复杂的:所述输入可以是简单的数字(2,5.3,PI)或复杂如1,2或3维矩阵,其中包含数值 bool 复杂(配对值)数据。我目前的想法是一种足够强大的语言,我们可以将数据类型公开为类并可以实现标准运算符。一个简单的评估器是不够的。
  • 我希望用户能够:提供不同大小的输出,而不是像目前一​​样(可以通过表达式评估器轻松实现)编写对一个或多个输入进行迭代评估以提供输出的操作输入;调用其他函数;等等。对于宿主程序,能够询问用户的代码需要输入的哪部分或哪一部分来评估一个或部分输出将是有用的。我认为 暴露了我们类的某些部分并使用 OO 语言 可能是实现这些点的最佳方法。
  • 我们的听众主要是研究科学家,他们要么不习惯编码,要么可能习惯使用 Matlab 或 R 等语言。
  • 我们使用Embarcadero C++ Builder 2010进行开发,少量Delphi。这可能会限制我们可以使用的内容 - 仅仅因为某些东西是 C++,并不意味着如果它只针对 VC++ 或 GCC 进行编码,它就可以工作。它还必须适合与商业软件一起使用。
  • 我们的软件目前有一个 COM 接口(interface),部分应用程序可以自动化,我们的应用程序是进程外 COM 服务器。如果需要,我们可以将 COM 接口(interface)添加到一些内部对象,或者专门为此创建第二个 COM 框架。
  • 包括这个在内的“工具”正在迁移到多线程框架。最终解决方案需要能够在任何线程 中执行 它的多个实例同时在多个线程中执行 这可能会影响托管语言运行时 - 例如,Python 2.x 具有全局锁。
  • 使用带有用于数学或科学用途的库的语言会很棒。
  • 与旧表达式工具的向后兼容性并不重要。这是第 2 版:干净的石板!

  • 目前的想法:
  • RemObjects Pascal ScriptDWScript 是很容易绑定(bind)到 TObject 派生类的语言。我不知道是否可以提供运算符重载。
  • 托管 .Net 运行时,并加载基于 C#(比如说)的 DLL 作为插件。我更喜欢这个想法:我已经看到在主机程序提供语法高亮、调试等的情况下完成的。不过,我认为这是大量的编码。它也可以使用 IronPython 和 F#。
  • RemObjects Hydra 看起来是实现这一目标的有趣方式。不幸的是,它为 Delphi 而不是 C++ Builder 做广告;我正在研究兼容性。
  • 托管类似 Python, which is doable from RAD Studio
  • 的东西
  • 提供 BPL 接口(interface),如果用户购买 RAD Studio 的拷贝,则允许用户直接针对我们的程序进行编码(即,提供插件接口(interface),并通过接口(interface)公开类;可能需要使用我们 IDE 的二进制兼容版本编译插件) )
  • ...

  • 感谢您的输入!我很欣赏所有的答案,即使它们不是很完美——我可以研究,我只是在寻找关于去哪里的指示,以及关于如何处理它或可能会发生什么的意见(请,答案中包含理由的意见:p)适用。每个答案,无论多短,都会受到赞赏。但是如果你推荐一些详细的东西而不仅仅是“使用语言 X”,我会对阅读它非常感兴趣:)

    干杯,

    大卫

    更新:

    到目前为止,已推荐以下内容:
  • Python:2.6 有一个全局锁,这听起来像一个游戏杀手。 3(显然)还没有得到有用库的广泛支持。在我看来(而且我知道我是 Python 社区的局外人)好像它有点碎片化 - 使用它真的安全吗?
  • Lua:似乎不是直接面向对象,而是 provides "meta-mechanisms for implementing features, instead of providing a host of features directly in the language" 。从程序员的角度来看,这听起来很酷,但这并不是针对想要玩酷东西的程序员。我不确定它对目标受众的效果如何 - 我认为一种提供更多内置基础的语言会更好。
  • MS 脚本/ActiveScript。我们已经提供了一个外部 COM 接口(interface),我们的用户使用它来自动化我们的软件,通常是 VBScript。但是,我想要一种比 VBS 更强大(坦率地说,设计得更好)的语言,而且我认为 JScript 也不适合。我也不确定在 COM 上编码数据可能存在哪些问题——我们有很多数据,通常是非常具体的类型,所以速度和保持这些类型很重要。
  • Lisp:我什至没想过这种语言,但我知道它有很多粉丝。
  • 托管 .Net 插件:没有人提到。这不是一个好主意吗?你会得到 C#、F#、Python……它是否有与 COM 相同的编码问题? (托管 CLR 是否通过 COM 工作?)

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

    最佳答案

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

  • 区分语言和库——你可以使用数学语言(如 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 。当然,每个组件的开源许可证都是安全的。我想得越多,我就越喜欢后一种解决方案......

    只有我的两分钱。 :)

    关于c++ - 对高度依赖数学的用户编码的脚本或插件语言的建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6197938/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com