这可能是一种基本的但......这里去。
如果我决定通过链接它的解释器将某种脚本语言(如 Lua 或 Ruby)嵌入到 C++ 程序中,那我可以在 C++ 中做什么呢?
我能否将 Ruby 或 Lua 代码直接写入 cpp 文件,或者只是从程序中调用脚本?
如果后者是真的,我该怎么做?
因为它们是脚本语言,所以代码总是会被“解释”。实际上,您并没有“调用”程序中的脚本代码,而是当您到达该点时,您正在该线程(到达脚本部分的线程)的上下文中执行解释器,然后读取脚本语言并在解释后执行适用的机器代码(JIT 编译类型,但不是真的,不涉及编译)。
因此,它与分叉解释器和运行脚本基本相同,除非您想从已编译程序访问已编译程序/脚本中的变量。要访问/从值,因为您正在使用具有已编译程序上下文的线程,您应该能够将脚本变量存储在堆栈上,并在您的线程停止运行解释器时访问它们(假设您存储了变量在堆栈上)。
编辑:回应:
你必须自己写。这样想:如果你想在 C++ 中使用汇编,你可以使用 asm 关键字。然后在c++编译器中,需要解析源文件,得到asm关键字,然后切换到汇编编译器。然后汇编编译器需要走到 asm 区域的结束括号并编译这段代码。
如果你想这样做,它会有点不同,因为程序集是编译的,而不是解释的(这是你想要做的)。您需要做的是更改您正在使用的编译器(比如说 c++),以便它识别您自己的用户定义的关键字。假设这个关键字是 scriptX{}。您需要更改 c++ 的解析器,以便当它看到 scriptX{} 时,它将括号之间的所有内容存储在已编译程序的只读数据部分中。然后,您需要在已编译的程序集文件中添加一个钩子以将线程的上下文切换到脚本解释器,并在脚本部分的开头启动程序计数器(您将其放入目标文件的只读数据部分) .
祝你好运……
将脚本语言嵌入到程序中的一个常见原因是提供使用最终用户提供的脚本控制程序的能力。
此类脚本的最简单示例可能是配置文件。假设您的程序有选项,并且需要记住从运行到运行的选项。您可以将它们作为选项结构的二进制图像写入文件,但这会很脆弱,不易检查或编辑,并且可能无法跨系统移植。用带有某种标签的纯文本写出选项,这可以解决大多数投诉,但现在您需要解析该文本并恢复选项。然后一些用户在星期二想要不同的选项,想要做简单的算术来计算另一个选项,或者编写一个他们可以在 Windows 和 Linux 上使用的配置文件,很快你就会发现自己发明了一种小语言来表达所有与那些想法和机制。此时,有'
Lua和TCL语言基本上都是从这种情况发展而来的。更大的系统需要由最终用户配置和控制。最终用户希望编辑一个简单的文本文件并立即获得满意,即使(尤其是)在使用可能需要数小时才能成功编译的大型系统时。
这里的一个优点是,与其随着用户需求的变化一次次发明一种编程语言,不如从一门完整的语言及其文档开始。语言设计师已经为您做出了许多艰难的决定(我如何表示字符串和数字,列表如何,命名值如何,if
看起来像什么等等),并且通常还带来了精心设计和调试的实现到桌子上。
Lua 特别容易集成。读取一个简单的配置文件并从 Lua 状态中提取设置可以使用其 C API 的一小部分来完成。一旦你有 Lua 可用,将它用于其他目的是很有吸引力的。在很多情况下,您会发现只用 C 语言编写最里面的循环并使用 Lua 将这些功能粘合在一起并提供应用程序的所有“业务逻辑”会更有效率。这就是 Adobe Lightroom 的实现方式,以及从简单机顶盒到 iOS 设备甚至 PC 等平台上的许多游戏。