使用可嵌入编程语言的典型用例是什么?我是否正确理解这种语言是否应嵌入到某些程序环境中并且应该能够从那里执行?
答案 0 :(得分:42)
由于您将问题标记为“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 ++应用程序。
如果您的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的修改版本。
答案 1 :(得分:7)
Lua和其他脚本语言提供了各种好处,这取决于您的需求。
用途非常广泛,取决于开发人员。