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

问题描述 投票:16回答:2

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

lua programming-languages embed embedded-language
2个回答
45
投票

由于您将问题标记为“Lua”,我将在此语言的上下文中给出答案。

Introduction

Lua是用C语言编写的(几乎完全兼容C89标准;如果需要,可以使用编译时开关轻松禁用不兼容的功能),并且可以轻松地与C代码集成。在Lua的背景下,“整合”意味着两种不同但相关的东西:

  1. 您可以轻松编写可以通过Lua代码用作库的C代码。通过静态或动态地将C代码链接到Lua引擎的代码来实现集成。然后可以使用Lua require函数在Lua代码中引用链接库。
  2. Lua引擎可以很容易地嵌入到C应用程序中,即链接(再次静态或动态地)到C应用程序代码。然后,C应用程序可以使用Lua的C application programming interface (Lua C-API)与Lua代码进行交互。

注意:这可以通过C ++应用程序更加努力地完成。

Advantages of embedding a Lua engine

如果您的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文件作为配置文件,而无需为特定配置文件格式制作临时解析器。因此,如果您无法为此目的使用Lua文件,则无需解析*.properties*.csv*.ini或您选择的其他格式。
  • Lua引擎具有非常小的内存占用(几百kB),具有强大的功能。只需很少的C代码行和一堆Lua文件,您就可以创建一个完整的应用程序,否则需要数千个C代码行。 standard Lua standalone interpreter可以看作是在C应用程序中嵌入Lua的一个例子!
  • Lua有一个very liberal open-source license,即使在商业应用中也可以毫不费力地使用它。这也允许修改its source code以适应特殊需要。
  • 小内存占用和易于调整的C源使Lua成为将其移植到嵌入式系统或小型微机系统(微控制器等)上的理想选择。可以剥离标准Lua分布的许多部分,从而减少~100kB范围内的核心Lua引擎。例如,使用eLua project,这是为嵌入式设备设计的Lua的改进版本。

7
投票

Lua和其他脚本语言提供了各种各样的好处,这些好处取决于您的需求。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.