【发布时间】:2011-03-14 12:12:07
【问题描述】:
这里有人有将 Common Lisp 作为嵌入式语言(使用 ECL)的经验吗?如果是这样,ECL 与 Lua 相比有多好?
【问题讨论】:
标签: lua common-lisp embedded-language
这里有人有将 Common Lisp 作为嵌入式语言(使用 ECL)的经验吗?如果是这样,ECL 与 Lua 相比有多好?
【问题讨论】:
标签: lua common-lisp embedded-language
我之前没有嵌入 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 很糟糕。当您具有纯命令式函数式编程风格时,它运行良好,但如果您尝试具有大型层次结构的 OO,例如永远不要尝试将 GTK 等典型的 GUI 工具包包装在 Lua 层次结构中,性能将非常糟糕。
我仍然使用 Lua,因为它非常轻量级,可以同时运行数十个解释器,并且最终用户可以理解使用它编写代码 sn-ps,而 Lisp/Scheme 只有专家(缺乏)语法。
我现在要补充一点,mruby 3.0 已经发布,并且是一种很好的嵌入语言。不幸的是,与此同时,每个人都只使用 Javascript 和 Javascript。
【讨论】: