2013-06-03 26 views
3

这可能是一种基本的但是......在这里。将语言嵌入到另一个语言中是做什么的?

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

我能将Ruby或Lua代码写入cpp文件吗?或者直接调用程序中的脚本?

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

回答

2

因为他们是脚本语言,代码总是会被“解释”。实际上,你不是在程序中“调用”脚本代码,而是当你达到那个点时,你在那个线程的上下文中执行解释器(到达脚​​本部分的线程),然后读取脚本语言并在解释它之后执行适用的机器代码(JIT编译类型,但不是真的,不涉及编译)。

由于这个原因,它与分解解释器并运行脚本基本相同,除非您想从编译的程序中访问已编译程序中的变量/脚本中的变量。为了访问值,因为你使用的是具有已编译程序上下文的线程,所以你应该能够将脚本变量存储在堆栈中,并在线程停止运行解释器时访问它们(假设你存储了变量在堆栈上)。

编辑:回复:

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

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

与好运...

+0

所以我基本上让我的程序既是程序又是解释器?我猜测从这样的设置调用脚本的函数会在脚本语言doc中的某处? – benbot

1

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

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

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

这里的一个优势是,不是随着用户需求的变化一次创造出一种功能的编程语言,而是从一个完整的语言和文档开始。语言设计人员已经为您做出了许多艰难的决定(我怎么表达字符串和数字,列表如何,列出了什么,名称值如何,if是什么样子等等),并且通常还带来了精心设计和调试执行到表格。

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