将一种语言嵌入到另一种语言中有什么作用?
这可能有点基础,不过......开始吧。
如果我决定将一些脚本语言(如Lua或Ruby)嵌入C++程序中,并链接它们的解释器,那么这能让我在C++中做什么呢?
我能在cpp文件中直接编写Ruby或Lua代码,还是只能从程序中调用脚本?
如果后者是正确的,我应该怎么做?
一个常见的把脚本语言嵌入到程序中作为提供由最终用户提供的脚本来控制程序功能的原因。
最简单的例子是配置文件。假设你的程序有一些选项,并且需要记住运行时的选项。你可以按照二进制图像的形式将它们写到文件中,但这将变得脆弱,不易检查和编辑,而且可能在不同的系统之间是不可移植的。用带有某种标签的纯文本编写出该选项就可以解决大部分这些问题,但是现在你需要解析该文本并恢复选项。然后,一些用户想要在星期二时使用不同的选项,想要进行简单的算术运算以从另一个选项中计算一个选项,或者编写一个配置文件,可以在Windows和Linux上使用,很快你会发现自己需要发明一种小语言来表达所有这些想法和机制。此时,有更好的方法。
Lua 和 TCL 两种语言本质上都是由此情况发展而来。大型系统需要由最终用户进行配置和控制。最终用户想要编辑一个简单的文本文件,并立即得到满意的结果,尤其是在使用可能需要数小时才能成功编译的大型系统时。
一个优点是,与其随着用户需求的变化逐渐发明一种编程语言,还不如从一种包含其文档的完整语言开始。语言设计者已为你做出了许多困难的决策(如何表示字符串和数字,列表如何处理,命名值如何处理,if 的样子是什么等),并通常还提供了一个精心设计和经过调试的实现。
Lua 特别容易集成。使用其 C API 的一个小子集可以读取简单的配置文件并从 Lua 状态中提取设置。一旦你有了 Lua,就很容易将其应用于其他目的。在许多情况下,你会发现仅编写 C 中的最内部循环更加有效,使用 Lua 来粘合这些函数并提供应用程序的所有“业务逻辑”。Adobe Lightroom 和 many 游戏都是这样实现的,从简单的机顶盒到 iOS 设备和 PC 平台。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
因为它们是脚本语言,所以代码总是会被“解释”的。实际上,你不是在程序内“调用”脚本代码,而是在你到达那个点时,在那个线程的上下文中执行解释器(到达脚本部分的线程),然后解释脚本语言并执行适用的机器代码(有点像JIT编译,但实际上并没有编译)。
由于这个原因,它基本上与复制解释器并运行脚本的操作相同,除非你希望从编译的程序/脚本中访问变量。要进行值的访问,因为你使用的是具有编译程序上下文的线程,所以你应该能够将脚本变量存储在堆栈上,并在线程停止运行解释器时访问它们(假设你将变量存储在堆栈上)。
编辑:回复:
你必须自己编写。这样想:如果你想在C++中使用汇编语言,你需要使用asm关键字。然后在C++编译器中,需要解析源文件,找到asm关键字,然后切换到汇编编译器。然后汇编编译器需要一直编译代码直到asm区域的结尾括号。
如果你想这样做,会有一些不同,因为汇编语言是编译的,而不是解释的(这是你想要做的)。你需要改变你使用的编译器(比如C ++),使其识别你自己定义的关键字。假设这个关键字是scriptX {}。你需要改变C++的分析器,使它在看到scriptX {}时,将括号之间的所有内容存储在编译程序的只读数据部分中。然后你需要在编译的汇编文件中添加一个钩子,以切换线程的上下文到你的脚本解释器,并从脚本段(放在对象文件的只读数据部分中)的开头开始执行程序计数器。
祝你好运...