news 2026/10/28 8:39:05

宿主语言嵌入另一种语言简述

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
宿主语言嵌入另一种语言简述

一种编程语言被嵌入到另一个编程语言中,被嵌入的编程语言执行命令,函数或文件,是在嵌入的编程语言中先创建一个子进程,然后在子进程中执行被嵌入的编程语言的命令,函数或文件吗?

这是一个涉及到设计架构的问题,它触及了两种语言协同工作的核心模式。答案是:不一定,而且最常见、最高效的方式恰恰不是创建子进程,而是在同一个进程内直接执行。

创建子进程是其中一种方式,但更主流、更高效的方式是通过库/API嵌入,让两种语言在同一个进程空间内直接协作。这两种模式的核心区别如下:

特性库/API嵌入模式 (主流)子进程模式
核心机制宿主语言直接链接被嵌入语言的运行时库,在同一进程内创建并管理其虚拟机/解释器。宿主语言通过操作系统API(如fork/exec、CreateProcess)创建一个独立的子进程来运行被嵌入语言的解释器。
数据交换极高效。通过共享内存的直接函数调用和数据结构交换(如Lua的虚拟栈)。低效。必须通过进程间通信,如管道、套接字、共享内存,有序列化/反序列化开销。
执行开销极低。仅有函数调用开销。很高。需要创建进程、加载解释器、上下文切换等系统开销。
控制能力强。宿主可精细控制被嵌入语言的整个生命周期和环境。弱。只能进行黑盒式的输入/输出控制,难以干预内部状态。
典型场景游戏脚本(Lua控制逻辑)、应用扩展(Python插件)、规则引擎。胶水脚本、调用独立工具、环境隔离。

⚙️ 核心工作机制详解

模式一:库/API嵌入(主流,以Lua嵌入C为例)

这是你之前问题中讨论的模式的深化。其核心在于,被嵌入语言(如Lua)的运行时被编译为一个库(如liblua.a或lua.dll)。宿主程序在启动时将其加载到自己的进程内存空间,并在其中初始化一个完整的虚拟机。

工作流程图示:

Lua脚本文件/函数Lua虚拟机 (在宿主进程内)宿主进程 (如C++程序)Lua脚本文件/函数Lua虚拟机 (在宿主进程内)宿主进程 (如C++程序)1. 初始化阶段2. 执行与交互阶段luaL_newstate() 创建状态机luaL_openlibs() 加载标准库lua_pushcfunction() 注册C函数luaL_dofile() 或 lua_pcall()加载并解释执行脚本执行中调用宿主注册的C函数通过虚拟栈传递参数,调用C函数C函数执行完毕,结果压栈脚本执行完毕,控制权返回

关键原理:

  1. 单一进程,两个世界:整个应用程序是一个操作系统进程。Lua虚拟机(lua_State)及其管理的内存、函数都位于该进程的堆内存中。
  2. 虚拟栈通信:如前所述,所有数据交换都通过Lua C API的“虚拟栈”完成,这本质上是进程内部两个模块之间的高效指针传递。
  3. 直接函数调用:当Lua脚本调用一个宿主注册的函数时,CPU只是简单地跳转到宿主进程中该C函数的地址执行,没有任何进程上下文切换。
模式二:子进程模式

这种方式下,宿主程序把被嵌入语言当作一个完全独立的外部程序来调用。

工作流程:宿主程序使用system()、popen()或更底层的fork/exec(POSIX)或CreateProcess(Windows)来启动一个新进程,比如lua解释器,并将脚本文件或命令字符串传递给它。

// C语言使用popen创建子进程执行Lua脚本#include<stdio.h>intmain(){charbuffer[128];// 创建子进程,并建立管道读取其输出FILE*fp=popen("lua script.lua","r");while(fgets(buffer,sizeof(buffer),fp)!=NULL){printf("子进程输出: %s",buffer);}pclose(fp);return0;}

核心原理:这完全是两个独立的进程。它们拥有各自隔离的虚拟内存空间。通信必须通过操作系统提供的IPC机制,数据通常需要被序列化。

📝 各种语言嵌入实例分析

以下是你提到的各种语言嵌入Lua时的典型实现方式,它们绝大多数采用库/API嵌入模式:

宿主语言嵌入方式关键库/技术是否子进程
C/C++直接链接Lua C库Lua C API否(同一进程,库嵌入)
Delphi链接封装好的Pascal库VerySimple Lua (封装Lua C库)否(同一进程,库嵌入)
Python通过C扩展模块python-lua(内部使用Lua C库)否(同一进程,库嵌入)
Java通过JNI调用本地库LuaJ, JNLua否(JVM进程内,通过JNI调用C库)
JavaScript纯JS实现的Lua VMFengari否(同一浏览器JS运行时)
MATLAB调用MEX函数或C库编写MEX文件包装Lua C库否(同一MATLAB进程)
Visual Basic 6通过COM组件将Lua C库封装为ActiveX DLL否(同一进程,COM调用)

唯一可能使用子进程的场景举例:

  • VB/Python/Matlab中快速调用一个独立的Lua脚本工具:如果你只是偶尔需要运行一个完成独立任务的Lua脚本,而不需要频繁数据交换,则可能选择子进程模式。例如,在Python中:
    importsubprocess result=subprocess.run(['lua','process_data.lua','input.txt'],capture_output=True,text=True)print(result.stdout)

💡 总结与选择建议

  1. 追求性能与紧密交互,选“库嵌入”:这是游戏、高性能应用、插件系统的标准做法。它实现了两种语言间的“无缝焊接”。
  2. 追求隔离与简单,选“子进程”:当你需要运行不受信任的代码(安全沙箱),或只是调用一个现成的独立命令行工具时,子进程的隔离性成为了优点。

所以,被嵌入语言的执行,并非一定需要创建子进程。恰恰相反,为了实现高效、深度的融合,在宿主进程内直接通过库和API执行是更根本、更强大的机制。子进程模式只是一种特定情况下,利用操作系统进程隔离特性的简便替代方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 8:51:45

Java计算机毕设之基于Spring Boot的二手车销售管理系统的设计与实现基于Spring Boot与MySQL的二手车销售管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/10/27 8:51:45

微爱帮监狱服刑人员家属实名认证接口

一、基础身份认证// 1. 三要素基础核验 class BasicIdentityAuth {public function verifyIdentity($name, $idCard, $mobile) {// 使用公安三要素接口&#xff08;示例&#xff09;$result $this->callPublicSecurityApi([name > $name,idcard > $idCard,mobile >…

作者头像 李华
网站建设 2026/10/27 8:51:47

Java Executor框架:从接口设计到线程池实战

Java Executor框架深度解析&#xff1a;从接口设计到线程池实战为什么需要Executor框架&#xff1f;在传统的Java多线程编程中&#xff0c;我们通常直接创建和管理Thread对象&#xff0c;这种方式虽然简单直接&#xff0c;但存在明显问题&#xff1a;线程创建和销毁开销大、缺乏…

作者头像 李华
网站建设 2026/10/27 8:51:57

在文章末尾插入相关产品推荐卡片

Miniconda-Python3.10 镜像&#xff1a;构建高效、可复现的 AI 开发环境 在当今 AI 与数据科学项目日益复杂的背景下&#xff0c;一个稳定、轻量且易于管理的开发环境已成为工程师和科研人员的刚需。你是否曾遇到过这样的场景&#xff1a;刚跑通的模型&#xff0c;在同事机器上…

作者头像 李华
网站建设 2026/10/27 8:51:48

无需Anaconda下载大包!轻量Miniconda-Python3.10镜像满足所有AI需求

轻量Miniconda-Python3.10镜像&#xff1a;无需Anaconda也能高效开发AI 在云服务器上跑一个深度学习实验&#xff0c;结果卡在了第一步——下载 Anaconda。500MB 的安装包在带宽有限的环境下缓慢爬行&#xff0c;等它装完&#xff0c;一杯咖啡都凉透了三次。更糟的是&#xff0…

作者头像 李华
网站建设 2026/10/27 8:51:48

专家级内容方向:‘大规模分布式训练中的环境管理挑战’

大规模分布式训练中的环境管理挑战 在今天&#xff0c;一个AI团队最常听到的抱怨是什么&#xff1f;“这个代码在我机器上明明跑得好好的&#xff01;”——一句看似玩笑的话&#xff0c;背后却隐藏着现代深度学习工程中极为真实的痛点&#xff1a;环境不一致导致的实验不可复…

作者头像 李华