当前位置: 首页 > news >正文

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

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

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.jsqmd.com/news/264034/

相关文章:

  • 【课程设计/毕业设计】针对校园环境打造的集点餐、配送、商家管理、用户评价等于一体的线上餐饮服务系统基于springboot+微信小程序的校园外卖直送平台【附源码、数据库、万字文档】
  • 强烈安利自考AI论文平台TOP10:选对工具轻松过关
  • 2026装修公司大揭秘:售后服务哪家强? - 品牌测评鉴赏家
  • 【计算机毕业设计案例】基于Springboot+Vue+Java的4S店车辆销售预约看车服务管理系统基于springboot的4s店车辆管理系统(程序+文档+讲解+定制)
  • 26届信息安全专业/网络安全专业最新选题推荐③(功能点+创新点+难度评估分类)
  • 气球数据集4546张VOC+YOLO格式
  • 26届网络空间安全专业和信息对抗专业选题推荐(包含功能点+创新点+难度评估)
  • 吐血推荐MBA必用TOP10 AI论文软件:开题报告文献综述全攻略
  • 1.18
  • Java计算机毕设之基于Java springboot4s店车辆管理系统车辆预约保养维修基于springboot的4s店车辆管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 基于Regsvr32.exe的渗透测试完整记录
  • L2 Intern-S1/InternVL 微调公式识别实践
  • redis启动连接命令
  • 短视频平台如何将16:9照片发成竖版全屏,而不是横板
  • Teanary 多语言多货币外贸商城系统架构与数据流程图
  • 小程序毕设项目:基于springboot+微信小程序的公考宝典小程序(源码+文档,讲解、调试运行,定制等)
  • Java毕设项目:基于springboot的4s店车辆管理系统(源码+文档,讲解、调试运行,定制等)
  • 基于ssm的鲜花售卖系统-计算机毕业设计源码+LW文档
  • Stephen Krashen(史蒂芬·克拉申)
  • 2026年目前诚信的双相钢法兰直销厂家哪家权威,高温合金法兰/不锈钢法兰/法兰/非标法兰,双相钢法兰直销厂家排行 - 品牌推荐师
  • 4种空中飞行物数据集3561张VOC+YOLO(热气球飞艇飞机直升机)
  • 共同探索的价值
  • 空中飞行物检测数据集2895张yolo数据集
  • 计算机小程序毕设实战-基于springboot+微信小程序的公考宝典小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 四叶草PDF阅读器(无广告免费PDF阅读器)
  • FreeRTOS学习笔记(9)
  • 【毕业设计】基于springboot的4s店车辆管理系统(源码+文档+远程调试,全bao定制等)
  • 小程序毕设选题推荐:基于SpringBoot+微信小程序高考考试刷题系统基于springboot+微信小程序的公考宝典小程序【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 为什么手机越用越卡?原来是这 3 个地方在拖后腿
  • 一文搞懂AI核心:预训练、微调与LLaMA-Factory Online高效实践