我已为这个问题发起了悬赏
......因为我真的希望社区可以提供意见。我可以(也确实)查看几种语言/框架,并认为“嗯,这可能可以正常工作”——但我真的很感激基于我面临的问题的建议,特别是来自任何具有集成/使用您推荐内容经验的人。
我从事科学分析软件的开发。它提供了许多用于数据数学转换的工具。其中一个工具允许用户输入自己的方程式,该方程式在数据集(一个大的二维或三维值矩阵)上运行并进行评估。
这个工具有一个图形化的方程式编辑器,内部构建了一个面向对象的表达式树,每个操作都有不同的对象(例如,Logarithm类的实例是树中计算值基数对数的节点;它有两个子节点作为输入)。以下是其中一部分的屏幕截图: 您可以在左侧看到它正在构建的树,右侧菜单中有许多(50个?)潜在操作。
这有一些缺点:
- 对于复杂方程,图形编辑器变得笨拙。 - 有一些难以用图形表示的操作,例如创建大矩阵(例如n x n卷积的内核)。 - 它只允许方程式:没有分支或其他逻辑。
当它更简单时,它很整洁,但对于我们的用户想要使用它进行的操作来说不再如此。如果我现在写它,我会用完全不同的方式 - 这是我的机会 :)
我想为用户提供更强大的东西,并让他们编写可以执行更高级操作的代码 - 脚本或编译代码。 我正在寻求SO关于应该使用哪种技术或采取何种方法的建议。
这个问题的其余部分相当长 - 很抱歉。我尝试详细描述问题。先感谢您阅读 :)
重要约束条件:
我们的数学运算是在大矩阵上进行的。在上述方程中,V1代表输入(可能有多个),是2D或3D的,每个维度都可以很大:在数千或数十万的数量级上。(我们很少一次计算所有内容,只是切片/段。但如果答案涉及需要编排数据的内容,请注意大小和速度是要考虑的因素。)
我们提供的操作允许您编写,例如,
2 x V
,它将V
中的每个元素乘以2。结果是另一个相同大小的矩阵。换句话说,包括标准数学原语的脚本或编程语言是不够的:我们需要能够控制可用的原语或如何实现它们。这些操作可能很复杂:输入可以简单地是一个数字(2、5.3、pi),也可以是包含数值、布尔值或复数(成对的值)数据的1、2或3维矩阵。我目前的想法是使用强大到可以将我们的数据类型公开为类并实现标准运算符的语言。一个简单的评估器是不够的。
与其只编写在一个或多个输入上迭代计算以提供输出的操作(目前可以通过表达式评估器轻松实现),不如让用户能够:为输入提供不同大小的输出;调用其他函数等。对于主机程序,能够询问用户代码将需要哪个部分或切片的输入来评估输出的一部分或切片将非常有用。我认为公开我们的某些类并使用面向对象的语言可能是实现这些点的最佳方式。
我们的受众主要是研究科学家,他们要么不习惯编码,要么可能习惯于像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这样的东西,从RAD Studio中可行
- 提供BPL接口,并让用户直接针对我们的程序进行编码,如果他们购买了RAD Studio的副本(即提供插件接口,并通过接口公开类;可能需要使用与我们IDE版本兼容的二进制兼容插件)
- ...
干杯,
大卫
更新:
到目前为止,已经推荐了以下内容:
Python: 2.6有全局锁,这听起来像是一个游戏杀手。3(显然)还没有得到有用库的广泛支持。对我来说(我知道我是Python社区的外部人员),它似乎有点分裂 - 使用它真的安全吗?
Lua:似乎不直接面向对象,但提供了“元机制来实现功能,而不是在语言中直接提供大量功能”。从程序员的角度来看,这听起来非常酷,但它并不针对想要玩耍的程序员。考虑到目标受众,我不确定它会运作得有多好 - 我认为提供更多内置基础的语言会更好。
MS脚本/ActiveScript。我们已经提供了一个外部COM接口,我们的用户通常使用VBScript自动化我们的软件。但是,我希望有一个比VBS更强大(而且,坦率地说,设计更好)的语言,我也不认为JScript适合。我也不确定在COM上可能存在哪些数据传输问题 - 我们有很多数据,通常是非常具体的类型,因此速度和保持这些类型非常重要。
Lisp:我甚至没有考虑过这种语言,但我知道它有很多粉丝。
托管.Net插件:没有任何人提到。这不是一个好主意吗?您可以获得C#,F#,Python...是否具有与COM相同的数据传输问题?(通过COM工作的CLR托管是否有效?)