【问题标题】:Ease of embedding javascript易于嵌入 javascript
【发布时间】:2011-09-14 03:29:20
【问题描述】:

我正在研究嵌入到应用程序中的脚本语言。

我一直认为 Lua 是最佳选择,但我最近阅读了一些关于嵌入 V8 的新闻,并正在考虑改用它。

我的问题有两个:

有嵌入 v8(或任何 javascript 引擎)经验的人推荐它吗?

与嵌入 Lua 相比如何?

我喜欢 v8 有一个 c++ 嵌入 API。然而,Lua API 有很多时间来完善(更新并不总是更好等等)。

注意:我不关心哪种语言/库更好或性能更好。我只是问嵌入的难易程度。

【问题讨论】:

  • 您还可以嵌入 Lisp、Python、Java 和大量其他解释语言。
  • @Vlad:是的,我可以,但我已经消除了其中的大部分。 Lisp 应该非常容易嵌入(并从头开始编写)。然而,Lisp 的语法取消了它的资格。 Python 可以嵌入,但从有经验的人那里得到的一般感觉是它比应有的嵌入要困难得多。 Java ...你在捉弄我吗?也许不吧。我什至没有考虑将编译语言用作脚本语言。其他各种解释语言,太小、太小众或携带太多包袱(例如 Ruby 或 Python 的标准库)。
  • 使用 Lua :) 我的意思是,真的,V8 不是你想要嵌入的,除非你将它嵌入到 Chrome 浏览器中。 Yannick 提供了一个不错的网址。
  • FWIW,Python 相对容易嵌入,您可以使用 Cython 轻松公开功能。

标签: javascript c++ scripting lua


【解决方案1】:

HackerNews 最近有一篇关于 Nginx 的作者讨论 V8 作为嵌入式脚本语言的(非)适用性的帖子: http://news.ycombinator.net/item?id=2519674

Lua 肯定更适合一般嵌入目的,而 V8 可能可以以某种方式工作,如果您更喜欢熟悉 Javascript。

【讨论】:

  • 非常有用的链接,但公平地说,这篇文章是关于在网络服务器进程中使用 v8。总结文章,不是多线程,不灵活出或者内存处理,2ms上下文创建太长,只支持常见架构(arm、i386、amd64)。
【解决方案2】:

我建议使用 v8。 Google 倾向于制作漂亮的 API,而且看起来很容易嵌入。

我不会说什么是“更好”的语言,因为这显然是主观的,你说你不想听那个建议。但是我可以说Javascript肯定有很多人知道如何使用它。

【讨论】:

    【解决方案3】:

    我个人嵌入 Lua 的经验是,它非常糟糕。 Lua API 只为 C 设计,它显示了。您可以获得各种包装库,但它们都有自己的问题。

    我没有尝试过 V8,但简要概述似乎认为它具有 RAII 和模板等有用的东西,所以我会投票赞成。

    【讨论】:

    • +1 以获得一些实际经验。我有一些嵌入 Lua 的经验。没什么大不了的,但不仅仅是尝试一下。我没觉得这很可怕。我认为 API 很优雅,但不幸的是非常 C,这使得它非常冗长且容易出错。
    【解决方案4】:

    很遗憾,我没有嵌入 V8 的经验,所以我无法直接回答您的问题,但我发现嵌入 Lua 非常容易。 C api 很冗长,但也非常简单且易于掌握,并且非常有效地管理 Lua 和 C 之间的转换。

    如果 C++ 是您的首选语言,我相信 Lua 也可以像 C++ 一样干净地编译,并且还有 C++ 包装器可供它使用。

    【讨论】:

      【解决方案5】:

      v8 只是 好的。前段时间我尝试将它用作视频游戏的脚本解释器,但结果好坏参半。一方面速度非常快,API简单;但另一方面,它并不能很好地封装解释器的状态。因为代码库中充斥着全局变量,如果您需要在应用程序中间重置 v8,或者从多个线程并行运行它,那么您基本上是不走运的。从 Chrome 的每个 VM 一个进程模型的角度来看,这些设计决策是可以理解的,但是如果集成到您可能希望同时运行多个 VM 的游戏中(例如在游戏服务器后端),或者有一些方法可以快速序列化/重置整个解释器的状态。

      出于这些原因,我实际上建议您尝试再给 Lua 一次机会。作为一种语言,它往往更适合游戏编程任务,而且它还有一些漂亮的功能,使游戏脚本更方便(例如,协程)。

      【讨论】:

      • 调试是什么样的?这在技术上是嵌入的一部分,因为您需要能够从嵌入的语言中调试嵌入式语言。 Lua 有很多不错的钩子,可以让你检查状态、实现断点和各种东西。 V8 能做到这一点吗?
      • Here 是使用 Node-inspector 和 chrome 作为嵌入式 v8 调试器的一个很好的例子。听起来设置起来并不难,虽然我自己没有尝试过。
      【解决方案6】:

      为了反映您的观点:仅仅因为脚本语言陈旧,并不会使其更加精致。否则,请在 C++ 上使用 Cobol/Fortran/Assembly。

      我会选择 v8 而不是 Lua。

      【讨论】:

        【解决方案7】:

        v8 可以操作 JSON。而纯粹的lua不能。但是,lua 有许多库足以自定义您的应用程序。但是 v8 没有库。 v8 仅提供 javascript 引擎。例如,我们不能只用 v8 编写文件。 要使用 v8 编写文件,您应该添加可以从 javascript 访问的 API。 如果您希望轻松实现强大的嵌入,例如网络访问、自动化等,您最好使用 lua。或者,如果您希望美观,请使用 v8。 :)

        对不起,我的英语不好。

        【讨论】:

          【解决方案8】:

          Lua 嵌入起来很简单,但扩展 API 比 V8 低。它是一个基于堆栈的 API,您可以使用一些原语。它同样强大,非常健壮,不会以任何方式限制你,如果你只是想将全局函数导出到语言中,那是不费吹灰之力。但是,将 C++ 对象导出到 Lua 需要您了解 Lua 的元表,并且您可能会发现它一开始非常混乱。 V8 可能会让这更简单。

          如果您想要一个更适合您的 Lua 嵌入 API,可以使用 Luabind 或 ToLua++ 等库。 Lua 不会让你为不用的东西付费。

          个人不会在 Lua 上使用 Javascript。 Javascript 是一门非常好的语言,因为一名工程师在几周内就编写了它,但 Lua 有更多的时间和思想投入其中。它是一个 CS 宝石,充分利用了一小部分精心挑选的概念。它完成了 Javascript 所做的一切,但更好。它具有适当的词法作用域、尾递归、非常强大的元编程工具,可以模拟 Javascript 的基于原型的继承(除其他外)、协程等。它只是一种更清洁、更好的语言。

          我可能会选择 Javascript 而不是它的一个原因是,如果我知道我的听众已经知道 Javascript,但我曾经在 TCL 上做过一次并且后悔了(尽管 JS 远没有 TCL 糟糕;你不能去 那个这里错了)。

          【讨论】:

          • 我不了解 Lua,但我确实觉得有必要指出 JavaScript 现在不仅仅是一位工程师和几个星期的产品。
          • 这是真的,Eric,但由于网络分发的性质,某些缺陷永远不可能得到解决。使用 Lua,作者可以进行重大更改来修复语言缺陷,这在 Lua 的演变过程中经常这样做,因为如果用户不想更新,他们就不必更新。就网络的运作方式而言,如果 JavaScript 做出重大改变,它将破坏数百万个网页。
          • 每次引入新的浏览器时,JS 都会进化。诚然,这通常是通过添加新功能而不是调整或删除旧东西来实现的,但功能确实会被弃用并最终被删除或修改。当需要从根本上改变核心时,浏览器可能会为此目的添加全新的解释器和 JIT,同时保留旧的解释器和 JIT 以实现向后兼容性。每种语言都有值得商榷的设计妥协,但我想不出 JS 中的任何东西我会称之为损坏。
          • 我也想不出任何我会称之为破碎的东西。
          猜你喜欢
          • 2012-04-20
          • 2020-12-19
          • 2011-03-20
          • 2023-01-20
          • 1970-01-01
          • 2014-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多