当前选择: lua-jit。令人印象深刻的基准测试,我已经习惯了这种语法。编写高性能 ABI 需要仔细考虑我将如何构建我的 C++。
其他感兴趣的问题
- Gambit-C 和 Guile 作为可嵌入语言
- Lua 性能提示(可以选择使用禁用的收集器运行,并在处理运行结束时调用收集器始终是一个选项)。
背景
我正在开发一个实时大容量(复杂)事件处理系统。我有一个 DSL,它在源头表示事件结构的模式、存储格式、某些特定于域的构造、触发内部事件(以构建和驱动通用处理),以及对总是发生的某些处理步骤进行编码。
DSL 看起来与 SQL 非常相似,事实上我正在使用 berkeley db(通过 sqlite3 接口)来长期存储事件。这里重要的部分是事件的处理是基于集合完成的,比如 SQL。然而,我得出的结论是,我不应该向 DSL 添加通用处理逻辑,而是嵌入 lua 或 lisp 来处理这个问题。
处理核心是围绕 boost::asio 构建的,它是多线程的,rpc 是通过协议缓冲区完成的,事件使用协议缓冲区 IO 库进行编码——即,事件不是使用协议缓冲区对象构造的,它们只是使用相同的编码/解码库。我将创建一个包含行的数据集对象,这与数据库引擎在内存集中的存储方式非常相似。DSL 中的处理步骤将首先得到处理,然后提交给通用处理逻辑。
无论我使用什么可嵌入脚本环境,我的处理核心中的每个线程都可能需要它自己的嵌入式语言环境(如果你正在做多线程工作,lua 至少需要它)。
问题
目前的选择是在 lisp ECL 和 lua 之间。请记住,性能和吞吐量是一项强大的要求,这意味着非常需要最小化内存分配:
如果你处于我的位置,你会选择哪种语言?
有没有我应该考虑的替代方案(不要建议没有可嵌入实现的语言)。也许是 Javascript v8?
lisp 是否更适合域?我不认为 lua 和 lisp 在它们提供的方面有什么不同。叫我出来 :D
我应该考虑其他任何属性(如下面的属性)吗?
我断言任何形式的嵌入式数据库 IO(请参阅下面的示例 DSL 了解上下文)都会使脚本语言调用相形见绌,而且选择其中任何一种都不会给整体吞吐量增加太多开销。我在正确的轨道上吗?:D
所需属性
我想将我的数据集映射到一个 lisp 列表或 lua 表上,并且我想最小化冗余数据副本。例如,如果两个表具有相同的形状,则从一个数据集中将一行添加到另一个应尝试使用引用语义。
我可以保证在进行 lua/lisp 调用时,作为输入传递的数据集不会改变。如果可能,我希望 lua 和 lisp 强制不更改数据集。
在嵌入式调用结束后,数据集应该被销毁,创建的任何引用都需要替换为副本(我猜)。
DSL 示例
为了您的观看乐趣,我附上了一个 DSL,这样您就可以了解我想要实现的目标。注意:DSL 不显示通用处理。
// Derived Events : NewSession EndSession
NAMESPACE WebEvents
{
SYMBOLTABLE DomainName(TEXT) AS INT4;
SYMBOLTABLE STPageHitId(GUID) AS INT8;
SYMBOLTABLE UrlPair(TEXT hostname ,TEXT scriptname) AS INT4;
SYMBOLTABLE UserAgent(TEXT UserAgent) AS INT4;
EVENT 3:PageInput
{
//------------------------------------------------------------//
REQUIRED 1:PagehitId GUID
REQUIRED 2:Attribute TEXT;
REQUIRED 3:Value TEXT;
FABRRICATED 4:PagehitIdSymbol INT8;
//------------------------------------------------------------//
PagehitIdSymbol AS PROVIDED(INT8 ph_symbol)
OR Symbolise(PagehitId) USING STPagehitId;
}
// Derived Event : Pagehit
EVENT 2:PageHit
{
//------------------------------------------------------------//
REQUIRED 1:PageHitId GUID;
REQUIRED 2:SessionId GUID;
REQUIRED 3:DateHit DATETIME;
REQUIRED 4:Hostname TEXT;
REQUIRED 5:ScriptName TEXT;
REQUIRED 6:HttpRefererDomain TEXT;
REQUIRED 7:HttpRefererPath TEXT;
REQUIRED 8:HttpRefererQuery TEXT;
REQUIRED 9:RequestMethod TEXT; // or int4
REQUIRED 10:Https BOOL;
REQUIRED 11:Ipv4Client IPV4;
OPTIONAL 12:PageInput EVENT(PageInput)[];
FABRRICATED 13:PagehitIdSymbol INT8;
//------------------------------------------------------------//
PagehitIdSymbol AS PROVIDED(INT8 ph_symbol)
OR Symbolise(PagehitId) USING STPagehitId;
FIRE INTERNAL EVENT PageInput PROVIDE(PageHitIdSymbol);
}
EVENT 1:SessionGeneration
{
//------------------------------------------------------------//
REQUIRED 1:BinarySessionId GUID;
REQUIRED 2:Domain STRING;
REQUIRED 3:MachineId GUID;
REQUIRED 4:DateCreated DATETIME;
REQUIRED 5:Ipv4Client IPV4;
REQUIRED 6:UserAgent STRING;
REQUIRED 7:Pagehit EVENT(pagehit);
FABRICATED 8:DomainId INT4;
FABRICATED 9:PagehitId INT8;
//-------------------------------------------------------------//
DomainId AS SYMBOLISE(domain) USING DomainName;
PagehitId AS SYMBOLISE(pagehit:PagehitId) USING STPagehitId;
FIRE INTERNAL EVENT pagehit PROVIDE (PagehitId);
}
}
该项目是博士研究项目的一个组成部分,并且是/将是免费软件。如果您有兴趣与我合作(或贡献)这个项目,请发表评论:D