我目前正在开发一款交易产品的组件,允许量化分析师或策略开发者编写自己的定制化策略。显然,我不能让他们使用本地编译语言(甚至是编译成字节码在虚拟机上运行的语言),因为他们的开发/测试周期必须在几分钟内完成。
到目前为止,我已经尝试了lua、python、ruby,并且非常喜欢它们,但仍然觉得这些语言对于我的目标用户来说有点“低级”。那么,我需要编写自己的解析器和解释器来支持一种最基本的循环、简单算术和逻辑表达式求值的语言吗?还是你们中的其他人有其他建议?感谢您的帮助。
我目前正在开发一款交易产品的组件,允许量化分析师或策略开发者编写自己的定制化策略。显然,我不能让他们使用本地编译语言(甚至是编译成字节码在虚拟机上运行的语言),因为他们的开发/测试周期必须在几分钟内完成。
到目前为止,我已经尝试了lua、python、ruby,并且非常喜欢它们,但仍然觉得这些语言对于我的目标用户来说有点“低级”。那么,我需要编写自己的解析器和解释器来支持一种最基本的循环、简单算术和逻辑表达式求值的语言吗?还是你们中的其他人有其他建议?感谢您的帮助。
Perl的Text::Template模块的作者Mark-Jason Dominus,提供了一些相关见解:
当人们制作类似于这个模板模块时,他们几乎总是会首先发明一种专门的语法来进行替换。例如,他们构建它,使得像%%VAR%%这样的字符串将被$VAR的值替换掉。然后他们意识到需要额外的格式化,于是他们加入了一些用于格式化的特殊语法。然后他们需要循环,于是他们发明了一个循环语法。很快,他们就有了一个新的小型模板语言。
这种方法有两个问题:首先,他们的小语言是残缺的。如果您需要做一些作者没有想到的事情,那么您就会失败。第二个问题:谁想学另一种语言呢?
如果你编写自己的小语言,你可能会陷入相同的困境——维护一个由设计上存在缺陷的工具的语法和解析器。
如果真正的编程语言看起来有点过于底层,那么解决方案不是放弃该语言,而是为你的最终用户提供更高级别的实用函数,这样他们可以使用熟悉的概念操作,而不会陷入底层语言的细节。
这允许初学者在高水平上操作;然而,您和任何具备此能力的最终用户——即超级用户——仍然可以利用Ruby或Python等完整的功能。
我一直在开发一个Python算法交易库(实际上是用于回测,而不是真正的交易)。你可能想要看一下它:http://gbeced.github.com/pyalgotrade/
你的目标是类似于Processing的复杂度水平吗? Processing是一个很好的例子,它将完整的语言(Java)简化为仅适用于问题域(在Processing的情况下是可视化问题域)的子集。
这里是来自Processing文档的一个小小的并排比较。
Java:
g.setColor(Color.black)
fillRect(0, 0, size.width, size.height);
处理中:
background(0);
这可能有点简单化,但很多量化用户习惯于使用Excel和VBA宏。像VBScript这样的东西是否可用,因为他们可能在这个领域有一些经验。
现有的编程语言对我的目标用户来说有点“低级”。
然而,你只需要“最基本的循环支持、简单算术、逻辑表达式求值”。
我不明白问题出在哪里。你只需要几个功能。你提供的语言列表有什么问题吗?它们实际上提供了这些功能?
是什么导致了这种脱节?请随时更新您的问题以扩展问题所在。
首先定义语言 -- 如果可能的话,使用名为EBN的伪语言,它非常简单(参见维基百科条目)。
然后选择语言。几乎可以肯定地说,您会想使用DSL。在我看来,Ruby和Lua都非常擅长这方面。
一旦开始工作,您可能会发现需要回到定义中进行调整。但我认为这是正确的做事顺序。