gpt4 book ai didi

c++ - Lua与Embedded Lisp以及其他潜在候选人。用于基于集合的数据处理

转载 作者:IT老高 更新时间:2023-10-28 12:43:17 27 4
gpt4 key购买 nike

当前选择: lua-jit。令人印象深刻的基准测试,我已经习惯了语法。编写高性能的ABI将需要仔细考虑如何构造C++。

其他有趣的问题

  • Gambit-C and Guile as embeddable languages
  • Lua Performance Tips(可以选择使用禁用的收集器来运行,并且在处理运行结束时调用收集器始终是一个选项)。

  • 背景

    我正在开发实时大量(复杂)事件处理系统。我有一个DSL,它代表源处事件结构的架构,存储格式,特定于域的构造,激发内部事件(以构造和驱动通用处理)以及对始终发生的某些处理步骤进行编码。

    DSL看起来很像SQL,实际上我正在使用berkeley db(通过sqlite3接口(interface))来长期存储事件。这里的重要部分是事件的处理是基于集合的,例如SQL。但是我得出的结论是,我不应该在DSL上添加通用处理逻辑,而应该嵌入lua或lisp来解决这一问题。

    处理核心是围绕boost::asio构建的,它是多线程的,rpc是通过 Protocol Buffer 完成的,事件是使用 Protocol Buffer IO库编码的-即,事件不是使用 Protocol Buffer 对象来构造的,它们只是使用相同的编码/解码库。我将创建一个包含行的数据集对象,这与数据库引擎在内存集中存储的方式非常相似。 DSL中的处理步骤将首先处理,然后提供给通用处理逻辑。

    无论我使用哪种嵌入式脚本环境,处理核心中的每个线程可能都需要它自己的嵌入式语言环境(这就是lua至少在进行多线程工作时要求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

    最佳答案

    我非常同意@jpjacobs的观点。 Lua是嵌入的绝佳选择,除非您需要有关lisp的一些非常具体的信息(例如,如果您的数据映射到cons单元格特别好)。

    我已经使用lisp很多年了,顺便说一句,我非常喜欢lisp语法,但是这些天我通常会选择Lua。尽管我喜欢lisp语言,但我还没有找到一种Lisp实现,它可以像Lua那样捕获嵌入式功能的特性/小巧/可用性之间的完美平衡。

    Lua:

  • 很小,包括源代码和二进制代码,比许多其他流行语言(Python等)小一个数量级或更小。由于Lua源代码是如此的小巧和简单,因此,如果要避免添加外部依赖项,则在源代码树中仅包含整个Lua实现是完全合理的。
  • 非常快。 Lua解释器比大多数脚本语言要快得多(同样,数量级并不罕见),并且LuaJIT2是用于某些流行CPU架构(x86,arm,mips,ppc)的非常好的JIT编译器。使用LuaJIT通常可以将处理速度提高另一个数量级,并且在许多情况下,结果接近C的速度。LuaJIT还是标准Lua 5.1的“直接替代”:不需要更改应用程序或用户代码即可用它。
  • LPEG。 LPEG是Lua的“解析表达语法”库,它允许非常轻松,强大和快速的解析,适合于大小任务。它是yacc/lex/hairy-regexps的理想替代品。 [我使用LPEG和LuaJIT编写了一个解析器,它比我尝试模拟的yacc/lex解析器要快得多,并且非常容易直接创建。] LPEG是Lua的附加软件包,但是很好-值得获取(这是一个源文件)。
  • 具有出色的C接口(interface),这使从C调用Lua或从Lua调用C成为一种乐趣。对于大型/复杂C++库的接口(interface),可以使用SWIG,也可以使用多种接口(interface)生成器中的任何一种(当然,也可以只使用Lua的简单C接口(interface)和C++)。
  • 具有自由许可(“类似于BSD”),这意味着Lua可以根据需要嵌入到专有项目中,并且与FOSS项目兼容GPL。
  • 非常非常优雅。它不是轻浮的,因为它不是基于cons-cells的,但是它显示了来自诸如scheme之类的语言的清晰影响,其语法简单明了。像方案(至少在更早的版本中)一样,它倾向于“最小化”,但是在平衡可用性和可用性方面做得很好。对于有轻快背景的人(例如我!),尽管有很多区别,但对Lua的许多了解似乎是很熟悉的,并且“很有意义”。
  • 非常灵活,并且诸如元表之类的功能允许轻松集成特定于域的类型和操作。
  • 具有简单,引人入胜且易于使用的语法。对于现有的Lisp用户而言,这可能不是Lisp的优势,但是如果您打算让最终用户编写脚本,则可能是有意义的。
  • 专为嵌入而设计,除了体积小,速度快外,还具有各种功能,例如增量GC,可以在这种情况下使用脚本语言。
  • 历史悠久,有责任心和专业的开发人员,他们在过去20年中如何发展语言方面表现出了良好的判断力。
  • 具有活跃而友好的用户社区。
  • 关于c++ - Lua与Embedded Lisp以及其他潜在候选人。用于基于集合的数据处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7919763/

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