【问题标题】:Embedded language: Lua vs Common Lisp (ECL) [closed]嵌入式语言:Lua vs Common Lisp(ECL)[关闭]
【发布时间】:2011-03-14 12:12:07
【问题描述】:

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

【问题讨论】:

    标签: lua common-lisp embedded-language


    【解决方案1】:

    我之前没有嵌入 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 很强大,但我只是觉得它太大了,无法嵌入。

    【讨论】:

    • 不,这是错误的。 Lua API 只有在你只用它做过基本事情的情况下才会很棒。基于堆栈的界面很简单,但您必须手动记住堆栈上每个位置的内容并自己计算索引。此外,OO 很糟糕——继承的实现很差,没有构造函数/析构函数等等。注册 UDT 也非常糟糕。我希望你什么都不想要,只需要一个 POD。我从未使用过任何替代品,它可能是最好的。但我个人的经验是,这种语言不好或不好用。
    • 我之前写过一个开罗的绑定,一点也不难。只需使用 userdata 类型,设置 __gc 进行销毁,并调用适当的 luaL_check* 函数来验证参数类型(必须为您自己的 c 类型编写它)。但我同意它更基础和更低级别,如果有人想要更多,他们只需要扩展 Lua。无论如何,我觉得它是一种非常不错的语言,有很多有趣的特性,而且比大多数其他语言更容易使用。
    • @DeadMG:我无法评论 API,因为我没有使用过它。我相信 Lua 的 OO 并不“糟糕”;它只是默认情况下不提供,因为这不是语言的目标。但是如果你需要的话,有很多很好的库可以提供 OO 环境。为此我推荐 ObjectLua:github.com/sroccaserra/object-lua
    • @DeadMG:你错了,使用构造函数和析构函数可以无缝继承用户数据。您显然被误导了,因为 Lua 是最容易实现的语言之一,即使不是最简单的(而且我编写了一个几乎完全由 Lua C API 调用组成的庞大函数,所以我知道跟踪堆栈有多麻烦.)
    • 是的,@DeadMG,你说这个答案是“错误的”,因为你碰巧有不同的意见。也许你不喜欢 Lua API,但它受到很多人的好评,就像 Lua 作为一门语言一样。
    【解决方案2】:

    我只能同意 Lua 很糟糕。当您具有纯命令式函数式编程风格时,它运行良好,但如果您尝试具有大型层次结构的 OO,例如永远不要尝试将 GTK 等典型的 GUI 工具包包装在 Lua 层次结构中,性能将非常糟糕。

    我仍然使用 Lua,因为它非常轻量级,可以同时运行数十个解释器,并且最终用户可以理解使用它编写代码 sn-ps,而 Lisp/Scheme 只有专家(缺乏)语法。

    我现在要补充一点,mruby 3.0 已经发布,并且是一种很好的嵌入语言。不幸的是,与此同时,每个人都只使用 Javascript 和 Javascript。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-18
      • 2010-09-18
      • 2011-02-12
      • 2011-07-25
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多