将语言嵌入另一种语言有什么作用?

时间:2013-06-03 13:35:50

标签: c++ scripting lua embedding

这可能是一种基本的但是......在这里。

如果我决定通过链接它的解释器将某种脚本语言(如Lua或Ruby)嵌入到C ++程序中,那么我在C ++中可以做什么呢?

我能将Ruby或Lua代码直接编写到cpp文件中,还是只是从程序中调用脚本?

如果后者是真的,我该怎么做?

2 个答案:

答案 0 :(得分:2)

因为他们是脚本语言,所以代码总是被解释。"实际上,你并没有打电话给#34;你的程序中的脚本代码,但是当你到达那一点时,你在该线程的上下文(到达脚本部分的线程)中执行解释器,然后读取脚本语言并执行适用的机器解释后的代码(JIT编译类型,但不是真的,没有涉及编译)。

因此,它与分叉解析器和运行脚本基本相同,除非您希望从已编译的程序中访问已编译程序/脚本中的变量。要访问/来自的值,因为您正在使用具有已编译程序的上下文的线程,您应该能够将脚本变量存储在堆栈中并在线程停止运行解释器时访问它们(假设您将变量存储在堆栈中)。

编辑:回复:

你必须自己写。这样考虑一下:如果你想在c ++中使用程序集,你可以使用asm关键字。然后在c ++编译器中,需要解析源文件,获取asm关键字,然后切换到汇编编译器。然后汇编编译器需要直到asm区域的结束括号并编译此代码。

如果你想这样做,它会有所不同,因为程序集被编译,而不是解释(这是你想要做的)。您需要做的是更改您正在使用的编译器(比如说c ++),以便识别您自己的用户定义关键字。可以说这个关键字是scriptX {}。您需要更改c ++的解析器,以便在看到它的脚本X {}时,它将所有内容存储在已编译程序的只读数据部分的括号中。然后,您需要在已编译的程序集文件中添加一个挂钩,以将该线程的上下文切换到您的脚本解释器,并在脚本部分的开头(您将其放入目标文件的只读数据部分)中启动程序计数器。

祝你好运...

答案 1 :(得分:1)

将脚本语言嵌入到程序中的一个常见原因是提供了使用最终用户提供的脚本来控制程序的能力。

这种脚本的最简单的例子可能是配置文件。假设您的程序有选项,并且需要记住从运行到运行的选项。您可以将它们作为选项结构的二进制映像写入文件,但这将是脆弱的,不易检查或编辑,并且可能无法跨系统移植。使用某种标签以纯文本形式写出选项,这些标签可解决大部分投诉,但现在您需要解析该文本并恢复选项。然后一些用户想要在星期二使用不同的选项,想要做一个简单的算术来计算另一个选项,或者写一个他们可以在Windows和Linux上使用的配置文件,很快你会发现自己发明了一种语言来表达所有那些想法和机制。在这一点上,有一个更好的方法。

语言LuaTCL都是基于这种情况而发展起来的。较大的系统需要由最终用户配置和控制。最终用户想要编辑一个简单的文本文件并立即获得满足感,甚至(特别是)在处理可能需要数小时才能成功编译的大型系统时。

这里的一个优点是,当用户需求发生变化时,不是一次发明一种编程语言,而是从一个完整的语言及其文档开始。语言设计师已经为您做出了许多艰难的决定(我如何表示字符串和数字,列表如何,命名值如何,if看起来是什么样的等等)并且通常也带来了经过精心设计和调试的实现。

Lua特别容易整合。读取简单的配置文件并从Lua状态中提取设置可以使用其C API的一小部分来完成。一旦你有Lua可用,将它用于其他目的是有吸引力的。在许多情况下,您会发现在C中仅编写最内层循环更有效率,并使用Lua将这些函数粘合在一起并提供应用程序的所有“业务逻辑”。这就是Adobe Lightroom的实现方式,以及从简单的机顶盒到iOS设备甚至PC的平台上的许多游戏。