news 2026/4/15 18:39:28

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在一个可执行程序中执行脚本语言

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

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 技术栈的集成。

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

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

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

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

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

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

作者头像 李华
网站建设 2026/4/10 7:02:54

小程序计算机毕设之基于springboot+微信小程序的公考宝典小程序(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华
网站建设 2026/4/7 19:48:59

丑数不丑——从一个简单定义,看清“有序生成”这件大事

丑数不丑 从一个简单定义,看清“有序生成”这件大事 一、先别急着写代码:什么是丑数? 我们先说一句大白话版定义: 丑数,就是只包含质因子 2、3、5 的正整数。 比如: 1(特殊地,也算) 2、3、4、5、6、8、9、10、12 … 而下面这些就不是: 7(有 7) 14(2 7) 21(3 …

作者头像 李华
网站建设 2026/4/13 10:53:41

轻松入门SpringAI-SpringAI实现RAG

轻松入门 Spring AI RAG&#xff08;Retrieval-Augmented Generation&#xff09;实现 &#xff08;2026年主流实用写法 从最简单到生产可用&#xff09; RAG 是目前使用大模型最常见、最有效的增强方式之一&#xff1a; 让模型“先查资料&#xff0c;再回答”&#xff0c;大…

作者头像 李华