如何在一个可执行程序中执行脚本语言

在可执行程序中执行脚本语言通常称为“脚本引擎集成”。常见方式有:

1.使用嵌入式脚本语言库

Lua(最流行的选择)

// C/C++ 中集成 Lua#include<lua.h>#include<lualib.h>#include<lauxlib.h>intmain(){lua_State*L=luaL_newstate();luaL_openlibs(L);// 执行脚本文件if(luaL_dofile(L,"script.lua")){printf("Error: %s\n",lua_tostring(L,-1));}// 执行代码字符串luaL_dostring(L,"print('Hello from Lua!')");lua_close(L);return0;}

Python

// C/C++ 中集成 Python#include<Python.h>intmain(){Py_Initialize();// 执行 Python 代码PyRun_SimpleString("print('Hello from Python!')\n");// 执行脚本文件FILE*fp=fopen("script.py","r");PyRun_SimpleFile(fp,"script.py");Py_Finalize();return0;}

2.JavaScript 引擎集成

V8 (Chrome 的 JavaScript 引擎)

// C++ 集成 V8#include<v8.h>intmain(){v8::Isolate*isolate=v8::Isolate::New();{v8::HandleScopehandle_scope(isolate);v8::Local<v8::Context>context=v8::Context::New(isolate);v8::Context::Scopecontext_scope(context);// 执行 JavaScriptv8::Local<v8::String>source=v8::String::NewFromUtf8(isolate,"'Hello' + ' from JavaScript!'").ToLocalChecked();v8::Local<v8::Script>script=v8::Script::Compile(context,source).ToLocalChecked();v8::Local<v8::Value>result=script->Run(context).ToLocalChecked();}isolate->Dispose();return0;}

QuickJS(轻量级 JS 引擎)

#include<quickjs.h>intmain(){JSRuntime*rt=JS_NewRuntime();JSContext*ctx=JS_NewContext(rt);// 执行 JavaScriptconstchar*code="print('Hello from QuickJS!')";JSValue result=JS_Eval(ctx,code,strlen(code),"<eval>",JS_EVAL_TYPE_GLOBAL);JS_FreeContext(ctx);JS_FreeRuntime(rt);return0;}

3.其他脚本语言

Tcl

#include<tcl.h>intmain(){Tcl_Interp*interp=Tcl_CreateInterp();Tcl_Init(interp);// 执行 Tcl 脚本Tcl_Eval(interp,"puts \"Hello from Tcl!\"");Tcl_DeleteInterp(interp);return0;}

4.实现步骤

基本集成流程:

  1. 初始化引擎- 创建解释器/虚拟机实例
  2. 暴露 API- 将宿主程序的功能暴露给脚本
  3. 执行脚本- 加载并运行脚本代码
  4. 交互数据- 在宿主和脚本间传递数据
  5. 清理资源- 正确释放资源

暴露宿主函数给脚本(以 Lua 为例):

// 宿主函数inthost_add(lua_State*L){inta=luaL_checkinteger(L,1);intb=luaL_checkinteger(L,2);lua_pushinteger(L,a+b);return1;// 返回值数量}intmain(){lua_State*L=luaL_newstate();// 注册函数到全局表lua_register(L,"add",host_add);// 脚本中可以调用 add(10, 20)luaL_dostring(L,"print('Result:', add(10, 20))");lua_close(L);return0;}

5.现代集成框架

ChaiScript(C++ 嵌入式脚本)

#include<chaiscript/chaiscript.hpp>intmain(){chaiscript::ChaiScript chai;// 自动暴露所有可用函数chai.add(chaiscript::fun(&my_function),"my_function");// 执行脚本chai.eval_file("script.chai");return0;}

Python 的 ctypes/cffi(反向调用)

# Python 脚本调用宿主函数importctypes# 加载宿主 DLL/SOhost_lib=ctypes.CDLL('./host_lib.so')# 调用宿主函数result=host_lib.host_function(42)

6.设计考虑因素

  1. 性能需求:Lua、QuickJS 性能较好
  2. 内存占用:Lua < QuickJS < Python
  3. 生态支持:Python > JavaScript > Lua
  4. 安全性:沙箱隔离,限制访问权限
  5. 线程安全:多线程环境下的引擎管理
  6. 错误处理:脚本异常的捕获和处理

7.实际应用示例

// 简单的插件系统示例classScriptEngine{public:virtualvoidExecute(conststd::string&script)=0;virtualvoidRegisterFunction(conststd::string&name,void*func)=0;};// Lua 实现classLuaEngine:publicScriptEngine{lua_State*L;public:LuaEngine(){L=luaL_newstate();luaL_openlibs(L);}~LuaEngine(){lua_close(L);}voidExecute(conststd::string&script)override{luaL_dostring(L,script.c_str());}voidRegisterFunction(conststd::string&name,void*func)override{lua_register(L,name.c_str(),(lua_CFunction)func);}};

选择哪种方案取决于:

  • 应用类型:游戏(常用 Lua)、桌面应用(Python/JS)、嵌入式设备(Lua/QuickJS)
  • 性能要求:实时系统需要轻量级引擎
  • 开发团队技能:熟悉哪种语言
  • 许可证:商业项目的许可证考虑

Lua 通常是游戏和嵌入式系统的首选,Python 适合需要丰富库支持的应用,JavaScript 适合 Web 技术栈的集成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1179499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【课程设计/毕业设计】针对校园环境打造的集点餐、配送、商家管理、用户评价等于一体的线上餐饮服务系统基于springboot+微信小程序的校园外卖直送平台【附源码、数据库、万字文档】

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

强烈安利自考AI论文平台TOP10:选对工具轻松过关

强烈安利自考AI论文平台TOP10&#xff1a;选对工具轻松过关 2026年自考AI论文平台测评&#xff1a;选对工具事半功倍 随着人工智能技术的不断进步&#xff0c;越来越多的自考学生开始借助AI论文平台提升写作效率、优化内容质量。然而&#xff0c;面对市场上种类繁多的工具&…

2026装修公司大揭秘:售后服务哪家强? - 品牌测评鉴赏家

2026装修公司大揭秘:售后服务哪家强?一、装修,售后为何重要? 装修,从来不是一锤子买卖,它更像是一场漫长的陪伴。当装修的喧嚣渐渐平息,我们满心欢喜地搬进新家,而优质的售后服务,能让这份喜悦长久延续,为居…

【计算机毕业设计案例】基于Springboot+Vue+Java的4S店车辆销售预约看车服务管理系统基于springboot的4s店车辆管理系统(程序+文档+讲解+定制)

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

26届信息安全专业/网络安全专业最新选题推荐③(功能点+创新点+难度评估分类)

一、区块链 信息安全&#xff08;8 个&#xff09;1️⃣ 基于区块链的数据完整性保护系统的设计与实现创新点将区块链用于完整性校验而非价值转移对比传统哈希校验 vs 区块链校验强调篡改可发现性功能点&#xff08;PyQt5&#xff09;文件哈希生成&#xff08;SHA-256&#xf…

气球数据集4546张VOC+YOLO格式

气球数据集4546张VOCYOLO格式数据集格式&#xff1a;VOC格式YOLO格式压缩包内含&#xff1a;3个文件夹&#xff0c;分别存储图片、xml、txt文件JPEGImages文件夹中jpg图片总计&#xff1a;4546Annotations文件夹中xml文件总计&#xff1a;4546labels文件夹中txt文件总计&#x…

26届网络空间安全专业和信息对抗专业选题推荐(包含功能点+创新点+难度评估)

按“网络空间安全专业 & 信息对抗专业本科毕设”的培养目标题目推荐选题清单。每个题目都包含&#xff1a;题目&#xff08;可直接用于毕设申报&#xff09;功能点&#xff08;系统层面&#xff0c;PyQt5 可实现&#xff09;创新点&#xff08;本科层级&#xff0c;真实可写…

吐血推荐MBA必用TOP10 AI论文软件:开题报告文献综述全攻略

吐血推荐MBA必用TOP10 AI论文软件&#xff1a;开题报告文献综述全攻略 2026年MBA学术写作工具测评&#xff1a;精准匹配你的研究需求 在MBA学习过程中&#xff0c;论文写作是绕不开的重要环节。无论是开题报告、文献综述还是最终的毕业论文&#xff0c;都需要高效、专业的工具支…

1.18

学习spark数据库

Java计算机毕设之基于Java springboot4s店车辆管理系统车辆预约保养维修基于springboot的4s店车辆管理系统(完整前后端代码+说明文档+LW,调试定制等)

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

基于Regsvr32.exe的渗透测试完整记录

基于Regsvr32.exe的渗透测试完整记录 测试环境配置 攻击端信息 攻击系统&#xff1a;Kali Linux (Metasploit)攻击IP&#xff1a;192.168.1.80监听端口&#xff1a;7777Web服务端口&#xff1a;8080 目标端信息 目标系统&#xff1a;Windows目标IP&#xff1a;192.168.1.30连接…

L2 Intern-S1/InternVL 微调公式识别实践

微调模型的log记录权重合并上传模型 注册modelscope申请api&#xff0c;上传模型meteorshowering/internvltune提交

redis启动连接命令

redis启动连接命令//重新加载systemd配置 sudo systemctl daemon-reload //再次启动redis服务 sudo systemctl start redis //查看服务状态 sudo journalctl -u redis.service -l sudo systemctl status redis.service…

短视频平台如何将16:9照片发成竖版全屏,而不是横板

问题&#xff1a;大家拍的16&#xff1a;9的照片&#xff0c;经常发现发布图片的时候&#xff0c;就变成了横板的&#xff0c;看着很小&#xff0c;丢失了很多细节解决方法&#xff1a;在文件夹中ctrlA全选图片&#xff0c;然后右键选择 向右旋转&#xff0c;然后这时候再发布就…

Teanary 多语言多货币外贸商城系统架构与数据流程图

项目地址:https://gitee.com/teanary/teanary_service 目录系统整体架构 数据流程图订单处理流程 多节点数据同步流程 商品创建流程 支付处理流程 促销计算流程系统整体架构 graph TBsubgraph Frontend["🌐 前端…

小程序毕设项目:基于springboot+微信小程序的公考宝典小程序(源码+文档,讲解、调试运行,定制等)

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

Java毕设项目:基于springboot的4s店车辆管理系统(源码+文档,讲解、调试运行,定制等)

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

基于ssm的鲜花售卖系统-计算机毕业设计源码+LW文档

摘要&#xff1a;随着互联网技术的发展和人们消费习惯的变化&#xff0c;鲜花售卖系统应运而生。本文详细阐述了基于SSM&#xff08;Spring、SpringMVC、MyBatis&#xff09;框架的鲜花售卖系统的研究背景意义、需求分析以及功能设计。该系统旨在满足消费者便捷购买鲜花的需求&…

Stephen Krashen(史蒂芬·克拉申)

这是B站上一个关于美国语言学家 Stephen Krashen&#xff08;史蒂芬克拉申&#xff09; 的视频&#xff0c;以下是核心信息解读&#xff1a; 1. 人物背景 史蒂芬克拉申是全球知名的语言学家、教育研究者&#xff0c;他提出的二语习得理论彻底改变了人们对语言学习的认知。他的…

4种空中飞行物数据集3561张VOC+YOLO(热气球飞艇飞机直升机)

4种空中飞行物数据集3561张VOCYOLO&#xff08;热气球飞艇飞机直升机&#xff09;数据集格式&#xff1a;VOC格式YOLO格式压缩包内含&#xff1a;3个文件夹&#xff0c;分别存储图片、xml、txt文件JPEGImages文件夹中jpg图片总计&#xff1a;3561Annotations文件夹中xml文件总计…