为什么我们需要像Lua这样的可嵌入编程语言?

31

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


5
嵌入式语言通常用于终端用户自定义。它们通常非常高级(即动态类型、垃圾回收等),比应用程序所写的语言更易于使用。有时,即使该语言从未被暴露给终端用户,也会这样做,以便内部员工(通常是像设计师这样不太技术性的人)可以在更高的抽象层次上使用高级语言实现应用程序的一部分,或者可以更改可能经常更改的组件而无需重新编译应用程序。 - Mud
1
@Mud 感谢您指出垃圾回收的问题!我在回答中忘记了这个非常重要的点。我会编辑它以整合这个方面。 - Lorenzo Donati support Ukraine
4
你可能比你想象的更熟悉这个。每天,数十亿人使用一种可嵌入的编程语言:JavaScript。它嵌入在他们的 Web 浏览器中。它在网页环境中执行,并被授予对页面的 HTML 文档对象模型和某些浏览器窗口等的访问权限。Lua 也用于编写 Wireshark 中的过滤器。 - Tom Blodget
2个回答

69

由于您将问题标记为“Lua”,我将给您一个基于这种语言环境的答案。

介绍

Lua是用C编写的(几乎完全兼容C89标准;如果需要,可以使用编译时开关轻松禁用不兼容的特性),并且设计成与C代码轻松集成。在Lua的上下文中,“集成”有两个不同但相关的含义:

  1. 您可以轻松编写C代码,此代码可被Lua代码用作库。通过将C代码静态或动态链接到Lua引擎的代码,实现了集成。然后,您可以使用Lua的require函数在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独立解释器可以被视为将Lua嵌入C应用程序的示例!
Lua具有非常自由的开源许可证,即使在商业应用程序中也可以轻松使用。这也允许修改其源代码以适应特殊需求。
小内存占用和易于调整的C源代码使Lua成为在嵌入式系统或小型微型计算机系统(微控制器等)上移植的完美候选人。标准Lua发行版的许多部分可以被剥离,将核心Lua引擎缩小到约100kB的范围内。例如,eLua项目(现在,2023年,似乎不活跃),这是一个专为嵌入式设备设计的修改版Lua发行版。

3
收藏答案以便稍后重新阅读 -- 为努力鼓掌! :) - Archit

8
Lua和其他脚本语言,提供了各种不同的优点,这些优点取决于您的需求。
  • 提供快速迭代开发。
  • 允许运行时代码更改,例如在《魔兽世界》中重新加载 UI,重新加载所有脚本而不停止游戏引擎本身或注销您。
  • 为应用程序提供独特的API,供用户扩展,而不会暴露系统的关键部分给公众。例如,文本编辑器提供宏语言,允许您集成自定义行为,而不会给您完全访问编辑器本身的内部。
使用范围非常广泛,具体取决于开发人员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接