嵌入式语言:Lua vs Common Lisp(ECL)

lin*_*kit 23 lua common-lisp embedded-language

这里有人有使用Common Lisp作为嵌入式语言的经验(使用ECL)吗?如果是这样,ECL与Lua相比有多好?

Jya*_*aan 25

我之前没有嵌入过CL,但我已经用Lua和两个特定的Scheme实现(Gambit-C和GNU Guile)完成了它.

Scheme在我看来是一个很好的嵌入式语言,因为它灵活而且不会过于臃肿.Gambit-C对此特别棒,因为它允许您运行解释的脚本,并将代码编译为C.在我的测试中,Gambit-C生成的C代码只比手写C慢一点(例如,在C中运行0.030秒的特殊测试在Gambit中为0.040!).Gambit还有一个非常好的FFI(外部函数接口),它本质上只是具有特殊语法的Scheme,用于将绑定写入C库(也直接支持ObjC和C++).Gambit还有一个非常好的repl,具有一些调试功能.

Guile也很不错,它实际上比Lua运行得更快(我目前所知道的最快的解释语言 - 近年来Guile取得了很大的进步).但是由于Gambit-C可以编译成真正快速的代码,我通常不会使用Guile,除非我打算在最终版本中使用解释代码.

Lua有闭包,但是你不会像在Scheme中那样得到延续,你也不会得到宏.尽管如此,它仍然可以做一些合理的功能.它不会有一个功能齐全的对象系统(如CL中的CLOS),但它确实有表,它们可以很容易地用于实现基于类的继承和基于原型的继承.此外,Lua也很出色C API真的很高兴与之合作.它是基于堆栈的,并且设计的方式使您根本不必担心内存管理的Lua方面.API非常清晰,组织良好,并且有很多很棒的文档和示例代码.Lua无法编译,但它确实使用字节代码(总是 - 当您将代码发送到Lua VM时,它总是首先将代码编译为字节代码,然后运行它).

现在,对于Common Lisp,我认为它可能不会成为一个非常好的嵌入语言.原因就在于CL很大.通常,嵌入轻量级语言是可取的,因为它将使用提供给它的平台/库,而不是外部的东西.

所以,我认为Gambit-C,Guile或Lua都不会出错.他们都非常好.CL功能强大,但我认为它对于嵌入来说太大了.

  • @DeadMG:你错了,可以使用带有构造函数和析构函数的userdata进行无缝继承.你显然被误导了,因为Lua是最容易实现的语言之一,如果不是最容易实现的(我编写了一个几乎完全由Lua C API调用组成的大型函数,所以我知道跟踪堆栈有多毛茸茸.) (8认同)
  • 不 - 这是错的.如果你只用它做过基本的事情,Lua API才会很棒.基于堆栈的界面很简单,但您必须手动记住堆栈中每个位置的内容并自行计算指标.此外,OO是可怕的 - 继承的实现很差,没有构造函数/析构函数等等.注册UDT也非常糟糕.我希望除了POD之外你什么都不想要.我从来没有使用任何替代品,它可能是最好的.但我个人的经验是语言不好或不易使用. (6认同)
  • 是的,@ DeadMG,你是非常偏离基地,称答案是"错误的",因为你碰巧有不同的意见.也许你不喜欢Lua API,但它很有理由被许多人所认可,Lua也是一种语言. (3认同)
  • 我之前写过一个到开罗的绑定,一点也不难。只需使用 userdata 类型,设置 __gc 进行销毁,并调用适当的 luaL_check* 函数来验证参数类型(必须为您自己的类型编写它)。但我同意它有点更基础、更底层,如果有人想要更多,他们只需要扩展 Lua 即可。无论如何,我觉得它是一种非常好的语言,具有许多有趣的功能,并且比大多数其他语言更容易使用。 (2认同)
  • @DeadMG:我无法对API发表评论,因为我还没有使用它.我认为Lua的OO不是"可怕的"; 它不是默认提供的,因为那不是语言的目标.但是,如果您需要,有许多好的库可以提供OO环境.我建议使用ObjectLua:http://github.com/sroccaserra/object-lua (2认同)