哪些语言生成字节码,并且可以在C++中加载/执行
What languages generates bytecodes and can be load/executed in C++
我想知道什么语言适合这种情况:
我正在编写一个应用程序(C++),我需要为它添加某种类型的脚本支持,但这种语言必须能够"编译"。
此编译将生成一些人类无法读取的"字节码"。然后我需要能够获得这个字节码,将它加载到C++应用程序中并执行它
必须将c++应用程序函数导出到脚本并调用回脚本函数。
其主要思想是在不接触C++代码的情况下扩展应用程序功能,但用户一定很难阅读这些脚本。
我可以使用什么语言?
也许是Brainfuck?当然很容易找到解释器,而且可读性比一般的机器代码或字节码低得多。
我很乐意推荐ChaiScript,但我们没有内置任何加密或字节码支持。
也就是说,您没有理由不使用任何现有的C++脚本引擎。如果您提供自己的加密和解密函数将脚本输入引擎,ChaiScript、luabind等都可以使用。
据我所知,AngelScript是一个支持c++和字节码的脚本引擎,而且相对来说比较晦涩。它们有一个关于加载预编译的字节码的页面。
也许Vox*能满足您的需求?
脚本可以预先编译成可移植的字节码,并且非常容易嵌入,使用类似于Lua:的基于堆栈的API
// most basic embedding example
VoxVM* v = vox_open(1024);
vox_aux_seterrorhandlers(v);
vox_pushroottable();
vox_dofile(v, "somescript.vx", false, true);
vox_pop(v, 1);
vox_close(v);
有关更完整的示例,请参阅etc/minimal.cpp和src/frontend/frontend.cpp
*Vox是一个项目,我一直致力于取代Lua的个人目的。它基于squirrel3的VM的高度修改版本(但不再与松鼠兼容!)。
语法也发生了一些变化:它没有对新插槽使用<-
,而是使用:=
,以避免语法混乱。
Core已经完成,可以在嵌入式项目中使用,但stdlib仍然没有完成,因为Vox是一个非常年轻的项目(因此,目前缺乏文档,但stdib是嵌入式编程的一个很好的例子,也是通用脚本的例子)。
我建议您使用LLVM。LLVM的中间表示可以以字节码格式存储。您需要为脚本语言使用现有的前端,或者开发自己的前端。您的C++应用程序可以加载字节码文件并对其进行JIT。以下是基于LLVM的现有项目列表。你可能会找到一个适合你需求的解决方案。
LuaJIT是一个很好的、快速的Lua解释器,它将Lua集成到本机代码中。与常规Lua不同,LuaJIT字节码是独立于平台的。
自己看看:http://luajit.org/luajit.htmlhttp://luajit.org/extensions.html
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- Python ctypes:不会按预期加载 dll
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 保存/加载大量短数组到二进制文件
- 使用 SDL2 和SDL_image C++加载图像
- 无法使用加载库卸载注入的 dll (C++)
- 是否有原子加载非原子值的函数?
- 将 bmp 文件加载到 TSpeedButton 中
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常