24

使用嵌入式编程语言的典型用例是什么?我是否正确理解这种语言应该嵌入到某个程序环境中并且应该能够从那里执行?

4

2 回答 2

58

既然您将问题标记为“Lua”,我将在该语言的上下文中给您一个答案。

介绍

Lua 是用 C 编写的(几乎与 C89 标准完全兼容;如果需要,可以使用编译时开关轻松禁用不兼容的功能),并且被设计为易于与 C 代码集成。在 Lua 的上下文中,“集成”意味着两个不同但相关的事物:

  1. 您可以轻松编写可被 Lua 代码用作库的 C 代码。集成是通过将 C 代码静态或动态链接到 Lua 引擎的代码来实现的。然后可以使用 Luarequire函数在您的 Lua 代码中引用链接库。

  2. Lua 引擎可以很容易地嵌入到 C 应用程序中,即链接(再次静态或动态地)到 C 应用程序代码。然后 C 应用程序可以使用 Lua 的C 应用程序编程接口 (Lua C-API)与 Lua 代码交互。

注意:这也可以通过 C++ 应用程序完成,但需要付出更多的努力。

嵌入 Lua 引擎的优势

如果您的 C 应用程序嵌入了 Lua,即使不是大多数,也可以将许多操作委托给 Lua 引擎,即委托给使用 C-API 函数编写的代码,或者更好的是,委托给 Lua 代码。Lua 代码可以作为 C 字符串嵌入到您的 C 代码中,也可以存储为外部 Lua 脚本。

使用 Lua 代码实现部分代码逻辑有几个优点:

  • Lua 比 C 更简单(不那么棘手)学习和使用,而且它更高级。它支持强大的抽象,例如函数闭包和面向对象(以一种特殊的方式,使用 Lua 表和元方法)。

  • Lua 是一种动态语言:它不需要“离线”编译。您可以修改 Lua 脚本的文本,这就是修改应用程序行为所需的全部内容(无需额外的编译+链接步骤)。这简化了应用程序的开发和调试。

  • Lua 是一种比 C 更安全的语言:很难编写表现出未定义行为的 Lua 代码,正如在 C/C++ 上下文中所预期的那样。如果 Lua 脚本失败,它会“大声”失败。此外,Lua 支持一种异常机制(尽管语法与 C++ 不同),与 C 相比,它可以以更容易的方式实现错误管理。

  • Lua,作为大多数动态语言,是垃圾收集的。这意味着程序员可以避免手动管理动态内存的痛苦,这是在缺乏垃圾收集的语言中导致错误、泄漏、不稳定和安全漏洞的主要原因。

  • Lua 可以“吃自己的狗粮”,即您可以在运行时构建一个字符串(甚至在 Lua 本身中),如果它是有效的 Lua 代码,您的程序可以即时执行它。即使在其他动态语言中,这也是不常见的(它仍然不是 LISP,但它更接近,并且语法更易读)。这使 Lua 脚本能够:

    • 采用强大的基于文本的元编程技术,Lua 代码可以生成其他 Lua 代码并即时执行;

    • 以简单的方式实现领域特定语言(DSL);Lua 代码可以在运行时加载其他经过精心设计的 Lua 代码,以反映使用它的特定问题域(Lua 语法简单,但足够灵活以允许这样的事情);

    • 轻松用作配置语言:您的应用程序(用 C 和 Lua 混合编写)可以使用一些 lua 文件作为配置文件,而无需为特定的配置文件格式制作临时解析器。因此,如果您没有为此目的使用 Lua 文件的选项,则无需解析*.properties*.csv、或任何其他格式。*.ini

  • Lua 引擎的内存占用非常小(大约数百 kB),具有强大的功能。只需很少的 C 代码行和一堆 Lua 文件,您就可以创建一个完整的应用程序,否则需要数千行 C 代码行。标准的Lua 独立解释器可以看作是在 C 应用程序中嵌入 Lua 的一个例子!

  • Lua 有一个非常自由的开源许可证,即使在商业应用程序中也可以毫不费力地使用它。这也允许修改其源代码以使其适应特殊需要。

  • 较小的内存占用和易于调整的 C 源代码使 Lua 成为将其移植到嵌入式系统或小型微型计算机系统(微控制器等)的完美候选者。可以剥离标准 Lua 发行版的许多部分,从而将核心 Lua 引擎减少到 ~100kB 范围内。例如,以eLua 项目为例,它是为嵌入式设备设计的 Lua 修改版。

于 2013-10-04T13:44:28.373 回答
8

Lua 和其他脚本语言根据您的需要提供各种好处。

  • 提供快速的开发迭代。
  • 允许运行时代码更改,例如在《魔兽世界》中重新加载您的 UI,这会重新加载所有脚本,而无需停止游戏引擎本身或将您注销。
  • 为您的应用程序提供一个独特的 API 供用户扩展,而不会将系统的关键部分暴露给公众。例如文本编辑器提供了一种宏语言,允许您集成自定义行为,而无需让您不受限制地访问编辑器本身的内部。

用途非常广泛,取决于开发人员。

于 2013-10-04T12:57:51.683 回答