为啥我们需要像 Lua 这样的嵌入式编程语言?
Posted
技术标签:
【中文标题】为啥我们需要像 Lua 这样的嵌入式编程语言?【英文标题】:Why do we need an embeddable programming language like Lua?为什么我们需要像 Lua 这样的嵌入式编程语言? 【发布时间】:2013-10-11 03:44:34 【问题描述】:使用嵌入式编程语言的典型用例有哪些?我是否正确理解这种语言应该嵌入到某个程序环境中并且应该能够从那里执行?
【问题讨论】:
嵌入式语言通常用于最终用户定制。它们通常是非常高级的(即动态类型、垃圾收集等)并且比编写应用程序的语言更易于使用。有时即使该语言从未打算向最终用户公开,也会这样做,因此内部人员(通常技术含量较低,如设计师)可以在更高抽象级别以更高级别的语言实现应用程序的一部分,或者可以在不重新编译应用程序的情况下更改可能经常更改的组件。 @Mud 感谢您指出垃圾收集的事情!我忘记了答案中非常重要的一点。我将对其进行编辑以整合该方面。 你比你想象的更熟悉这个。每天,数十亿人使用一种可嵌入的编程语言:javascript。它嵌入在他们的网络浏览器中。它在网页环境中执行,并且可以访问页面的 html 文档对象模型,并且可以访问浏览器的窗口等。 Lua 也用于在 Wireshark 中编写过滤器。 【参考方案1】:Lua 和其他脚本语言根据您的需要提供各种好处。
提供快速的开发迭代。 允许运行时代码更改,例如在《魔兽世界》中重新加载您的 UI,这会在不停止游戏引擎本身或将您注销的情况下重新加载所有脚本。 为您的应用程序提供一个独特的 API 供用户扩展,而不会将系统的关键部分暴露给公众。例如文本编辑器提供了一种宏语言,允许您集成自定义行为,而无需让您不受限制地访问编辑器本身的内部。用途非常广泛,取决于开发人员。
【讨论】:
【参考方案2】:由于您将问题标记为“Lua”,因此我将在该语言的上下文中为您提供答案。
简介
Lua 是用 C 语言编写的(几乎完全兼容 C89 标准;如果需要,可以使用编译时开关轻松禁用不兼容的功能),并且设计为易于与 C 代码集成。在 Lua 的上下文中,“集成”意味着两个不同但相关的东西:
您可以轻松编写可被 Lua 代码用作库的 C 代码。集成是通过将 C 代码静态或动态链接到 Lua 引擎的代码来实现的。然后可以使用 Lua require
函数在您的 Lua 代码中引用链接的库。
Lua 引擎可以轻松嵌入到 C 应用程序中,即链接(再次静态或动态)到 C 应用程序代码。然后 C 应用程序可以使用 Lua 的C application programming interface (Lua C-API) 与 Lua 代码交互。
注意:这可以通过更多的努力来完成,也可以使用 C++ 应用程序。
嵌入 Lua 引擎的优势
如果您的 C 应用程序嵌入了很多(如果不是大多数)Lua,则可以将操作委托给 Lua 引擎,即使用 C-API 函数编写的代码,或者更好的是 Lua 代码。 Lua 代码可以作为 C 字符串嵌入到您的 C 代码中,也可以存储为外部 Lua 脚本。
使用 Lua 代码实现部分代码逻辑有几个优点:
Lua 比 C 更简单(不那么棘手)学习和使用,而且它更高级。它支持强大的抽象,例如函数闭包和面向对象(以一种特殊的方式,使用 Lua 表和metamethods)。
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 文件作为配置文件,而无需为特定配置文件制作临时解析器格式。因此,您无需解析 *.properties
、*.csv
、*.ini
或任何其他格式,如果您没有为此目的使用 Lua 文件的选项。
Lua 引擎的内存占用非常小(大约数百 kB),具有强大的功能。只需很少的 C 代码行和一堆 Lua 文件,您就可以创建一个完整的应用程序,否则需要数千行 C 代码行。 standard Lua standalone interpreter 可以看作是在 C 应用程序中嵌入 Lua 的一个例子!
Lua 有一个very liberal open-source license,即使在商业应用程序中也能轻松使用它。这也允许修改its source code 以使其适应特殊需求。
较小的内存占用和易于调整的 C 源代码使 Lua 成为将其移植到嵌入式系统或小型微型计算机系统(微控制器等)的理想选择。可以剥离标准 Lua 发行版的许多部分,从而将核心 Lua 引擎减少到 ~100kB 范围内。以eLua project 为例,它是为嵌入式设备设计的经过修改的 Lua 发行版。
【讨论】:
答案已加入书签,供日后重读——为您的努力鼓掌! :)以上是关于为啥我们需要像 Lua 这样的嵌入式编程语言?的主要内容,如果未能解决你的问题,请参考以下文章